浏览代码

处理打包功能实现

yuanmingze 1 月之前
父节点
当前提交
5a386df140
共有 12 个文件被更改,包括 368 次插入136 次删除
  1. 1 2
      .env.development
  2. 2 1
      .env.production
  3. 0 5
      .env.text_DEMO
  4. 1 1
      .gitignore
  5. 21 1
      README.md
  6. 6 7
      package.json
  7. 150 46
      pnpm-lock.yaml
  8. 0 4
      scripts/.env.text_DEMO
  9. 183 0
      scripts/build-mp-weixin.ts
  10. 0 62
      scripts/inject-manifest.ts
  11. 3 2
      src/manifest.json
  12. 1 5
      src/pages-task/task-form/utils/questionnaire.ts

+ 1 - 2
.env.development

@@ -1,6 +1,5 @@
 VITE_MODE=development
 VITE_APP_TYPE=dev
 VITE_PROJECT_TITLE=要易小助手
-VITE_BASE_API=https://pre1.yaoyi.net
-# VITE_BASE_API=https://preapi.yaoyi.net
+VITE_BASE_API=https://preapi.yaoyi.net
 VITE_WX_APPID=wxd03398e1bff2b241

+ 2 - 1
.env.production

@@ -1,4 +1,5 @@
 VITE_MODE=production
 VITE_APP_TYPE=prod
+VITE_PROJECT_TITLE=要易小助手
 VITE_BASE_API=https://api.yaoyi.net
-VITE_WX_APPID=wxd03398e1bff2b241
+VITE_WX_APPID=wxd03398e1bff2b241

+ 0 - 5
.env.text_DEMO

@@ -1,5 +0,0 @@
-VITE_MODE=production_demo
-VITE_APP_TYPE=prod
-VITE_PROJECT_TITLE=要易体验小助手
-VITE_BASE_API=https://demoapi.yaoyi.net
-VITE_WX_APPID=wx956bb32e73073426

+ 1 - 1
.gitignore

@@ -19,4 +19,4 @@ dist
 *.ntvs*
 *.njsproj
 *.sln
-*.sw?
+*.sw?

+ 21 - 1
README.md

@@ -1,6 +1,26 @@
-日常开发请只使用:
+# 要易小助手
+
+## 日常开发
 
 - pnpm dev:h5
 - pnpm dev:mp-weixin
 - pnpm build:h5
 - pnpm build:mp-weixin
+
+微信小程序生产构建支持以下三个目标环境:
+
+| 环境   | 接口                       | AppID      |
+| ------ | -------------------------- | ---------- |
+| luoxin | `https://luoxin.yaoyi.net` | 罗欣小程序 |
+| pre    | `https://preapi.yaoyi.net` | 原小程序   |
+| prod   | `https://api.yaoyi.net`    | 原小程序   |
+
+## 微信小程序构建
+
+```bash
+pnpm build:luoxin:mp-weixin
+pnpm build:pre:mp-weixin
+pnpm build:prod:mp-weixin
+```
+
+命令会校验环境文件中的 `VITE_MODE`、`VITE_BASE_API` 和 `VITE_WX_APPID`,临时将目标 AppID 注入 `src/manifest.json`,完成后自动还原。压缩后的产物位于 `dist/build/mp-weixin`。

+ 6 - 7
package.json

@@ -5,13 +5,13 @@
     "dev:h5": "uni",
     "dev:mp-weixin": "uni -p mp-weixin",
     "build:h5": "uni build",
-    "build:mp-weixin": "uni build -p mp-weixin",
+    "build:mp-weixin": "tsx scripts/build-mp-weixin.ts prod",
     "build:pre:h5": "uni build --mode pre",
