# tuanwei-uniapp 团员管理系统移动端(uni-app + Vue 3)。**本仓库是标准 uni-app Vite CLI 工程:命令行即可构建,不需要 HBuilderX。** ## 环境要求 | 依赖 | 实测版本 | 说明 | | --- | --- | --- | | Node.js | v22.23.3 | 构建用 | | pnpm | v12.11.2 | **唯一包管理器**,不要用 npm / yarn | | 微信开发者工具 | — | 只用来预览产物,不参与构建 | npm 源使用官方 `registry.npmjs.org`。 ## 快速开始 三条命令都在**仓库根目录**执行: ```bash # 1. 安装依赖 pnpm install # 2. 日常开发:watch 构建,不退出;产物持续写入 dist/dev/mp-weixin pnpm dev:mp-weixin # 3. 发布构建:一次性产出静态快照到 dist/build/mp-weixin pnpm build:mp-weixin ``` `package.json` 里只有四条 scripts:`dev:h5` / `build:h5` / `dev:mp-weixin` / `build:mp-weixin`。 **`mp-weixin` 是本仓库唯一承诺的平台**;h5 两条只是顺带保留,不作保证。 ## 产物路径与微信开发者工具的导入目录 | 命令 | 产物目录 | 什么时候用 | | --- | --- | --- | | `pnpm dev:mp-weixin` | `dist/dev/mp-weixin` | 日常开发:改源码自动重编译 | | `pnpm build:mp-weixin` | `dist/build/mp-weixin` | 发布 / 上传前:一次性静态构建 | 产物路径由 uni CLI 固定为 `dist//<平台>`,`dist/` 已在 `.gitignore` 中,不会进版本库。 **微信开发者工具 → 「导入项目」→ 目录选 `dist/dev/mp-weixin`(开发)或 `dist/build/mp-weixin`(发布构建)。** - 要导入的是**产物目录本身**,也就是 `app.json`、`project.config.json` 所在的那一层; 不要再往外选到仓库根目录,也不要再往里选一层。 - **appid 不用手填**:`project.config.json` 由编译器生成,appid 取自 `src/manifest.json` 的 `mp-weixin.appid`(`wxf7ee9cd5801bf7a6`),项目名取自 `manifest.json` 的 `name`。 - 开发时先起 `pnpm dev:mp-weixin`(它进入 watch、不退出),再导入 `dist/dev/mp-weixin`。 ## 目录结构 ``` . ├── index.html # H5 入口(仅 h5 构建使用) ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml # pnpm 12 的 allowBuilds 白名单,见「常见问题」 ├── shims-uni.d.ts ├── vite.config.js ├── src/ # uni-app 源码根(官方 src/ 布局) │ ├── App.vue main.js manifest.json pages.json uni.scss │ ├── pages/ packageMine/ components/ utils/ static/ uni_modules/ │ └── uni.promisify.adaptor.js └── dist/ # 构建产物(git 忽略) ``` `@/` 别名指向 `src/`。**不要把源码挪回仓库根目录**:`vite.config.js` 的 `root` / `build.outDir` 是 uni-app 官方明确不支持的,`UNI_INPUT_DIR` 是文档不背书的源码后门 —— 官方 `src/` 布局是唯一受支持的形状。 ## 为什么不再需要 HBuilderX 改造前这是 HBuilderX 可视化工程:构建只能在 IDE 里点菜单完成,命令行里没有等价入口, **无法在 CI、脚本或别人机器上复现构建结果**。现在整个构建流程就是 `pnpm install` + `pnpm build:mp-weixin`, 退出码 0、产物在 `dist/build/mp-weixin`,任何人在命令行都能复现。 改造的背景、布局 / 版本 / 包管理器的取舍、以及「绝不用 `@dcloudio` 的 `latest` tag」这条硬约束, 记录在工作区仓库(本仓库之外)的 `docs/adr/0009-uniapp-built-by-cli-not-hbuilderx.md`。 `.gitignore` 里保留的 `.hbuilderx/` 与 `unpackage/` 只是为了不让旧的 IDE 配置与旧产物被误提交, **它们不是构建路径**,与现在的构建无关。 ## 版本口径(硬约束) - 五个编译器包(`@dcloudio/uni-app` / `uni-components` / `uni-h5` / `uni-mp-weixin` / `vite-plugin-uni`) **必须同一版本**,按精确版本号 pin。具体值以 `package.json` 为准。 - `@dcloudio/types` **不受上面这条约束**:它是 IDE 用的类型定义,单独窄化到 `3.4.31` (`@dcloudio/uni-app` 的 strict peer,不影响构建)。 - **绝不用 `@dcloudio` 包的 `latest` tag。** `latest` 指向 **Vue 2** 线 (实测 `npm view @dcloudio/uni-app dist-tags` → `latest: 2.0.2-5020620260917001`), 与 Vue 3 线同日期后缀、极易看错;Vue 3 线在精确版本号上(`vue3` tag 只给 alpha)。 - `vite` 钉**精确 `5.2.8`**:`@dcloudio/vite-plugin-uni` 的 peer 要求精确版本,不要写 `^`。 - 升级编译器走官方 `npx @dcloudio/uvm`(一次改全套),不要手改单个 `@dcloudio/*` 版本。 ## 常见问题 **`pnpm install` 报 `ERR_PNPM_IGNORED_BUILDS`、退出码非 0** pnpm 12 下依赖的构建脚本默认不执行,且 `strictDepBuilds` 默认为 `true`, 会把「被跳过的依赖构建脚本」判成安装失败。本项目已在 `pnpm-workspace.yaml` 里用 `allowBuilds` 显式复核(`esbuild` / `@parcel/watcher` / `core-js` / `core-js-pure`),之后 `pnpm install --frozen-lockfile` 退出码 0(`node_modules/.modules.yaml` 里记着 `allowBuilds`、`pendingBuilds` 为空)。 这里只写实测到的事实(pnpm v12.11.2):生效的键是 `pnpm-workspace.yaml` 的 `allowBuilds`; 把 `onlyBuiltDependencies` 写进 `package.json` 的 `pnpm` 字段,pnpm 12 会明确打印 `The "pnpm" field in package.json is no longer read by pnpm`(并列出被忽略的键名),**无效**; 写在 `pnpm-workspace.yaml` 里同样不生效(既不告警、也不执行那批构建脚本)。 这个键究竟从哪个版本起失效,本仓库没有逐版本复现,不下版本学结论。 **构建输出一堆 sass `@import` / `legacy-js-api` 弃用告警** 这是既有 scss 写法与新版 dart-sass 的差异,告警不影响退出码,也不影响产物。 **H5** `pnpm dev:h5` / `pnpm build:h5` 仍在 `package.json` 里,但不在承诺范围内。