diff --git a/README.md b/README.md new file mode 100644 index 0000000..1f4ac58 --- /dev/null +++ b/README.md @@ -0,0 +1,108 @@ +# 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` 包的 `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 v11 起依赖的构建脚本默认不执行,且 `strictDepBuilds` 默认为 `true`, +会把「被跳过的依赖构建脚本」判成安装失败。本项目已在 `pnpm-workspace.yaml` 里用 `allowBuilds` +显式复核(`esbuild` / `@parcel/watcher` / `core-js` / `core-js-pure`)。 +注意旧的 `onlyBuiltDependencies` 在 pnpm v11 起已废弃:写在 `package.json` 的 `pnpm` 字段里会被 +pnpm 12 明确告知「不再读取」,**无效**。 + +**构建输出一堆 sass `@import` / `legacy-js-api` 弃用告警** + +这是既有 scss 写法与新版 dart-sass 的差异,告警不影响退出码,也不影响产物。 + +**H5** + +`pnpm dev:h5` / `pnpm build:h5` 仍在 `package.json` 里,但不在承诺范围内。