-    "build:pre:mp-weixin": "uni build -p mp-weixin --mode pre",
-    "build:luoxin:h5": "cross-env VITE_MODE=production_luoxin uni build --mode production_LUOXIN",
-    "build:luoxin:mp-weixin": "cross-env VITE_MODE=production_luoxin tsx scripts/inject-manifest.ts && uni build -p mp-weixin --mode production_LUOXIN",
-    "build:demo:h5": "cross-env VITE_MODE=production_demo uni build --mode text_DEMO",
-    "build:demo:mp-weixin": "cross-env VITE_MODE=production_demo tsx scripts/inject-manifest.ts && uni build -p mp-weixin --mode text_DEMO",
+    "build:pre:mp-weixin": "tsx scripts/build-mp-weixin.ts pre",
+    "build:prod:h5": "uni build --mode production",
+    "build:prod:mp-weixin": "tsx scripts/build-mp-weixin.ts prod",
+    "build:luoxin:h5": "uni build --mode production_LUOXIN",
+    "build:luoxin:mp-weixin": "tsx scripts/build-mp-weixin.ts luoxin",
     "type-check": "vue-tsc --noEmit"
   },
   "dependencies": {
@@ -62,7 +62,6 @@
     "@uni-ku/root": "^1.4.1",
     "@vue/runtime-core": "^3.4.21",
     "@vue/tsconfig": "^0.9.1",
-    "cross-env": "^10.1.0",
     "dotenv": "^17.2.3",
     "eslint": "^8.57.1",
     "eslint-config-prettier": "^10.1.8",

+ 150 - 46
pnpm-lock.yaml

@@ -13,10 +13,10 @@ importers:
         version: 3.0.0-4080420251103001(@dcloudio/types@3.4.28)(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vue@3.5.26(typescript@5.9.3))
       '@dcloudio/uni-app-harmony':
         specifier: 3.0.0-4080420251103001
-        version: 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
+        version: 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
       '@dcloudio/uni-app-plus':
         specifier: 3.0.0-4080420251103001
-        version: 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
+        version: 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
       '@dcloudio/uni-components':
         specifier: 3.0.0-4080420251103001
         version: 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vue@3.5.26(typescript@5.9.3))
@@ -113,7 +113,7 @@ importers:
         version: 3.0.0-4080420251103001
       '@dcloudio/vite-plugin-uni':
         specifier: 3.0.0-4080420251103001
-        version: 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
+        version: 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
       '@types/lodash-es':
         specifier: ^4.17.12
         version: 4.17.12
@@ -137,16 +137,13 @@ importers:
         version: 0.2.6(rollup@4.55.1)
       '@uni-ku/root':
         specifier: ^1.4.1
-        version: 1.4.1(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))
+        version: 1.4.1(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))
       '@vue/runtime-core':
         specifier: ^3.4.21
         version: 3.5.26
       '@vue/tsconfig':
         specifier: ^0.9.1
         version: 0.9.1(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))
-      cross-env:
-        specifier: ^10.1.0
-        version: 10.1.0
       dotenv:
         specifier: ^17.2.3
         version: 17.2.3
@@ -188,10 +185,10 @@ importers:
         version: 30.0.0(@babel/parser@7.29.7)(vue@3.5.26(typescript@5.9.3))
       vite:
         specifier: 5.2.8
-        version: 5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1)
+        version: 5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1)
       vite-tsconfig-paths:
         specifier: ^6.0.3
-        version: 6.0.3(typescript@5.9.3)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))
+        version: 6.0.3(typescript@5.9.3)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))
       vue-eslint-parser:
         specifier: 9.4.3
         version: 9.4.3(eslint@8.57.1)
@@ -992,9 +989,6 @@ packages:
     peerDependencies:
       vite: 5.2.8
 
-  '@epic-web/invariant@1.0.0':
-    resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==}
-
   '@esbuild/aix-ppc64@0.20.2':
     resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
     engines: {node: '>=12'}
@@ -2417,6 +2411,9 @@ packages:
     resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
     engines: {node: '>= 0.6'}
 
+  copy-anything@2.0.6:
+    resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
+
   copy-anything@4.0.5:
     resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==}
     engines: {node: '>=18'}
@@ -2427,11 +2424,6 @@ packages:
   core-js@3.47.0:
     resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==}
 
-  cross-env@10.1.0:
-    resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==}
-    engines: {node: '>=20'}
-    hasBin: true
-
   cross-env@7.0.3:
     resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
     engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
@@ -2603,6 +2595,10 @@ packages:
     resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==}
     engines: {node: '>=0.12'}
 
+  errno@0.1.8:
+    resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+    hasBin: true
+
   error-ex@1.3.4:
     resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==}
 
@@ -2972,6 +2968,10 @@ packages:
     resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
     engines: {node: '>=0.10.0'}
 
