weapp-vite 7.3.0 → 7.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/README.md +154 -6
  2. package/bin/bootstrap.js +14 -1
  3. package/dist/adapters-CcHrsYaj.mjs +1 -0
  4. package/dist/analyze-ZJUvEdaY.mjs +248 -0
  5. package/dist/auto-import-components/resolvers.mjs +1 -2
  6. package/dist/auto-import-presets/wevu-router.mjs +1 -2
  7. package/dist/auto-import-presets/wevu.mjs +1 -2
  8. package/dist/auto-routes.mjs +2 -1
  9. package/dist/budget-BD7VqLCl.d.mts +178 -0
  10. package/dist/chunkStrategy-DRA5WpB-.mjs +1436 -0
  11. package/dist/cli-acceptance.d.mts +1 -0
  12. package/dist/cli-acceptance.mjs +21 -0
  13. package/dist/cli.mjs +1918 -2089
  14. package/dist/compatibility.mjs +1 -2
  15. package/dist/{config-1J4rToMR.d.mts → config-V0L-IAJf.d.mts} +419 -39
  16. package/dist/config.d.mts +2 -2
  17. package/dist/config.mjs +1 -1
  18. package/dist/constants-DEZdcsMn.mjs +85 -0
  19. package/dist/{createContext-cqr9Y4EV.mjs → createCompilerContextInstance-DJH_P_nZ.mjs} +17602 -15886
  20. package/dist/createContext-BqYzHhY9.mjs +12 -0
  21. package/dist/dashboard/analyze.d.mts +48 -0
  22. package/dist/dashboard/analyze.mjs +1 -0
  23. package/dist/dashboard/vite.d.mts +9 -0
  24. package/dist/dashboard/vite.mjs +44 -0
  25. package/dist/dashboard-DvqF3Key.mjs +1842 -0
  26. package/dist/dashboard.d.mts +3 -0
  27. package/dist/dashboard.mjs +1 -0
  28. package/dist/dashboardViteBridge-Dy3nAD4m.mjs +299 -0
  29. package/dist/dev-fR5GiJRO.mjs +63 -0
  30. package/dist/devProvider-BGBkw28J.mjs +1050 -0
  31. package/dist/docs/README.md +154 -6
  32. package/dist/docs/ai-workflows.md +4 -0
  33. package/dist/docs/doctor.md +38 -0
  34. package/dist/docs/getting-started.md +52 -1
  35. package/dist/docs/index.md +6 -2
  36. package/dist/docs/mcp.md +94 -1
  37. package/dist/docs/testing.md +29 -2
  38. package/dist/docs/troubleshooting.md +8 -0
  39. package/dist/docs/uni-app-component-libraries.md +8 -7
  40. package/dist/docs/upload.md +226 -0
  41. package/dist/docs/vite-plugin.md +171 -0
  42. package/dist/docs/vue-sfc.md +19 -0
  43. package/dist/docs/weapp-config.md +374 -2
  44. package/dist/docs/wevu-authoring.md +10 -0
  45. package/dist/doctor-worker.d.mts +1 -0
  46. package/dist/doctor-worker.mjs +59 -0
  47. package/dist/doctor.d.mts +144 -0
  48. package/dist/doctor.mjs +848 -0
  49. package/dist/eslint.mjs +1 -2
  50. package/dist/file-DRb4eWqw.mjs +1 -0
  51. package/dist/{file-CKB0Tn8Z.mjs → file-sC3jD7Fh.mjs} +16 -93
  52. package/dist/files-BqxFIPRp.mjs +45 -0
  53. package/dist/getInstance-DiGSzBNI.mjs +28 -0
  54. package/dist/getInstance-SiE6WZRh.mjs +1 -0
  55. package/dist/index-C9HjUX5c.d.mts +741 -0
  56. package/dist/index.d.mts +10 -8
  57. package/dist/index.mjs +3 -2
  58. package/dist/json.d.mts +1 -1
  59. package/dist/json.mjs +1 -2
  60. package/dist/lifecycle-BROTlwSL.mjs +320 -0
  61. package/dist/loadConfig-C3BQhz7F.mjs +59 -0
  62. package/dist/loadConfig-VGtBF4qm.mjs +1 -0
  63. package/dist/logger-DGn5iEVN.mjs +1 -0
  64. package/dist/{mcp-BG6TliEg.mjs → mcp-Cj8Maqo6.mjs} +16 -7
  65. package/dist/mcp-D3Yh24Cj.mjs +529 -0
  66. package/dist/mcp.d.mts +6 -3
  67. package/dist/mcp.mjs +1 -2
  68. package/dist/package-7swhyLmf.mjs +91 -0
  69. package/dist/path-doV773b7.mjs +103 -0
  70. package/dist/platform-CnkySBKz.mjs +175 -0
  71. package/dist/processCleanup-B6KA30Zc.mjs +77 -0
  72. package/dist/protocol-vg8HGJ4n.mjs +138 -0
  73. package/dist/{resolvers-icNxkpcy.mjs → resolvers-Dod-euqX.mjs} +4 -1
  74. package/dist/resolvers.mjs +1 -2
  75. package/dist/runtime.mjs +1 -2
  76. package/dist/session-PskhD-nZ.mjs +390 -0
  77. package/dist/test.d.mts +1 -0
  78. package/dist/test.mjs +201 -44
  79. package/dist/types.d.mts +2 -2
  80. package/dist/upload-D4msblBf.mjs +562 -0
  81. package/dist/upload-worker.d.mts +1 -0
  82. package/dist/upload-worker.mjs +161 -0
  83. package/dist/utils-CJSCgEj6.mjs +1094 -0
  84. package/dist/vite.d.mts +9 -0
  85. package/dist/vite.mjs +270 -0
  86. package/dist/volar.d.mts +2 -2
  87. package/dist/web-apis.mjs +1 -2
  88. package/package.json +85 -37
  89. package/dist/file-CvgkbGIx.mjs +0 -2
  90. package/dist/getInstance-CZ1s63zd.mjs +0 -2
  91. package/dist/logger-mt4mSTqV.mjs +0 -2
