Files
tuanwei-uniapp/README.md
T

116 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/<dev|build>/<平台>`,`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` 里,但不在承诺范围内。