+  iconv-lite@0.6.3:
+    resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+    engines: {node: '>=0.10.0'}
+
   icss-replace-symbols@1.1.0:
     resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==}
 
@@ -2988,6 +2988,11 @@ packages:
     resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
     engines: {node: '>= 4'}
 
+  image-size@0.5.5:
+    resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+    engines: {node: '>=0.10.0'}
+    hasBin: true
+
   immutable@4.3.8:
     resolution: {integrity: sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw==}
 
@@ -3071,6 +3076,9 @@ packages:
   is-typedarray@1.0.0:
     resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
 
+  is-what@3.14.1:
+    resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
+
   is-what@5.5.0:
     resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==}
     engines: {node: '>=18'}
@@ -3313,6 +3321,11 @@ packages:
     resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==}
     engines: {node: '>=8'}
 
+  less@4.5.1:
+    resolution: {integrity: sha512-UKgI3/KON4u6ngSsnDADsUERqhZknsVZbnuzlRZXLQCmfC/MDld42fTydUE9B+Mla1AL6SJ/Pp6SlEFi/AVGfw==}
+    engines: {node: '>=14'}
+    hasBin: true
+
   leven@3.1.0:
     resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
     engines: {node: '>=6'}
@@ -3389,6 +3402,10 @@ packages:
   magic-string@0.30.21:
     resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
 
+  make-dir@2.1.0:
+    resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+    engines: {node: '>=6'}
+
   make-dir@4.0.0:
     resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
     engines: {node: '>=10'}
@@ -3512,6 +3529,11 @@ packages:
   natural-compare@1.4.0:
     resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
 
+  needle@3.5.0:
+    resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==}
+    engines: {node: '>= 4.4.x'}
+    hasBin: true
+
   negotiator@0.6.3:
     resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
     engines: {node: '>= 0.6'}
@@ -3612,6 +3634,10 @@ packages:
     resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
     engines: {node: '>=8'}
 
+  parse-node-version@1.0.1:
+    resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
+    engines: {node: '>= 0.10'}
+
   parse5@6.0.1:
     resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
 
@@ -3685,6 +3711,10 @@ packages:
     resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
     engines: {node: '>=0.10.0'}
 
+  pify@4.0.1:
+    resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+    engines: {node: '>=6'}
+
   pinia-plugin-persistedstate@4.7.1:
     resolution: {integrity: sha512-WHOqh2esDlR3eAaknPbqXrkkj0D24h8shrDPqysgCFR6ghqP/fpFfJmMPJp0gETHsvrh9YNNg6dQfo2OEtDnIQ==}
     peerDependencies:
@@ -3821,6 +3851,9 @@ packages:
     resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
     engines: {node: '>= 0.10'}
 
+  prr@1.0.1:
+    resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+
   psl@1.15.0:
     resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
 
@@ -3980,6 +4013,10 @@ packages:
     resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==}
     engines: {node: '>=11.0.0'}
 
+  sax@1.6.1:
+    resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
+    engines: {node: '>=11.0.0'}
+
   saxes@5.0.1:
     resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==}
     engines: {node: '>=10'}
@@ -3987,6 +4024,10 @@ packages:
   scule@1.3.0:
     resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
 
+  semver@5.7.2:
+    resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+    hasBin: true
+
   semver@6.3.1:
     resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
     hasBin: true
@@ -4212,6 +4253,9 @@ packages:
       typescript:
         optional: true
 
+  tslib@2.8.1:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
   tsx@4.21.0:
     resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==}
     engines: {node: '>=18.0.0'}
@@ -5425,10 +5469,10 @@ snapshots:
 
   '@dcloudio/types@3.4.28': {}
 
-  '@dcloudio/uni-app-harmony@3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
+  '@dcloudio/uni-app-harmony@3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
     dependencies:
       '@dcloudio/uni-app-uts': 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vue@3.5.26(typescript@5.9.3))
-      '@dcloudio/uni-app-vite': 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
+      '@dcloudio/uni-app-vite': 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
       debug: 4.3.7
       fs-extra: 10.1.0
       licia: 1.41.1
@@ -5443,10 +5487,10 @@ snapshots:
       - vite
       - vue
 
