# uniapp-vue3-template
**Repository Path**: ouyang/uniapp-vue3-template
## Basic Information
- **Project Name**: uniapp-vue3-template
- **Description**: 使用uniapp+vite+vue3+uview-plus3.0 搭建的搭建的适合团队协作的快速开发模版
- **Primary Language**: TypeScript
- **License**: MIT
- **Default Branch**: main
- **Homepage**: https://icnpath.com/uniapp-vue3-template/
- **GVP Project**: No
## Statistics
- **Stars**: 10
- **Forks**: 5
- **Created**: 2024-11-30
- **Last Updated**: 2025-12-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ✨ uni-app 团队协作开发实践模板 (Vue3)
[](https://github.com/oyjt/uniapp-vue3-template)
[](https://github.com/oyjt/uniapp-vue3-template)
[](https://github.com/oyjt/uniapp-vue3-template)
[](https://github.com/oyjt/uniapp-vue3-template)
[](https://github.com/oyjt/uniapp-vue3-template)
[](https://github.com/oyjt/uniapp-vue3-template)
使用 **uni-app + vite + vue3 + typeScript + uview-plus + UnoCSS** 搭建的适合**团队协作**的快速开发模版。本项目集众多优秀项目的优点,旨在打造最适合团队协作开发的高效脚手架。
| 技术栈 | 描述 |
| --- | ----- |
|框架/构建 | Uni-app, Vue 3, Vite, TypeScript|
|UI 库 | Uview-plus (默认) / Wot-design-uni / Shadcn-ui (分支)|
|样式 | UnoCSS, StyleLint, EditorConfig|
|状态管理 | Pinia |
|网络请求 | Luch-request(默认) / Axios (分支) / Alova (分支)|
|代码规范 | ESLint, StyleLint, Git Hooks (Commit 校验)|
## 🔗 链接与文档
- 国内仓库地址 (Gitee):[https://gitee.com/ouyang/uniapp-vue3-template](https://gitee.com/ouyang/uniapp-vue3-template)
- 在线预览地址:[https://oyjt.github.io/uniapp-vue3-template/](https://oyjt.github.io/uniapp-vue3-template/)
- Uview-plus 官方文档:[https://uiadmin.net/uview-plus/](https://uiadmin.net/uview-plus/)
- UniApp 插件精选: [https://github.com/oyjt/awesome-uniapp](https://github.com/oyjt/awesome-uniapp)
## 🚀 项目核心特性
#### 📦 开发与工程化
- [x] **技术栈:** TypeScript 全面支持。
- [x] **构建优化:** 支持多环境打包构建 (`dev`, `test`, `prod`)。
- [x] **模块化:** 支持路径别名 (`@/`)、组件和 API **自动加载**。
- [x] **代码规范:** 集成 ESLint、StyleLint、EditorConfig,自动校验 Git 提交代码格式。
- [x] **AI 支持:** 更好地适配 `cursor` 和 `trae` 规则,集成 `MCP` 插件。
- [x] **包体积分析:** 集成包体积视图分析插件 (`rollup-plugin-visualizer`)。
- [x] **无 TS 版本:** 查看 `base-js` 分支
- [x] **自动化构建:** 支持微信小程序自动化构建(preview / upload)
#### 🎨 UI 与样式
- [x] **UI 库:** 集成 `uview-plus 3.0` (默认)。
- *分支支持:* Wot-design-uni (查看 `feature/wot-design-uni` 分支)。
- *分支支持:* Shadcn-ui (查看 `feature/shadcn-ui` 分支)。
- [x] **原子化 CSS:** 集成 `UnoCSS`,支持快速样式开发。
- [x] **图标库:** 集成 `Iconify` 图标库。
#### 🌐 业务功能与优化
- [x] **状态管理:** 使用 `Pinia`。
- [x] **网络请求:** 封装网络请求(支持 TypeScript),支持 **Token 无感刷新**。
- 分支支持: Alova (`feature/alova` 分支) / Axios (`feature/axios` 分支)。
- [x] **权限控制:** 添加页面跳转拦截,实现 登录权限校验。
- [x] **分包策略:** 支持项目分包,优化加载速度。
- [x] **组件优化:** 集成 `z-paging` 下拉刷新/上拉加载功能。
- [x] **国际化:** 支持多语言 (i18n)。
- [x] **小程序特定:** 集成小程序隐私协议授权组件。
#### 🖼️ 资源处理优化
- [x] **图片优化:** 项目构建时,**自动删除本地图片并替换本地路径为线上 CDN 路径** (需配置)。
## 📁 目录结构概览
清晰的目录结构是团队协作的基础。本项目采用目前主流的技术方案。
```
uniapp-vue3-project/
├── build/ # Vite 配置和插件统一管理
├── env/ # 环境变量配置
├── scripts/ # 自动化脚本 (如 Git Commit 校验, 小程序 CI/CD)
├── src/
│ ├── api/ # 接口管理 (按模块划分, 包含类型定义)
│ ├── components/ # 公共组件
│ ├── hooks/ # 常用自定义 Hooks 封装
│ ├── locale/ # 国际化语言资源
│ ├── pages/ # 页面管理 (主包与分包)
│ ├── plugins/ # uni-app 插件初始化
│ ├── router/ # 路由管理
│ ├── static/ # 静态资源 (图片, 字体等)
│ ├── store/ # Pinia 状态管理 (按模块划分)
│ ├── utils/ # 工具函数 (请求、鉴权、弹窗等)
│ ├── App.vue
│ ├── main.ts
│ ├── manifest.json # 项目配置
│ ├── pages.json # 页面配置 (路由、分包、TabBar)
│ └── uni.scss # 全局 scss 变量
└── types/ # 全局 TypeScript 类型文件 (包含自动生成的文件)
```
#### 🔧 Vite 插件管理
```
build
├ config vite配置
│ ├ index.ts 入口文件
│ └ proxy.ts 跨域代理配置
└ plugins vite插件
├ autoImport.ts 自动导入api
├ cleanImage.ts 自动清理图片文件
├ component.ts 自动导入组件
├ index.ts 入口文件
├ replaceUrl.ts 自动替换图片地址为CDN地址
├ unocss.ts unocss配置
└ visualizer.ts 包体积视图分析
```
#### 🧩 API 管理结构
```
api
├ common 通用api
│ ├ index.ts
│ └ types.ts
├ user 用户相关api
│ ├ index.ts
│ └ types.ts
└ index.ts 入口文件
```
#### 🔗 Hooks 管理
```
hooks
├ use-clipboard 剪切板
│ └ index.ts
├ use-loading loading
│ └ index.ts
├ use-modal 模态框
│ └ index.ts
├ use-permission 校验权限
│ └ index.ts
├ use-share 分享
│ └ index.ts
└ index.ts 入口文件
```
#### 📁 页面结构
```
pages
├ common 公共页面(分包common)
│ ├ login
│ │ └ index.vue
│ └ webview
│ └ index.vue
└ tab 主页面(主包)
├ home
│ └ index.vue
├ list
│ └ index.vue
└ user
└ index.vue
```
#### 📦 状态管理(Pinia)
```
store
├ modules
│ ├ app app状态
│ │ ├ index.ts
│ │ └ types.ts
│ └ user 用户状态
│ ├ index.ts
│ └ types.ts
└ index.ts 入口文件
```
#### 🔧 工具类(utils)
```
utils
├ auth token相关方法
│ └ index.ts
├ common 通用方法
│ └ index.ts
├ modals 弹窗相关方法
│ └ index.ts
├ request 网络请求相关方法
│ ├ index.ts
│ ├ interceptors.ts
│ ├ status.ts
│ └ types.ts
└ index.ts 入口文件
```
## 🛠️ 使用方法
#### 1. 项目启动
推荐使用 `pnpm` 作为包管理工具。
```bash
# 安装依赖
pnpm install
# 启动H5
pnpm dev:h5
# 启动微信小程序
pnpm dev:mp-weixin
```
#### 2. 项目发布(构建)
```bash
# 构建开发环境 (H5 / 小程序)
pnpm build:h5
pnpm build:mp-weixin
# 构建测试环境 (H5 / 小程序)
pnpm build:h5-test
pnpm build:mp-weixin-test
# 构建生产环境 (H5 / 小程序)
pnpm build:h5-prod
pnpm build:mp-weixin-prod
```
#### 3. 代码提交规范
本项目集成 `cz-git`,通过交互式命令行提交代码。
```bash
# 引导式代码提交
pnpm cz
```
#### 4. 更新 uni-app 版本
使用 UVM (uni-app version manager) 统一管理依赖版本。
```bash
# 更新 uni-app 相关依赖到最新正式版
pnpx @dcloudio/uvm@latest
# 或使用简化命令
pnpm uvm
# 升级完成后,清理可能产生的冗余依赖,减小包体积
pnpm uvm-rm
```
#### 5. 同步最新代码
1. 在自己的仓库里面新增开源仓库地址
```bash
git remote add upstream https://github.com/oyjt/uniapp-vue3-template
```
2. 从开源仓库拉取最新代码
```bash
git fetch upstream
```
3. 合并更新,拉取开源项目更新代码
```bash
# 切换到本地 main 分支
git checkout main
# 合并更新
git merge upstream/main
```
4. 代码有冲突时,解决冲突,解决完冲突后提交代码即可
## ⚡ 页面模板代码块(VSCode Snippet)
在 `vue` 文件中,输入 `v3` 按 `tab` 即可快速生成页面模板,可以加快页面生成。
> 原理:基于 VSCode 代码块生成。
## 🔑 核心功能指南
#### 1. 登录鉴权 (路由拦截)
##### A. 普通页面鉴权
在 `pages.json` 中,通过在目标页面的配置对象中设置 `needLogin: true` 来启用鉴权。
```json
{
"pages": [
{
"path": "pages/test/test",
"needLogin": true, // <-- 开启鉴权
"style": {
"navigationBarTitleText": ""
}
}
]
}
```
##### B. TabBar 页面鉴权(小程序平台兼容)
在微信小程序中,点击 `TabBar` 不会触发 `uni.switchTab`,因此常规的路由拦截会失效。解决方案是在 `TabBar` 页面的生命周期 `onShow` 中手动进行权限校验。
> 拦截uni.switchTab本身没有问题。但是在微信小程序端点击tabbar的底层逻辑并不是触发uni.switchTab。所以误认为拦截无效,此类场景的解决方案是在tabbar页面的页面生命周期onShow中处理。
- 参考文件: `pages/tab/user/index.vue`
- 核心实现:
```ts
```
#### 2. 资源处理(本地图片转 CDN)
为了优化小程序/App 包体积,本项目提供了在构建时自动清理本地图片并替换为线上 CDN 地址的功能。
- **默认状态:** 默认不开启。
- **开启方法:** 在 `build/vite/plugins/index.ts` 文件中,移除 `vite-plugin-clean-build` 和 `vite-plugin-replace-image-url` 相关的注释。
**⚠️ 规范要求:图片必须使用绝对路径引入**
为确保插件替换生效,所有图片资源必须通过 **JS 模块化导入**或使用 `@/static` 绝对路径引入。
示例一:模板中绑定的图片
```html
...
```
示例二:CSS 中的图片使用
```scss
```
## 🤖 微信小程序自动化构建 (CI/CD)
本项目提供基于 `miniprogram-ci` 工具的 `Node.js` 脚本 (`scripts/mini-ci.js`),用于自动化**预览 (preview)** 和**上传 (upload)** 微信小程序代码。
#### 1. 编译前置要求
在执行自动化脚本前,必须先完成 uni-app 的编译流程:
```bash
pnpm build:mp-weixin # 生成产物目录:dist/build/mp-weixin
```
#### 2. 授权配置(AppID & 私钥)
脚本需要小程序的 AppID 和私钥文件。**强烈建议在 CI/CD 环境中使用环境变量传入**,以确保安全。
| 方式 | 变量名 | 描述 |
| --- | ---- | ----- |
| 推荐 (CI/CD) | `MINI_APPID` | 小程序 AppID。 |
| 推荐 (CI/CD) | `MINI_PRIVATE_KEY` | 开发者私钥文件(`private..key`)的内容。**注意:需替换所有换行符 `\n`** 。 |
| 回退 (本地) | 文件查找 | 脚本会在 `scripts/` 目录下查找私钥文件。**不推荐提交到 Git 仓库**。 |
#### 3. 脚本执行命令
命令格式:`pnpm [env]`
##### 💡 预览 (Preview) - 生成二维码
```bash
# 预览开发环境 (dev)
pnpm preview
# 预览测试环境 (test)
pnpm preview test
```
- **输出:** 产物目录下会生成 `preview-.png` (二维码图片) 和 `preview-.html` (浏览器查看页)。
##### ⬆️ 上传 (Upload) - 到体验版
```bash
# 上传开发环境代码到体验版
pnpm upload
# 上传生产环境代码到体验版
pnpm upload prod
```
- **版本号/描述:**
- **版本号 (`version`):** 来源于 `package.json` 中的 `version` 字段 (`x.y.z`)。
- **描述信息 (`desc`):** 包含 `[环境] + package.json 版本 + 日期 + Git Commit Short Hash`。
## ❌ 常见问题 (FAQ)
#### 1. 关于包体积分析不准确?
微信开发者工具内置的打包分析不准确。本项目已集成 `rollup-plugin-visualizer`,如需使用,请在 Vite 配置中移除相关注释。
#### 2. 构建小程序时出现 Babel 错误?
错误信息:` This @babel/plugin-proposal-private-property-in-object version is not meant to be imported.`
**解决办法:** 升级微信开发者工具版本,或手动安装缺失的依赖:`pnpm install @babel/plugin-proposal-private-property-in-object`。
#### 3. Shadcn-ui 分支说明
`feature/shadcn-ui` 分支采用最新的 `tailwindcss v4.1`,Unocss 对其支持可能不够完善。**Shadcn-ui 不太适合移动端**,如不需要可切换回主分支或移除相关配置。
### ❤️ 捐赠支持
如果这个项目帮助了你,可以请作者喝饮料🍹