@@ -0,0 +1,226 @@
1
+ # 小程序上传与预览速查
2
+
3
+ 此文档随当前 `weapp-vite` 版本发布。面向已有可构建的小程序项目;完整分步教程见[上传与预览指南](https://vite.weapp.dev/guide/upload.html)。上传只产生开发版本,不自动提审或正式上线。
4
+
5
+ `test` / `production`、不同 AppID 与自动版本/提交说明见[多环境上传](https://vite.weapp.dev/guide/upload/environments.html)。
6
+
7
+ 下文的构建、环境凭据、dry-run 与自动版本规则只适用于 SDK 入口;原有微信 IDE 顶层上传保留原参数行为,见[旧上传兼容与迁移](#旧上传兼容与迁移)。
8
+
9
+ ## 选择平台与凭据
10
+
11
+ 先在业务项目安装目标平台的工具,例如 `pnpm add -D xhs-mp-cli`。不要只全局安装,也不需要为单个平台安装六套工具。
12
+
13
+ | 平台 | SDK 包 | 源码项目配置 / 代码根字段 | 必需凭据和其他元数据 |
14
+ | --------------- | ------------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------- |
15
+ | 微信 `weapp` | `miniprogram-ci` | `project.config.json` / `miniprogramRoot` | `WEAPP_CI_PRIVATE_KEY_PATH`:代码上传私钥文件,不是 AppSecret |
16
+ | 小红书 `xhs` | `xhs-mp-cli` | `project.config.json` / `miniprogramRoot` | `XHS_UPLOAD_TOKEN`:官方代码上传秘钥内容 |
17
+ | 抖音 `tt` | `tt-ide-cli` | `project.config.json` / `miniprogramRoot` | `TT_UPLOAD_TOKEN`:官方 CLI Token |
18
+ | 支付宝 `alipay` | `minidev` | `mini.project.json` / `miniprogramRoot` | `ALIPAY_IDENTITY_KEY_PATH`:含 `alipay.authentication` 的官方 JSON 身份密钥文件,不是 PEM |
19
+ | 京东 `jd` | `jd-miniprogram-ci` | `project.config.json` / `miniprogramRoot` | `JD_PRIVATE_KEY`:完整密钥内容,不是文件路径 |
20
+ | 百度 `swan` | `swan-toolkit` | `project.swan.json` / `smartProgramRoot` | `SWAN_UPLOAD_TOKEN`:BDUSS;`SWAN_MIN_VERSION`:最低基础库版本,不是应用版本 |
21
+
22
+ **淘宝不支持**:当前没有 `taobao` 平台或上传适配器,`alipay` 固定使用支付宝客户端,不能冒充淘宝。Web、组件库、独立插件也不在此入口范围内。
23
+
24
+ AppID 写入源码侧项目配置的 `appid`。微信可用 `WEAPP_CI_APPID`、支付宝可用 `ALIPAY_APP_ID` 覆盖上传使用的 ID,但必须与密钥授权一致;抖音 `TT_APP_ID`、小红书 `XHS_APP_ID` 如设置,必须与生成项目配置的 `appid` 相同,不能用来切换应用。抖音、小红书、百度不能只填写 `appId`;京东和百度没有 AppID 环境覆盖项。
25
+
26
+ ## 单平台完整配置与命令
27
+
28
+ 以小红书为例,已有项目保留其他构建配置。`vite.config.ts`:
29
+
30
+ ```ts
31
+ import { defineConfig } from 'weapp-vite/config'
32
+
33
+ export default defineConfig({
34
+ weapp: {
35
+ platform: 'xhs',
36
+ srcRoot: 'src',
37
+ },
38
+ })
39
+ ```
40
+
41
+ 源码根 `project.config.json` 的最小上传相关字段(占位值必须替换;已有配置保留其他字段):
42
+
43
+ ```json
44
+ {
45
+ "appid": "replace-with-xhs-app-id",
46
+ "compileType": "miniprogram",
47
+ "miniprogramRoot": "dist"
48
+ }
49
+ ```
50
+
51
+ 源码根 `.env.production.local`:
52
+
53
+ ```dotenv
54
+ XHS_UPLOAD_TOKEN=replace-with-official-code-upload-secret
55
+ ```
56
+
57
+ ```bash
58
+ pnpm add -D xhs-mp-cli
59
+ pnpm exec wv build --upload -p xhs --dry-run
60
+ pnpm exec wv build --upload -p xhs
61
+ pnpm exec wv preview -p xhs --desc "验收首页"
62
+ ```
63
+
64
+ 无需配置 `weapp.upload`:版本默认读取业务 `package.json.version`,说明按包名与最终版本自动生成 `name@version`;默认不升版、不读取 Git、不运行 npm。仅需固定覆盖时才设置 `weapp.upload.version` / `desc`;一次性覆盖可用 CLI:
65
+
66
+ ```bash
67
+ pnpm exec wv build --upload -p xhs --uv 1.2.4 --desc "修复首页展示"
68
+ ```
69
+
70
+ 版本优先级为 CLI `--uv` 或 `--bump` 生成值 > `weapp.upload.version` > `package.json.version`;说明为 CLI `--desc` 或 `--git-desc` 生成值 > `weapp.upload.desc` > 自动生成值。去除首尾空白;显式空版本报错,空说明用自动生成值。普通 `build`、`dev/HMR` 不启用上传,配置文件本身仍正常求值。`preview` 不使用 `weapp.upload` 默认参数,不需要版本,也不接受 `--uv`、`--bump` 或 `--git-desc`。
71
+
72
+ `build --upload` 只编译一次,等本次所有后端构建成功、产物校验通过才上传。SDK `wv upload` 也会自行构建,不需要先执行 `build`。普通 build 不能单独带 `--uv` / `--desc` / `--bump` / `--git-desc` / `--dry-run`;上传不能与 `--watch` 或 Web-only 组合。
73
+
74
+ ## 内置本地自动版本
75
+
76
+ 不需要辅助脚本或额外依赖;沿用已配置的应用与平台,从应用根目录执行:
77
+
78
+ ```sh
79
+ # 计算下一版本和说明,构建但不修改版本文件、不上传
80
+ pnpm exec wv upload -p xhs,tt --mode test --bump patch --git-desc --dry-run
81
+
82
+ # 确认后选择批量或单目标入口,不要重复执行两条真实上传命令
83
+ pnpm exec wv upload -p xhs,tt --mode test --bump patch --git-desc
84
+ pnpm exec wv build --upload -p xhs --mode test --bump patch --git-desc
85
+ ```
86
+
87
+ - `--bump <release>` 只接受 `patch`、`minor`、`major`,要求应用有合法的 SemVer 版本;与显式 `--uv` 冲突。
88
+ - `--git-desc` 读取最新 Git 提交的 subject,不读取正文;与显式 `--desc` 冲突。生成的版本和说明覆盖 `weapp.upload` 默认值。
89
+ - 两个选项可独立启用,只用于 `upload` / `build --upload`,不能放进 Vite 上传配置。真实升版需要本机 npm;只有 `--git-desc` 要求 Git 可执行且仓库已有提交。
90
+ - 只处理命令 `[root]` 直接包含的 `package.json`;省略 root 即当前目录,不向父目录查找,Vite `root` / `envDir` 不改变目标。首次编译器初始化、配置求值前只准备一次,整批共用版本与说明。
91
+ - 真实升版由 npm 标准 `version` 操作更新应用版本与适用的 npm 锁文件,不同步 `pnpm-lock.yaml`。`--prefix`、工作目录均限定为应用根,传入 `--no-git-tag-version --ignore-scripts --workspaces=false`,不修改外层 workspace 根包,不运行生命周期钩子、不 commit/tag/push。
92
+ - dry-run 不运行 `npm version`,不修改版本或锁文件;直接导入 `package.json` 的构建代码仍读取原始版本,而不是预计上传版本。演练不要求 npm,启用 `--git-desc` 时仍要求 Git。
93
+ - 参数冲突、无效 release / 当前版本、Git 失败都在文件修改前报错。升版完成后构建或上传失败不回滚;只重试未完成的平台,去掉 `--bump`,必要时用 `--uv` / `--desc` 显式复用上一批版本与说明。
94
+
95
+ CI 可继续按 `run_number` 生成版本并显式传 `--uv` / `--desc`,不需要改写应用版本文件。完整工作流见[多环境上传](https://vite.weapp.dev/guide/upload/environments.html#ci)。
96
+
97
+ ## 环境与密钥安全
98
+
99
+ - 默认 mode 为 `production`;`--mode test` 选择测试环境文件,但仍是生产构建。
100
+ - 覆盖优先级:`.env` → `.env.local` → `.env.<mode>` → `.env.<mode>.local` → 进程环境;支持变量引用。不要用保留的 mode `local`。
101
+ - 环境文件采用 `dotenv-expand 1000.0.0`:文件值中的 `$(...)` 自动执行命令替换;提供 `DOTENV_PRIVATE_KEY` 时,`encrypted:` 前缀的文件值会尝试解密,未提供私钥时保留该值。没有公开的命令替换或解密禁用开关,反斜杠不能阻止 `$(...)` 命令替换,只加载可信文件。
102
+ - 进程同名值包括空字符串均原样采用;被覆盖的文件值在展开前排除,不执行其命令替换或解密。加载器不将展开后的凭据写回 `process.env`。
103
+ - 含字面 `$(...)` 的凭据直接通过 CI Secrets 或进程环境提供,不写入环境文件,也不在其他文件变量中再次引用它;引用展开后仍可能执行命令替换。
104
+ - 环境目录由 Vite `root` / `envDir` 决定;`envDir: false` 完全禁用此入口的环境文件加载与展开,只读取进程环境,不对其值执行命令替换或解密。
105
+ - 两个密钥文件路径相对源码项目根(命令的 `[root]`),不是相对环境目录或输出目录。
106
+ - `.env.local`、`.env.*.local`、`.keys/` 加入 `.gitignore`;密钥放在源码和静态资源目录之外,不加 `VITE_` 前缀。
107
+ - CI 使用 Secrets 或临时安全文件,测试通过后显式上传;文件用后删除,不向不可信 PR 暴露凭据。
108
+
109
+ 单层反向引用 `A=$B`、`B=value` 仍可展开;多级反向声明 `A=$B`、`B=$C`、`C=value` 会得到 `A` 为字面 `$C`,而 `B`、`C` 为 `value`。多级引用应按依赖顺序先定义基础值,例如依次声明 `C=value`、`B=$C`、`A=$B`,不要依赖任意反向链递归展开。
110
+
111
+ 变量引用必须无环,否则展开可能停滞。避免在同一文件重复声明同名变量;覆盖放到更高优先级的环境文件,先声明基础值,再声明引用它的变量。合并后的文件变量按最后生效声明的位置展开,以复用已经展开的命令输出或解密结果。
112
+
113
+ 默认值与替代值表达式区分未定义和空字符串:
114
+
115
+ | 表达式 | `VAR` 未定义 | `VAR` 是空字符串 |
116
+ | --- | --- | --- |
117
+ | `${VAR-fallback}` | `fallback` | 空字符串 |
118
+ | `${VAR:-fallback}` | `fallback` | `fallback` |
119
+ | `${VAR+alternate}` | 空字符串 | `alternate` |
120
+ | `${VAR:+alternate}` | 空字符串 | 空字符串 |
121
+
122
+ ## 多平台与输出校验
123
+
124
+ 单平台根目录原生 JSON、多平台各端独立 JSON、统一 `projectConfigs` 三种入口都保留,不强制迁移。想减少重复文件时,可以在一份 `vite.config.ts` 中使用 `weapp.multiPlatform.projectConfigs`:
125
+
126
+ ```ts
127
+ import { defineConfig } from 'weapp-vite/config'
128
+
129
+ const common = { projectname: 'my-app' }
130
+
131
+ export default defineConfig({
132
+ weapp: {
133
+ srcRoot: 'src',
134
+ multiPlatform: {
135
+ projectConfigs: {
136
+ xhs: { ...common, appid: 'replace-with-xhs-app-id' },
137
+ tt: { ...common, appid: 'replace-with-douyin-app-id' },
138
+ },
139
+ },
140
+ },
141
+ })
142
+ ```
143
+
144
+ 省略 `targets` 时从平台键推导允许列表;公共字段用普通对象展开,平台字段覆盖公共字段,不做隐式深合并。标准项目 JSON 由打包器生成在代码目录内,默认 `dist/<平台>/dist/`,SDK 代码根为 `.`。不要在输入对象中写 `miniprogramRoot`、`srcMiniprogramRoot`、`smartProgramRoot`,自定义目录使用 `build.outDir`。不读原生或私有项目 JSON;缺少选中平台直接报错,不回退到旧文件。
145
+
146
+ 平台字段和嵌套设置提供智能提示,同时保留未知原生扩展字段及新增字符串取值,不需要 `as any`。独立映射可从 `weapp-vite/config` 导入 `MultiPlatformProjectConfigs`,使用 `satisfies MultiPlatformProjectConfigs` 保留补全和扩展字段推导。已知字段类型、六端平台键和生成代码根限制仍生效;未知字段是否可用由原生工具决定。
147
+
148
+ `defineConfig` 保持通用泛型推导,不做精确对象校验;混合正确与错误平台键时,TypeScript 可能不报错。需要静态检查平台名拼写时用上述 `satisfies`,构建时仍拒绝不支持的平台。
149
+
150
+ 原生文件模式仍支持各端独立维护:默认 `projectConfigRoot: 'config'` 从 `config/<平台>/` 读取 JSON;若使用 `weapp/project.config.json`、`alipay/mini.project.json`、`tt/project.config.json`、`xhs/project.config.json`、`jd/project.config.json`、`swan/project.swan.json` 这些项目根下的平台目录,设为 `projectConfigRoot: '.'` 即可。只维护部分平台时显式选择这些平台,不需要补齐其余文件。
151
+
152
+ 原生代码根为 `dist` 时,配置复制至 `dist/<平台>/`,代码在 `dist/<平台>/dist/`。两种多平台来源不能同时配置。多平台仍显式传 `-p`,不能使用 `--project-config`;单平台不启用 multiPlatform 时仍读取根目录原生 JSON,也可指定该参数,但文件名必须是目标平台的标准名称。Token/私钥始终留在环境变量,不写入项目配置。
153
+
154
+ ```bash
155
+ pnpm exec wv upload -p xhs,tt
156
+ pnpm exec wv upload -p all --dry-run
157
+ pnpm exec wv preview -p xhs,tt
158
+ ```
159
+
160
+ `upload/preview -p all` 是六端:微信、支付宝、抖音、小红书、京东、百度;`build -p all --upload` 则是“小程序 + Web”,不是六端。`build` 不接受多个小程序平台的逗号列表。批量串行、首次失败停止,成功的前序平台不会自动撤回;仅配置部分平台时显式列出它们,`all` 不会按 `multiPlatform.targets` 自动缩减。
161
+
162
+ 每次校验 SDK 代码根与本次输出实际路径相同且含 `app.json`。百度检查 `smartProgramRoot`,其他平台检查 `miniprogramRoot`;不要用 `srcMiniprogramRoot` 替代,也不要通过修改旧 `dist` 绕过校验。
163
+
164
+ ## 平台限制与预览结果
165
+
166
+ - 微信:上传私钥对应 AppID,配置平台 IP 白名单;可选 `WEAPP_CI_ROBOT` 为 1–30。预览图片输出到 `.weapp-vite/preview/`。
167
+ - 支付宝:上传版本为三段数字、无前导零、每段不超过 2147483647;说明少于 200 字符。预览返回二维码图片 URL。
168
+ - 抖音:上传版本为三段数字。SDK 会在本地保存 Token,使用隔离 runner。预览返回扫码链接。
169
+ - 小红书:只走 Token 认证,不回退扫码登录。预览返回扫码链接。
170
+ - 京东:上传与预览共用官方 SDK 临时包,同机共享临时目录的任务必须串行;预览返回二维码图片 URL。
171
+ - 百度:上传版本为二至四段数字;预览也必填 `SWAN_MIN_VERSION`,只支持普通小程序。BDUSS 出现在 SDK 子进程参数中,使用可信隔离 runner;预览返回默认基础库的扫码链接。
172
+
173
+ `--dry-run` 不加载 SDK、不校验凭据或官方平台规则、不生成二维码;上传入口仍要求非空版本。它不能证明平台授权、网络、IP 白名单或扫码权限正确。上传失败后保留错误并定位根因,不把 SDK 提前退出视为成功;取消命令不能撤回已被平台接收的版本。
174
+
175
+ ## 结构化结果与本地超时
176
+
177
+ ```bash
178
+ wv upload -p xhs,tt --json --timeout 180 > upload-report.json
179
+ wv upload -p all --dry-run --json
180
+ ```
181
+
182
+ `--json` 让 stdout 只输出一个报告,日志和官方进度进入 stderr;失败退出码非零。不使用 JSON 时仍打印逐平台汇总。`--json` / `--timeout` 仅适用于独立 SDK `upload`,不适用于 `build --upload`、`preview`、IDE 上传或 `weapp.upload` 配置。
183
+
184
+ 报告为 `{ schemaVersion: 1, action: "upload", status, results, error? }`。整批 `status` 为 `success` / `failed`;`results` 按请求顺序保留各平台的 `platform`、可选 `requestedVersion`、最后进入的 `stage`(`prepare` / `build` / `validate` / `upload`)及 `status`(`success` / `failed` / `not-run` / `dry-run` / `unknown`)。从配置推断但尚未解析的平台为 `null`;列表解析前失败时 `results` 可为空。首次失败后保留前序结果,后续条目为 `not-run`。
185
+
186
+ 成功条目的 `result` 只含官方实际返回的可选信息:微信的 `subPackages` / `plugins`(体积为字节),支付宝的 `sdkVersion` / `qrCodeUrl`,抖音的 `previewUrl` / `qrCodeFile`,京东的 `qrCodeUrl` / `qrCodeBase64`,百度的 `previewUrl` / `fileSize` / `warnings`;小红书成功结果为 `{}`。不从请求版本或内部标识推断 SDK 确认版本,不因可选信息缺失而改判失败。字段结构见[完整结果参考](https://vite.weapp.dev/guide/upload.html#report)。
187
+
188
+ 进度只使用公开能力:微信任务状态/消息、小红书百分比、支付宝日志/任务创建/版本创建事件。其他平台不伪造百分比;任何进度事件都不能替代 SDK 完成确认和正常退出。
189
+
190
+ `--timeout` 是每个平台 SDK worker 的本地超时,不含构建;默认不增加超时。值为正数秒,精度不超过毫秒,最大 `2147483.647` 秒。SDK 执行期间,`SIGINT` / `SIGTERM` 或超时会触发本地上传进程树清理,无法确认清理完成时报告错误。构建等前置阶段保留原有信号退出行为,不等待挂起的构建,也不保证生成最终报告。
191
+
192
+ Windows 使用 PowerShell 查询已退出 worker 的子进程归属,单次查询最多等待 30 秒;这是 SDK 执行结束后的本地清理预算,不包含在 `--timeout` 内。查询或终止失败仍然报错,不会跳过清理或自动重试上传。
193
+
194
+ SDK 开始后超时/中断标记 `status: "unknown"`、`remoteOutcome: "unknown"`;SDK 尚未开始时可为 `remoteOutcome: "not-started"`。其他 SDK 错误也可能携带 `remoteOutcome: "unknown"`。**本地停止不代表远端取消**,先核实平台状态再重试;不会自动重试、回滚、提审、设置体验版或正式发布。
195
+
196
+ ## 完整教程
197
+
198
+ - [微信](https://vite.weapp.dev/guide/upload/weapp.html)
199
+ - [小红书](https://vite.weapp.dev/guide/upload/xhs.html)
200
+ - [抖音](https://vite.weapp.dev/guide/upload/tt.html)
201
+ - [支付宝及淘宝边界](https://vite.weapp.dev/guide/upload/alipay.html)
202
+ - [京东](https://vite.weapp.dev/guide/upload/jd.html)
203
+ - [百度](https://vite.weapp.dev/guide/upload/swan.html)
204
+ - [批量操作](https://vite.weapp.dev/guide/upload.html#batch)、[CI 示例](https://vite.weapp.dev/guide/upload.html#ci)、[排障](https://vite.weapp.dev/guide/upload.html#troubleshooting)
205
+
206
+ ## 旧上传兼容与迁移
207
+
208
+ 原有微信 IDE 上传的长、短参数保持不变,无需立即改写脚本:
209
+
210
+ ```bash
211
+ wv upload --project ./dist --version 1.2.3 --desc "release"
212
+ wv upload -p ./dist -v 1.2.3 -d "release"
213
+ wv upload --project=./dist --version=1.2.3 --desc="release"
214
+ ```
215
+
216
+ 旧入口保留版本、说明和项目定位的原始语义。上述 `./dist` 仅是 IDE 工程路径示例,应替换为包含 `project.config.json` 的实际工程根;省略 `--project/-p` 或 `--appid` 时仍保持透传,不会自动补 `dist`,由官方 CLI 处理。顶层旧语法每次调用只警告一次,提示未来将移除;稳定的 `wv ide upload -p ./dist -v 1.2.3 -d "release"` 不弃用、不警告。两者沿用 IDE 登录和已有项目,不额外运行 weapp-vite 构建。
217
+
218
+ 普通 SDK 上传直接执行 `wv upload -p weapp`,无需 `--project`:框架自动依据项目配置与本轮实际写出目录定位产物。多平台默认代码目录是 `dist/<平台>/dist/`,也支持自定义输出;不是固定上传 `./dist`。
219
+
220
+ SDK 迁移不是等价换名:回到包含 `package.json`、Vite 配置和源码的项目根,安装 `miniprogram-ci` 并配置 AppID、上传私钥和 IP 白名单,再执行 `wv build --upload -p weapp --uv 1.2.3 --desc "release"`。不要把旧 `--project` 的构建产物目录当作 SDK `[root]`;SDK 需要新凭据,不复用 IDE 登录。
221
+
222
+ - 旧标记为 `--version/-v`、`--project`、`--appid`、`--ext-appid`、`--info-output/-i`;SDK 标记为长参数 `--platform`、`--uv`、`--bump`、`--git-desc`、`--dry-run`、`--json`、`--timeout`。混用在 IDE、编译或版本修改前报错;SDK 标记的 `--no-*` 形式也不能混入旧调用。SDK 专属选项不适用于 IDE。
223
+ - `-p` 仅在有旧标记时表示 IDE 项目目录,否则表示原生平台;不根据路径存在与否或值是否像平台名猜测。`--desc` 共用,`-d` 仅在旧调用中是说明,原生命令中仍是 debug。
224
+ - 参数支持分开和 `=` 形式;必填值只是数据,仅在选项位置遇到 `--` 后停止扫描。
225
+ - `wv upload --help` 查看 SDK 帮助;`wv help upload` 保留旧 IDE 帮助并警告未来弃用;`wv ide help upload` 保持显式 IDE 帮助、不警告。工具自身版本查询用 `wv --version`。
226
+ - 兼容只覆盖顶层旧上传,不包含顶层预览。`wv preview` 仍走 SDK;IDE 预览继续用 `wv ide preview --project ./dist`。
@@ -0,0 +1,171 @@
1
+ # 标准 Vite 插件与 Vite+
2
+
3
+ `weapp-vite/vite` 提供实验性的生产构建、classic 与 stateful 开发入口。当前阶段支持六平台单目标原生 JS/TS、Wevu Vue SFC 编译;微信另已验收 React、自动路由、自动组件、普通分包、独立分包、worker、微信插件双产物与 lib mode。主产物由宿主 Vite 的编译管线生成。
4
+
5
+ ## 配置
6
+
7
+ 项目使用 ESM(`package.json` 设置 `"type": "module"`),或将配置命名为 `vite.config.mts`:
8
+
9
+ ```ts
10
+ import { defineConfig } from 'vite'
11
+ import { weapp } from 'weapp-vite/vite'
12
+
13
+ export default defineConfig({
14
+ plugins: [weapp()],
15
+ weapp: {
16
+ platform: 'weapp',
17
+ srcRoot: 'src',
18
+ hmr: { runtime: 'classic' },
19
+ },
20
+ })
21
+ ```
22
+
23
+ 插件没有第二套配置参数。配置文件由宿主加载,插件不会自动发现或合并另一份 `weapp-vite.config.*`。迁移时把配置收敛到一个入口;需要拆文件时,在该入口显式导入。不要重复调用 `weapp()`,也不要把同一插件实例共享给两个活动宿主。
24
+
25
+ ```sh
26
+ vite build
27
+ vite dev
28
+ ```
29
+
30
+ `mode: 'test'` 仍可用于生产构建。测试识别依赖实际 Vitest 宿主标识,不根据 mode 猜测。只读取配置不会扫描小程序入口、生成支持文件或启动 IDE/MCP;`wv prepare` 继续负责类型支持文件。
31
+
32
+ ## Vite+
33
+
34
+ 配置中的 `defineConfig` 改为从 `vite-plus` 导入,然后使用 `vp build` / `vp dev`。Vite+ 消费项目须按官方迁移规则把 `vite` 指向配套 core,并确保 weapp-vite 的依赖也解析到同一宿主。例如 npm 项目:
35
+
36
+ ```json
37
+ {
38
+ "type": "module",
39
+ "devDependencies": {
40
+ "vite-plus": "1.0.0",
41
+ "vite": "npm:@voidzero-dev/vite-plus-core@1.0.0"
42
+ },
43
+ "overrides": {
44
+ "vite": "npm:@voidzero-dev/vite-plus-core@1.0.0"
45
+ }
46
+ }
47
+ ```
48
+
49
+ pnpm 使用项目级 `pnpm-workspace.yaml` 的 `overrides` 完成同样的 alias;不要只修改顶层依赖而留下 weapp-vite 内嵌的另一套 Vite。该组合对应 Vite 8.3.1 / Rolldown 1.2.11;Vite+ 项目验证线为 Node 24.11+,普通 weapp-vite 的 Node 范围不变。
50
+
51
+ ## 当前命令边界
52
+
53
+ | 命令 | 当前行为 |
54
+ | --- | --- |
55
+ | `vite build` / `vp build` | 实验性单目标小程序生产构建 |
56
+ | `wv dev` / `wv build` | 保留原有能力;显式插件不会重复安装编译器 |
57
+ | `vite dev` / `vp dev` | 实验性 classic / stateful 开发;由宿主管理启动、重启与关闭 |
58
+ | `vite build --watch` / `vp build --watch` | 实验性生产 watch:完整目标产物、入口增删与失败恢复 |
59
+ | `vp test` | 插件不启动小程序编译;mpcore 测试继续显式使用 artifact API |
60
+ | `wv prepare/open/upload/mcp` | 继续使用小程序专属命令 |
61
+ | `vp preview` | Vite 的 Web 预览,不是小程序二维码预览 |
62
+ | `vp pack` | 通用库打包,不替代小程序 lib mode |
63
+
64
+ 每次调用选择一个目标。纯 Web 使用 `weapp.platform: 'web'`;Web/小程序同宿主混合开发仍未开放。
65
+
66
+ 生产构建、build watch、classic 与实验性 stateful dev 已接入。脚手架支持与业务模板独立的 `--toolchain=wv|vite|vite-plus`,生成对应宿主脚本、显式配置入口和 Vite+ core alias;小程序专属命令继续使用 `wv`。任务缓存、Dashboard/MCP 会话复用和完整跨平台发布矩阵仍属于后续阶段。完整编译能力对齐继续由 #1097 追踪;高级目标限制是阶段边界。
67
+
68
+ ## classic 开发
69
+
70
+ `vite dev` / `vp dev` 由宿主负责服务器和配置重载,小程序会话复用现有增量编译调度,产物经 Vite/Rolldown 原生 write 落盘。首次完整产物就绪后才打印小程序就绪日志。脚本、模板、样式和页面增删会更新产物;语法错误修正后继续编译。宿主 `server.close()`(包括 middleware mode)会等待正在执行的构建再释放自有资源。
71
+
72
+ classic 模式不支持宿主 `experimental.bundledDev: true`,开启时会在启动前报错。classic 更新遵循完整重载语义,不承诺实例状态保持。`wv dev` 保留原有 HMR 选择和全部目标能力。
73
+
74
+ 同一宿主目前只编译一个小程序目标,暂不支持同时开发 Web。插件不会自动打开 IDE、启动 MCP 或上传。
75
+
76
+ ## 检查与排障
77
+
78
+ - 缺少入口:核对 `weapp.srcRoot`、`app.json`/`app.vue` 和宿主的 `root`。
79
+ - ESM 配置加载失败:使用 `type: module` 或 `.mts`,不依赖旧 CLI 的 runner 回退。
80
+ - 引擎加载失败:核对 Vite+ core alias 和实际解析路径;配套引擎缺失时会报错,不静默切换到其他 Rolldown。
81
+ - 类型检查:继续使用 `wv prepare`、`vue-tsc`/`tsc`、ESLint 与 stylelint;`vp check` 不能替代全部小程序规则。
82
+ - 缓存:开发服务、IDE、上传、MCP 与 runtime E2E 不应配置任务缓存。生产缓存的完整恢复与输入失效矩阵尚未验收。
83
+
84
+ 跟踪:[标准插件与 Vite+ 集成 #1097](https://github.com/weapp-vite/weapp-vite/issues/1097)。
85
+
86
+ ## 生产 watch
87
+
88
+ `vite build --watch` 与 `vp build --watch` 复用生产配置,每轮通过宿主 emit/write 发布当前目标的完整产物。支持脚本、模板、样式更新,页面增删和语法错误恢复;删除页面时清理对应的已拥有产物及 sourcemap。`emptyOutDir: false` 时保留其他工具写入的文件。关闭 watcher 会等待本轮写出和会话资源释放。
89
+
90
+ 这一路径不提供状态保持 HMR,也不自动重启配置文件。修改 Vite 配置或配置依赖后,按宿主 build watch 的语义重新启动命令;需要配置自动重启时使用 classic `vite dev` / `vp dev`。目标能力限制与插件生产构建一致。
91
+
92
+ ## 实验性 stateful 开发
93
+
94
+ 在同一顶层配置中设置 `weapp.hmr.runtime: 'stateful-experimental'`,继续使用 `vite dev` / `vp dev`。适配器安装在宿主的 client 环境,使用其配套 Rolldown DevEngine;不会另起一个 Vite 服务。无需手工开启 `experimental.bundledDev`,但宿主必须提供所需私有 API,能力检查失败会明确报错。
95
+
96
+ 该模式面向微信 WebView,需开启微信开发者工具热重载。当前宿主遇到 Skyline 或缺失私有 API 时明确报错,需显式改用 classic;独立 CLI 的自动降级行为保留。JS 安全补丁、模板与样式更新复用现有 stateful 协议;页面入口拓扑变化由宿主重新创建会话,配置依赖变化由宿主重新加载配置。关闭会等待本会话拥有的任务和引擎;不会关闭其他宿主实例。
97
+
98
+ 普通 Vite 与 Vite+ 均已验证原生 Page/Component 脚本补丁、样式更新、模板往返及 Wevu 本地/store 状态保持,包含 headless 可观察语义与真实微信 IDE。Vite+ 验收在严格安装的独立发布包依赖图中使用原生 `vp dev`;独立 `wv` 同时通过同组 headless 与真实微信 IDE 回归。当前结果覆盖这些定向场景,完整跨平台发布矩阵仍需持续验证。
99
+
100
+ middleware mode 支持构建与可等待关闭。运行小程序的 stateful 通信还需要消费方把 Vite middleware 挂载到可访问的 HTTP 服务,并配置对应端口;只创建 middleware 服务不会自动提供监听端点。
101
+
102
+ ## React
103
+
104
+ 注册同一个 `weapp()`,继续使用顶层 `weapp.react` 配置和既有 `@weapp-vite/react` 运行时。生产构建、classic、生产 watch 与实验性 stateful 共用 React 编译器;静态 TSX 在 stateful 下按既有规则重建会话,不承诺 React hooks 状态跨此类重载保持。
105
+
106
+ `renderMode: 'auto'` 可组合静态 WXML、动态模板与原生/Wevu 组件 bridge;`dynamic` 仍不支持原生组件 bridge。React Compiler 继续是可选 SWC 能力,其安装与降级规则不随宿主改变。模板输出使用共享的源码根与输出路径映射,支持自定义 `srcRoot` 和符号链接项目路径。
107
+
108
+ ## 独立分包
109
+
110
+ `app.json` 或 `app.vue` 中的 `subPackages[].independent`,以及顶层 `weapp.subPackages` 的配置沿用独立 CLI 语义。三入口共享独立子构建;子构建直接复用本次已加载的配置、CLI 覆盖与用户插件,不再次执行配置文件。
111
+
112
+ 每个子构建只生成内存产物,最终由主构建的 Vite/Rolldown 发布。classic、stateful 和原生生产 watch 由宿主调度子包更新,不为独立分包另外创建 watcher。生产 watch 支持独立脚本与模板依赖、语法错误恢复,以及删除分包后的陈旧产物清理。
113
+
114
+ stateful 下独立分包源码由宿主 watcher 驱动完整更新批次,不承诺子包 JS 状态保持;子包的 Vue、脚本和伴随资产无需进入主 DevEngine 模块图也能触发更新。
115
+
116
+ ## worker
117
+
118
+ 沿用 `app.json` 的 `workers` 与顶层 `weapp.worker.entry`,三入口使用同一子目标编译。原生 app builder 纳入 worker 环境,子目标复用已加载的配置和用户插件,返回内存产物;最终由主应用原生 emit/write 一次发布。
119
+
120
+ classic、stateful 和生产 watch 不为 worker 额外启动构建 watcher。输入归属主会话,包含 worker 依赖修改、错误恢复、新增导入以及关闭等待;从 app 配置移除 worker 后,生产 watch 清理旧输出。stateful 中 worker 变化触发完整更新,不承诺保留 worker 线程状态。
121
+
122
+ ## 微信插件项目
123
+
124
+ 三入口共用顶层 `weapp.pluginRoot` 与 `project.config.json` 的插件输出配置。生产构建通过 app builder 登记 `weapp_plugin` 环境,在主应用落盘后构建插件,复用本次已加载配置与用户转换插件。主应用、插件和插件 npm 全部完成后才报告成功。
125
+
126
+ 插件输出可放在主应用输出内部或同级目录,但不能等于或包含主应用输出目录。classic 与 stateful 宿主都保留独立的插件编译会话,由父会话负责关闭;插件 watcher 负责增量更新与入口拓扑重建,不承诺插件 JS 状态保持。生产 watch 支持共享依赖、编译失败恢复和插件页面移除。
127
+
128
+ 当前阶段不支持双产物的 `build.write: false`,会提前报错。npm 自定义回调和手工映射共用上述输出归属规则;真实插件 runtime 仍需按目标平台验收。
129
+
130
+ 手工 npm 关联从主 `packageJsonPath` 所在目录解析依赖,再按 Node 规则向上查找;递归依赖从所属父包解析。CLI 缓存跟踪所选 manifest 的依赖变化,回调的工程 `root` 和相对输出基准保持不变。外部父子映射迁移时,按整轮绝对文件归属差集删除旧文件,不会误删当前产物或用户文件。
131
+
132
+ ## 小程序组件库
133
+
134
+ 顶层 `weapp.lib` 直接用于 `wv build`、`vite build` 和 `vp build`。原生组件、Vue SFC、纯脚本入口及 `fileName` 输出映射沿用同一编译器,声明文件与 JS、JSON、模板和样式一起进入原生 bundle;`build.write: false` 返回包含声明的内存产物。
135
+
136
+ 生产 watch 追踪声明编译器发现的类型依赖,类型变更会重新生成声明。每轮声明编译使用独立 TypeScript 缓存,避免旧类型跨轮复用。classic `dev` 可用于组件库源码更新,开发模式沿用独立 CLI 不生成声明的规则;组件交互在消费它的小程序应用中验证。
137
+
138
+ `vp pack` 继续使用通用库打包语义;小程序库的模板、样式、JSON 和专属声明仍通过 `weapp.lib` 构建。
139
+
140
+
141
+ ## 六平台目标选择
142
+
143
+ 三入口共用顶层 `weapp.platform`,可选择 `weapp`、`alipay`、`tt`、`swan`、`jd`、`xhs`。启用 `weapp.multiPlatform` 时也可通过该字段指定本次目标,独立 CLI 继续接受 `--platform`。普通 Vite/Vite+ 命令不接受 `wv` 专属的 `--platform` 参数;多目标使用不同配置文件或任务,并确保输出目录独立。
144
+
145
+ ```ts
146
+ import { defineConfig } from 'vite'
147
+ import { weapp } from 'weapp-vite/vite'
148
+
149
+ export default defineConfig({
150
+ plugins: [weapp()],
151
+ weapp: {
152
+ platform: 'alipay',
153
+ srcRoot: 'src',
154
+ multiPlatform: true,
155
+ hmr: { runtime: 'classic' },
156
+ },
157
+ })
158
+ ```
159
+
160
+ 目录式平台项目配置从 `config/<platform>/` 读取,默认发布到 `dist/<platform>/`,小程序产物位于其 `dist/` 子目录。项目配置同样通过配套原生引擎写出,生产 watch 更新并清理本会话已拥有的文件;拒绝覆盖小程序编译输出的配置目录内容。目录式配置暂不支持 `build.write: false`,内联 `multiPlatform.projectConfigs` 可随主 bundle 返回内存产物。配置目录中的符号链接尚未开放。
161
+
162
+ 原生 TS 和 Vue SFC 的六平台生产构建、classic 更新,以及普通 Vite/Vite+ 的生产 watch 使用同一消费矩阵。stateful 仅开放微信;其他平台明确使用 classic。微信运行时使用 headless 与真实 IDE 验收;其他平台的构建/增量检查不代表各自真实 IDE runtime 均已通过,高级能力仍按平台分别验收。
163
+
164
+
165
+ ## 纯 Web 目标
166
+
167
+ 三入口都可在顶层设置 `weapp.platform: 'web'`,沿用 `weapp.web` 的源码根、输出目录和 runtime 配置;未指定 `weapp.web` 时使用 Web 默认值。普通 Vite 与 Vite+ 继续注册同一个 `weapp()`,独立 `wv` 无需注册插件,也无需再传 `--platform web`。显式 CLI `--platform` 覆盖配置目标。
168
+
169
+ 项目需保留既有 Web `index.html`,通过 `/@weapp-vite/web/entry` 启动 runtime。纯 Web 不要求小程序 `project.config.json`,默认输出 `dist/web`,不会同时生成小程序 bundle。原生生产构建、开发服务和插件生产 watch 使用宿主生命周期;Web 的浏览器 HMR 不启用微信 stateful 引擎。
170
+
171
+ 生产产物与 dev 服务均使用浏览器验证 Vue SFC、原生组件语义和交互。Web 测试只证明浏览器目标,不替代六个平台真实 IDE 验收。Web/小程序混合宿主仍会明确报错,后续需独立环境隔离后再开放。
@@ -124,6 +124,18 @@ defineOptions({ behaviors: [i18n.behavior] })
124
124
  <view class="br" />
125
125
  ```
126
126
 
127
+ ## 原生插槽与 `provide` / `inject`
128
+
129
+ `weapp.vue.template.scopedSlotsRequireProps` 默认 `false`,普通插槽仍使用增强方案。设为 `true` 时,无 scoped props 的内容保留原生 `<slot>`。
130
+
131
+ 微信目标下,编译后的 Wevu Provider 和 Leaf 使用默认 `setupLifecycle: 'attached'` 时,`<Provider><Leaf /></Provider>` 中的 Leaf 会在 setup 前同步关联最近的插槽承载者。Leaf 的 `inject()` 能取得 Provider 提供的原始对象、ref 和方法;点击调用 action 会更新双方共享状态。具名、普通节点包裹、嵌套和多实例场景遵循同一规则,卸载重建不会沿用旧上下文。
132
+
133
+ 这条协议不新增包装节点,不复制注入值,不修改原生 `Component.export` / `selectOwnerComponent()`。显式 `setupLifecycle: 'created'` 或 attached 前的公开实例恢复仍按原时机执行 setup,不提供该保证;未经 Wevu 编译的原生/第三方组件也不自动成为注入承载者。
134
+
135
+ 内层 Wevu Provider 即使使用过滤后的 `export()` / `expose()`,其普通模板子组件(含 Options API 局部注册别名)和原生插槽子组件仍共享内层上下文;外部选择器只看到该 Provider 的公开导出,内部父链不依赖公开导出对象。
136
+
137
+ 已验证环境:微信 DevTools Stable `2.02.2608080`(基础库 `3.17.2`、`3.13.2`)和 `2.02.2608060`(基础库 `3.17.2`),并保留 mpcore 回归;这些结果不代替其他版本组合或真机验证。其他小程序平台及 Web 目标不启用此协议,构建时裁剪其声明属性、事件接收与清理代码,不能由微信或 headless 结果推断支持。`false` / augmented 和实际 scoped props 继续使用既有增强插槽路径。
138
+
127
139
  ## 具名插槽透传 wrapper
128
140
 
129
141
  当你把当前组件的 `<slot />` 转发到子组件的具名插槽时:
@@ -350,3 +362,10 @@ defineOptions({ behaviors: [i18n.behavior] })
350
362
  - 需要更完整的编辑器提示说明:[`../volar.md`](../volar.md)
351
363
  - 需要运行时页面/组件/store 约束:[`wevu-authoring.md`](./wevu-authoring.md)
352
364
  - 需要项目级 `weapp` 配置:[`weapp-config.md`](./weapp-config.md)
365
+
366
+
367
+ ## JSON 合并读取页面声明
368
+
369
+ `weapp.json.mergeStrategy(target, source, ctx)` 可读取当前 SFC 页面的 `ctx.routeConfig`(`definePage` 的静态 `{ name, meta }`)和 `ctx.pageMeta`(`definePageMeta` 的完整静态对象)。元信息支持内联、外部脚本与规范导入别名,并贯穿编译阶段、`emit`、`merge-existing` 和 JSON-only HMR。
370
+
371
+ 可按 `typeof ctx.routeConfig?.meta?.title === 'string'` 映射 `navigationBarTitleText`。`pageMeta` 含动态变量、调用、展开或访问器时整个字段为 `undefined`;编译器不会执行表达式或返回部分对象。无声明以及非页面组件不提供这些字段。已有非法路由声明诊断保持有效。