-  '@dcloudio/uni-app-plus@3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
+  '@dcloudio/uni-app-plus@3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
     dependencies:
       '@dcloudio/uni-app-uts': 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vue@3.5.26(typescript@5.9.3))
-      '@dcloudio/uni-app-vite': 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
+      '@dcloudio/uni-app-vite': 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
       '@dcloudio/uni-app-vue': 3.0.0-4080420251103001
       debug: 4.3.7
       fs-extra: 10.1.0
@@ -5497,14 +5541,14 @@ snapshots:
       - ts-node
       - vue
 
-  '@dcloudio/uni-app-vite@3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
+  '@dcloudio/uni-app-vite@3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
     dependencies:
       '@dcloudio/uni-cli-shared': 3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vue@3.5.26(typescript@5.9.3))
       '@dcloudio/uni-i18n': 3.0.0-4080420251103001
       '@dcloudio/uni-nvue-styler': 3.0.0-4080420251103001
       '@dcloudio/uni-shared': 3.0.0-4080420251103001
       '@rollup/pluginutils': 5.1.0(rollup@4.55.1)
-      '@vitejs/plugin-vue': 5.2.4(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
+      '@vitejs/plugin-vue': 5.2.4(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
       '@vue/compiler-dom': 3.4.21
       '@vue/compiler-sfc': 3.4.21
       debug: 4.3.7
@@ -6024,7 +6068,7 @@ snapshots:
 
   '@dcloudio/uni-ui@1.5.11': {}
 
-  '@dcloudio/vite-plugin-uni@3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
+  '@dcloudio/vite-plugin-uni@3.0.0-4080420251103001(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))(postcss@8.5.6)(rollup@4.55.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
     dependencies:
       '@babel/core': 7.25.2
       '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2)
@@ -6033,9 +6077,9 @@ snapshots:
       '@dcloudio/uni-nvue-styler': 3.0.0-4080420251103001
       '@dcloudio/uni-shared': 3.0.0-4080420251103001
       '@rollup/pluginutils': 5.1.0(rollup@4.55.1)
-      '@vitejs/plugin-legacy': 5.3.2(terser@5.44.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))
-      '@vitejs/plugin-vue': 5.2.4(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
-      '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
+      '@vitejs/plugin-legacy': 5.3.2(terser@5.44.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))
+      '@vitejs/plugin-vue': 5.2.4(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
+      '@vitejs/plugin-vue-jsx': 3.1.0(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))
       '@vue/compiler-core': 3.4.21
       '@vue/compiler-dom': 3.4.21
       '@vue/compiler-sfc': 3.4.21
@@ -6052,7 +6096,7 @@ snapshots:
       picocolors: 1.1.0
       terser: 5.44.1
       unplugin-auto-import: 19.1.0(@vueuse/core@14.2.1(vue@3.5.26(typescript@5.9.3)))
-      vite: 5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1)
+      vite: 5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1)
     transitivePeerDependencies:
       - '@nuxt/kit'
       - '@vueuse/core'
@@ -6062,8 +6106,6 @@ snapshots:
       - ts-node
       - vue
 
-  '@epic-web/invariant@1.0.0': {}
-
   '@esbuild/aix-ppc64@0.20.2':
     optional: true
 
@@ -7049,16 +7091,16 @@ snapshots:
       - rollup
       - supports-color
 
-  '@uni-ku/root@1.4.1(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))':
+  '@uni-ku/root@1.4.1(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))':
     dependencies:
       '@vue/compiler-sfc': 3.4.21
       chokidar: 3.6.0
       jsonc-parser: 3.3.1
-      vite: 5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1)
+      vite: 5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1)
 
   '@vant/area-data@2.1.0': {}
 
-  '@vitejs/plugin-legacy@5.3.2(terser@5.44.1)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))':
+  '@vitejs/plugin-legacy@5.3.2(terser@5.44.1)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))':
     dependencies:
       '@babel/core': 7.25.2
       '@babel/preset-env': 7.28.5(@babel/core@7.25.2)
@@ -7069,23 +7111,23 @@ snapshots:
       regenerator-runtime: 0.14.1
       systemjs: 6.15.1
       terser: 5.44.1
-      vite: 5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1)
+      vite: 5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1)
     transitivePeerDependencies:
       - supports-color
 
-  '@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
+  '@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
     dependencies:
       '@babel/core': 7.25.2
       '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.25.2)
       '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.25.2)
