从零构建Monorepo-uniapp全栈开发模板:Vue3+TS+Vite实战解析

从零构建Monorepo-uniapp全栈开发模板:Vue3+TS+Vite实战解析 1. 为什么选择Monorepo架构开发uniapp项目第一次接触Monorepo这个概念是在2019年参与一个大型前端项目重构时。当时项目里有十几个独立仓库每次跨项目修改都要在多个仓库间反复切换依赖管理更是噩梦。后来尝试用Monorepo架构重构后开发效率直接提升了40%。这也是为什么我现在开发uniapp项目时会优先考虑Monorepo方案。Monorepo单一代码仓库最大的优势在于代码复用和依赖管理。想象一下你同时开发小程序、H5和App版本如果每个平台一个仓库光是同步三个项目的公共组件就要花费大量时间。而Monorepo架构下所有平台共享同一套核心代码修改一处即可同步更新所有平台。实际项目中我遇到过这样的场景客户要求在三个平台同时增加一个分享功能。传统多仓库模式下我需要在小程序仓库开发分享组件复制代码到H5仓库适配再复制到App仓库调整 整个过程至少需要2天。而使用Monorepo后在shared目录开发核心分享逻辑在各平台目录写少量适配代码半天完成全平台适配技术选型方面我选择了这些工具组合Vite比Webpack快得多的构建工具HMR更新速度肉眼可见Vue3TS组合式API开发体验极佳类型安全减少低级错误Pinia比Vuex更简单的状态管理完美支持TypeScriptUnocss原子化CSS工具写样式效率提升50%以上2. 从零搭建Monorepo-uniapp项目骨架2.1 初始化项目结构先来看最终的项目目录结构精简版monorepo-uniapp/ ├── packages/ │ ├── app/ # 主应用 │ ├── h5/ # H5端 │ ├── mp-weixin/ # 微信小程序 │ └── shared/ # 共享代码 ├── package.json └── pnpm-workspace.yaml关键步骤分解使用pnpm初始化项目npm/yarn也可以但pnpm的workspace功能最完善mkdir monorepo-uniapp cd monorepo-uniapp pnpm init创建pnpm-workspace.yaml定义工作区packages: - packages/*安装全局依赖所有子包共享pnpm add -Dw vite uniapp vue3 typescript创建子包以微信小程序为例mkdir -p packages/mp-weixin/src cd packages/mp-weixin pnpm init2.2 配置Viteuniappuniapp官方提供了Vite插件但需要额外配置安装必要依赖pnpm add -D dcloudio/uni-app vite-plugin-uni基础vite.config.ts配置import { defineConfig } from vite import uni from dcloudio/vite-plugin-uni export default defineConfig({ plugins: [uni()], resolve: { alias: { : path.resolve(__dirname, src), shared: path.resolve(__dirname, ../../shared) } } })解决小程序平台特有的路径问题// 在vite.config.ts中添加 build: { assetsInlineLimit: 4096, // 小程序需要更小的base64阈值 cssTarget: [chrome53] // 兼容小程序环境 }3. 核心功能模块实现3.1 状态管理方案选型在多个uniapp项目中尝试过Vuex和Pinia后我最终选择了Pinia原因有三TypeScript支持完美自动推导类型不需要额外定义类型API更简洁去掉了mutation概念只有state/getters/actions模块化天然支持每个store都是自动按需加载的共享store的实现示例// packages/shared/stores/user.ts import { defineStore } from pinia export const useUserStore defineStore(user, { state: () ({ token: , profile: null }), actions: { async login(account: string, password: string) { // 统一登录逻辑 } } })各平台使用时直接引入即可import { useUserStore } from shared/stores/user3.2 跨平台样式解决方案样式管理是跨平台开发的老大难问题我的方案是基础样式使用Unocss原子化工具pnpm add -D unocss unocss/preset-uno平台适配通过条件编译解决差异/* 所有平台通用样式 */ .text-primary { color: var(--primary); } /* #ifdef MP-WEIXIN */ /* 微信小程序特有样式 */ .text-primary { font-size: 16px; } /* #endif */主题管理通过CSS变量实现// 在shared/styles/theme.ts中定义 export const lightTheme { --primary: #1890ff, --bg-color: #ffffff }4. 开发效率提升技巧4.1 自动化代码生成我开发了几个VS Code代码片段来提升效率创建页面模板{ Uniapp Page: { prefix: uniapp-page, body: [ template, view class\container\, text$1/text, /view, /template, , script setup lang\ts\, // 业务逻辑, /script, , style lang\scss\ scoped, .container { padding: 20rpx; }, /style ] } }创建组件模板{ Uniapp Component: { prefix: uniapp-comp, body: [ template, view class\$2\, slot /, /view, /template, , script setup lang\ts\, defineProps{, // props定义, }(), /script ] } }4.2 调试技巧uniapp开发中最头疼的就是调试我的经验是H5端直接使用Chrome开发者工具小程序端开启vConsole在main.ts中添加uni.loadSubpackage({ name: vconsole, success: () { import(/utils/vconsole) } })使用自定义日志工具const logger { log: (...args) __DEV__ console.log([LOG], ...args), error: (...args) console.error([ERROR], ...args) }性能优化使用vite-plugin-inspect分析构建产物配置splitChunks优化分包加载build: { rollupOptions: { output: { manualChunks: { vendor: [vue, pinia, axios] } } } }5. 项目优化与部署5.1 编译速度优化经过多次测试我发现这些配置能显著提升构建速度缓存策略// vite.config.ts export default defineConfig({ cacheDir: node_modules/.vite, optimizeDeps: { include: [vue, pinia], force: false // 不要每次都强制预构建 } })多进程编译pnpm add -D vite-plugin-workerimport { worker } from vite-plugin-worker plugins: [ worker({ enableBuild: true, plugins: [uni()] }) ]5.2 部署方案不同平台的部署策略H5部署使用vite-plugin-compression生成gzip文件配置nginx开启Brotli压缩小程序部署配置CI自动上传体验版# .github/workflows/deploy.yml steps: - uses: actions/checkoutv3 - run: pnpm install - run: pnpm build:mp-weixin - uses: wechat-miniprogram/miniprogram-ci-actionv1 with: appid: ${{ secrets.APPID }} privateKey: ${{ secrets.PRIVATE_KEY }} version: ${{ github.sha }} desc: CI自动部署App部署使用uni-app的云打包功能配置自动递增版本号脚本#!/bin/bash version$(date %Y%m%d%H%M) sed -i s/version\: \.*\/version\: \$version\/ package.json6. 常见问题解决方案在实际开发中踩过不少坑这里分享几个典型问题的解决方法uniapp与Vue3兼容性问题问题现象使用script setup时部分生命周期不触发解决方案显式导入生命周期钩子import { onLoad } from dcloudio/uni-app onLoad(() { // 页面加载逻辑 })TypeScript类型报错问题现象uniapp API没有类型提示解决方案安装官方类型声明pnpm add -D types/uni-app dcloudio/types然后在tsconfig.json中添加{ compilerOptions: { types: [dcloudio/types, types/uni-app] } }小程序分包加载失败问题现象分包资源404解决方案配置正确的publicPath// vite.config.ts build: { assetsDir: static, publicPath: / }Unocss样式不生效问题现象小程序平台样式丢失解决方案使用unocss-preset-weapp预设// uno.config.ts import presetWeapp from unocss-preset-weapp export default defineConfig({ presets: [ presetWeapp() ] })Pinia持久化存储问题现象页面刷新后状态丢失解决方案使用pinia-plugin-persistedstate// stores/index.ts import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstate const pinia createPinia() pinia.use(piniaPluginPersistedstate)在最近的一个电商项目中这套架构帮助团队在3周内同时完成了小程序、H5和App三端的开发代码复用率达到75%比预期工期缩短了40%。特别是在后期需求变更时只需要修改shared目录下的核心逻辑就能同步更新所有平台大大减少了维护成本。