-      vite: 5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1)
+      vite: 5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1)
       vue: 3.5.26(typescript@5.9.3)
     transitivePeerDependencies:
       - supports-color
 
-  '@vitejs/plugin-vue@5.2.4(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
+  '@vitejs/plugin-vue@5.2.4(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1))(vue@3.5.26(typescript@5.9.3))':
     dependencies:
-      vite: 5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1)
+      vite: 5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1)
       vue: 3.5.26(typescript@5.9.3)
 
   '@volar/language-core@2.4.28':
@@ -7638,6 +7680,11 @@ snapshots:
 
   cookie@0.6.0: {}
 
+  copy-anything@2.0.6:
+    dependencies:
+      is-what: 3.14.1
+    optional: true
+
   copy-anything@4.0.5:
     dependencies:
       is-what: 5.5.0
@@ -7648,11 +7695,6 @@ snapshots:
 
   core-js@3.47.0: {}
 
-  cross-env@10.1.0:
-    dependencies:
-      '@epic-web/invariant': 1.0.0
-      cross-spawn: 7.0.6
-
   cross-env@7.0.3:
     dependencies:
       cross-spawn: 7.0.6
@@ -7769,6 +7811,11 @@ snapshots:
 
   entities@7.0.0: {}
 
+  errno@0.1.8:
+    dependencies:
+      prr: 1.0.1
+    optional: true
+
   error-ex@1.3.4:
     dependencies:
       is-arrayish: 0.2.1
@@ -8255,6 +8302,11 @@ snapshots:
     dependencies:
       safer-buffer: 2.1.2
 
+  iconv-lite@0.6.3:
+    dependencies:
+      safer-buffer: 2.1.2
+    optional: true
+
   icss-replace-symbols@1.1.0: {}
 
   icss-utils@5.1.0(postcss@8.5.6):
@@ -8265,6 +8317,9 @@ snapshots:
 
   ignore@5.3.2: {}
 
+  image-size@0.5.5:
+    optional: true
+
   immutable@4.3.8: {}
 
   import-fresh@3.3.1:
@@ -8326,6 +8381,9 @@ snapshots:
 
   is-typedarray@1.0.0: {}
 
+  is-what@3.14.1:
+    optional: true
+
   is-what@5.5.0: {}
 
   isbinaryfile@5.0.2: {}
@@ -8812,6 +8870,21 @@ snapshots:
     dependencies:
       invert-kv: 3.0.1
 
+  less@4.5.1:
+    dependencies:
+      copy-anything: 2.0.6
+      parse-node-version: 1.0.1
+      tslib: 2.8.1
+    optionalDependencies:
+      errno: 0.1.8
+      graceful-fs: 4.2.11
+      image-size: 0.5.5
+      make-dir: 2.1.0
+      mime: 1.6.0
+      needle: 3.5.0
+      source-map: 0.6.1
+    optional: true
+
   leven@3.1.0: {}
 
   levn@0.4.1:
@@ -8884,6 +8957,12 @@ snapshots:
     dependencies:
       '@jridgewell/sourcemap-codec': 1.5.5
 
+  make-dir@2.1.0:
+    dependencies:
+      pify: 4.0.1
+      semver: 5.7.2
+    optional: true
+
   make-dir@4.0.0:
     dependencies:
       semver: 7.8.5
@@ -8978,6 +9057,12 @@ snapshots:
 
   natural-compare@1.4.0: {}
 
+  needle@3.5.0:
+    dependencies:
+      iconv-lite: 0.6.3
+      sax: 1.6.1
+    optional: true
+
   negotiator@0.6.3: {}
 
   node-int64@0.4.0: {}
@@ -9079,6 +9164,9 @@ snapshots:
       json-parse-even-better-errors: 2.3.1
       lines-and-columns: 1.2.4
 
+  parse-node-version@1.0.1:
+    optional: true
+
   parse5@6.0.1: {}
 
   parseurl@1.3.3: {}
@@ -9123,6 +9211,9 @@ snapshots:
 
   pify@2.3.0: {}
 
+  pify@4.0.1:
+    optional: true
+
   pinia-plugin-persistedstate@4.7.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))):
     dependencies:
       defu: 6.1.4
@@ -9253,6 +9344,9 @@ snapshots:
       forwarded: 0.2.0
       ipaddr.js: 1.9.1
 
+  prr@1.0.1:
+    optional: true
+
   psl@1.15.0:
     dependencies:
       punycode: 2.3.1
@@ -9419,12 +9513,18 @@ snapshots:
 
   sax@1.4.4: {}
 
+  sax@1.6.1:
+    optional: true
+
   saxes@5.0.1:
     dependencies:
       xmlchars: 2.2.0
 
   scule@1.3.0: {}
 
+  semver@5.7.2:
+    optional: true
+
   semver@6.3.1: {}
 
   semver@7.7.3: {}
@@ -9655,6 +9755,9 @@ snapshots:
     optionalDependencies:
       typescript: 5.9.3
 
+  tslib@2.8.1:
+    optional: true
+
   tsx@4.21.0:
     dependencies:
       esbuild: 0.27.2
@@ -9830,18 +9933,18 @@ snapshots:
 
   vary@1.1.2: {}
 
-  vite-tsconfig-paths@6.0.3(typescript@5.9.3)(vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1)):
+  vite-tsconfig-paths@6.0.3(typescript@5.9.3)(vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1)):
     dependencies:
       debug: 4.4.3
       globrex: 0.1.2
       tsconfck: 3.1.6(typescript@5.9.3)
     optionalDependencies:
-      vite: 5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1)
+      vite: 5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1)
     transitivePeerDependencies:
       - supports-color
       - typescript
 
-  vite@5.2.8(@types/node@25.0.3)(sass@1.78.0)(terser@5.44.1):
+  vite@5.2.8(@types/node@25.0.3)(less@4.5.1)(sass@1.78.0)(terser@5.44.1):
     dependencies:
       esbuild: 0.20.2
       postcss: 8.5.6
@@ -9849,6 +9952,7 @@ snapshots:
     optionalDependencies:
       '@types/node': 25.0.3
       fsevents: 2.3.3
+      less: 4.5.1
       sass: 1.78.0
       terser: 5.44.1
 

+ 0 - 4
scripts/.env.text_DEMO

@@ -1,4 +0,0 @@
-VITE_MODE=production_demo
-VITE_APP_TYPE=prod
-VITE_BASE_API=https://demoapi.yaoyi.net
-VITE_WX_APPID=wx956bb32e73073426

+ 183 - 0
scripts/build-mp-weixin.ts

@@ -0,0 +1,183 @@
+import { spawn } from 'child_process'
+import dotenv from 'dotenv'
+import { existsSync, readFileSync, writeFileSync } from 'fs'
+import { applyEdits, modify } from 'jsonc-parser'
+import path from 'path'
+
+type TargetEnvironment = 'luoxin' | 'pre' | 'prod'
+
+interface EnvironmentConfig {
+  appid: string
+  baseApi: string
+  envFile: string
+  label: string
+  viteMode: string
+  viteModeValue: string
+}
+
+const ROOT_DIR = path.resolve(__dirname, '..')
+const MANIFEST_PATH = path.resolve(ROOT_DIR, 'src/manifest.json')
+const UNI_CLI_PATH = path.resolve(ROOT_DIR, 'node_modules/@dcloudio/vite-plugin-uni/bin/uni.js')
+const BUILD_OUTPUT_DIR = path.resolve(ROOT_DIR, 'dist/build/mp-weixin')
+
+const ORIGINAL_APPID = 'wxd03398e1bff2b241'
+const LUOXIN_APPID = 'wx2a5a7f417981f250'
+
+const ENVIRONMENTS: Record<TargetEnvironment, EnvironmentConfig> = {
+  luoxin: {
+    appid: LUOXIN_APPID,
+    baseApi: 'https://luoxin.yaoyi.net',
+    envFile: '.env.production_LUOXIN',
+    label: '罗欣',
+    viteMode: 'production_LUOXIN',
+    viteModeValue: 'production_luoxin',
+  },
+  pre: {
+    appid: ORIGINAL_APPID,
+    baseApi: 'https://preapi.yaoyi.net',
+    envFile: '.env.pre',
+    label: '预发布',
+    viteMode: 'pre',
+    viteModeValue: 'production_pre',
+  },
+  prod: {
+    appid: ORIGINAL_APPID,
+    baseApi: 'https://api.yaoyi.net',
+    envFile: '.env.production',
+    label: '正式',
+    viteMode: 'production',
+    viteModeValue: 'production',
+  },
+}
+
+const TARGETS: TargetEnvironment[] = ['luoxin', 'pre', 'prod']
+
+const fail = (message: string): never => {
+  throw new Error(message)
+}
+
+const parseTarget = (value: string | undefined): TargetEnvironment => {
+  const target = TARGETS.find((item) => item === value)
+
+  if (!target) {
+    throw new Error(`环境必须是:${TARGETS.join(' / ')}`)
+  }
+
+  return target
+}
+
+const loadEnvironment = (target: TargetEnvironment): NodeJS.ProcessEnv => {
+  const config = ENVIRONMENTS[target]
+  const envPath = path.resolve(ROOT_DIR, config.envFile)
+
+  if (!existsSync(envPath)) {
+    fail(`环境文件不存在:${config.envFile}`)
+  }
+
+  const parsedEnv = dotenv.parse(readFileSync(envPath, 'utf8'))
+  const expectedValues: Record<string, string> = {
+    VITE_BASE_API: config.baseApi,
+    VITE_MODE: config.viteModeValue,
+    VITE_WX_APPID: config.appid,
+  }
+
+  for (const [key, expectedValue] of Object.entries(expectedValues)) {
+    if (parsedEnv[key] !== expectedValue) {
+      fail(
+        `${config.envFile} 中的 ${key} 配置错误:期望 ${expectedValue},实际 ${parsedEnv[key] || '未配置'}`
+      )
+    }
+  }
+
+  return {
+    ...process.env,
+    ...parsedEnv,
+  }
+}
+
+const injectManifestAppid = (manifestSource: string, appid: string): string => {
+  const edits = modify(manifestSource, ['mp-weixin', 'appid'], appid, {
+    formattingOptions: {
+      insertSpaces: true,
+      tabSize: 2,
+    },
+  })
+
+  return applyEdits(manifestSource, edits)
+}
+
+const runUniBuild = async (
+  target: TargetEnvironment,
+  processEnv: NodeJS.ProcessEnv
+): Promise<void> => {
+  const config = ENVIRONMENTS[target]
+
+  await new Promise<void>((resolve, reject) => {
+    const childProcess = spawn(
+      process.execPath,
+      [UNI_CLI_PATH, 'build', '-p', 'mp-weixin', '--mode', config.viteMode],
+      {
+        cwd: ROOT_DIR,
+        env: processEnv,
+        stdio: 'inherit',
+      }
+    )
+
+    childProcess.once('error', reject)
+    childProcess.once('exit', (code, signal) => {
+      if (code === 0) {
+        resolve()
+        return
+      }
+
+      reject(
+        new Error(
+          signal ? `uni-app 进程被信号 ${signal} 终止` : `uni-app 进程退出,错误码:${code}`
+        )
+      )
+    })
+  })
+}
+
+const validateBuildOutput = (expectedAppid: string): void => {
+  const projectConfigPath = path.resolve(BUILD_OUTPUT_DIR, 'project.config.json')
+
+  if (!existsSync(projectConfigPath)) {
+    fail(`构建产物不存在:${projectConfigPath}`)
+  }
+
+  const projectConfig = JSON.parse(readFileSync(projectConfigPath, 'utf8')) as {
+    appid?: string
+  }
+
+  if (projectConfig.appid !== expectedAppid) {
+    fail(`构建产物 AppID 校验失败:期望 ${expectedAppid},实际 ${projectConfig.appid || '未配置'}`)
+  }
+}
+
+const main = async (): Promise<void> => {
+  const target = parseTarget(process.argv[2])
+  const config = ENVIRONMENTS[target]
+  const processEnv = loadEnvironment(target)
+  const originalManifest = readFileSync(MANIFEST_PATH, 'utf8')
+
+  console.log(`\n[环境] ${config.label} (${target})`)
+  console.log(`[接口] ${config.baseApi}`)
+  console.log(`[AppID] ${config.appid}`)
+
+  writeFileSync(MANIFEST_PATH, injectManifestAppid(originalManifest, config.appid), 'utf8')
+
+  try {
+    await runUniBuild(target, processEnv)
+    validateBuildOutput(config.appid)
+    console.log(`[构建] 已生成 ${BUILD_OUTPUT_DIR}`)
+  } finally {
+    writeFileSync(MANIFEST_PATH, originalManifest, 'utf8')
+  }
+}
+
+void main().catch((error: unknown) => {
+  const message = error instanceof Error ? error.message : String(error)
+  console.error(`\n[失败] ${message}`)
+  process.exitCode = 1
+})

+ 0 - 62
scripts/inject-manifest.ts

@@ -1,62 +0,0 @@
-import dotenv from 'dotenv'
-import fs from 'fs'
-import { applyEdits, modify } from 'jsonc-parser'
-import path from 'path'
-
-/** 1️⃣ 只允许覆盖的模式(白名单) */
-type InjectMode = 'production_luoxin' | 'production_demo'
-
-const NEED_INJECT_MODES: InjectMode[] = ['production_luoxin', 'production_demo']
-
-/** 2️⃣ 从环境变量读取 VITE_MODE(由 cross-env 传入) */
-const mode = process.env.VITE_MODE as InjectMode | undefined
-
-/** 3️⃣ 根据 mode 主动加载对应的 .env 文件 */
-if (mode) {
-  const ENV_FILE_MAP: Record<InjectMode, string> = {
-    production_luoxin: '.env.production_LUOXIN',
-    production_demo: '.env.text_DEMO',
-  }
-
-  const envFile = ENV_FILE_MAP[mode]
-
-  if (envFile) {
-    dotenv.config({
-      path: path.resolve(process.cwd(), envFile),
-    })
-  }
-}
-
-/** 4️⃣ 非注入环境,直接退出(使用 manifest 默认值) */
-if (!mode || !NEED_INJECT_MODES.includes(mode)) {
-  console.log('ℹ️ 当前模式无需注入 appid,使用 manifest.json 默认值')
-  process.exit(0)
-}
-
-/** 5️⃣ 读取 appid(dotenv 已生效) */
-const appid = process.env.VITE_WX_APPID
-
-if (!appid) {
-  console.error(`❌ ${mode} 缺少 VITE_WX_APPID`)
-  process.exit(1)
-}
-
-/** 6️⃣ 读取 manifest.json(JSONC) */
-const manifestPath = path.resolve(__dirname, '../src/manifest.json')
-const manifestRaw = fs.readFileSync(manifestPath, 'utf-8')
-
-/** 7️⃣ 只修改 mp-weixin.appid(不破坏注释/结构) */
-const edits = modify(manifestRaw, ['mp-weixin', 'appid'], appid, {
-  formattingOptions: {
-    insertSpaces: true,
-    tabSize: 2,
-  },
-})
-
-const updatedManifest = applyEdits(manifestRaw, edits)
-
-/** 8️⃣ 写回文件 */
-fs.writeFileSync(manifestPath, updatedManifest)
-
-console.log(`⚠️ 当前为【${mode}】构建,appid 将被覆盖`)
-console.log(`✅ manifest.json appid 已覆盖: ${mode} → ${appid}`)

+ 3 - 2
src/manifest.json

@@ -50,9 +50,10 @@
   "quickapp": {},
   /* 小程序特有相关 */
   "mp-weixin": {
-    "appid": "wx956bb32e73073426",
+    "appid": "wxd03398e1bff2b241",
     "setting": {
-      "urlCheck": false
+      "urlCheck": false,
+      "minified": true
     },
     "usingComponents": true,
     "permission": {

+ 1 - 5
src/pages-task/task-form/utils/questionnaire.ts

@@ -1,4 +1,4 @@
-export type QuestionnaireEnvironment = 'prod' | 'demo' | 'pre' | 'luoxin'
+export type QuestionnaireEnvironment = 'prod' | 'pre' | 'luoxin'
 
 interface BuildQuestionnaireUrlOptions {
   questionnaireUrl: string
@@ -19,10 +19,6 @@ export const resolveQuestionnaireEnvironment = (baseApi: string): QuestionnaireE
     return 'prod'
   }
 
-  if (/^https?:\/\/demo\.yaoyi\.net(?:\/|$)/.test(normalizedBaseApi)) {
-    return 'demo'
-  }
-
   return 'pre'
 }