@lark-apaas/coding-preset-vite-react 1.0.18-alpha.20260820122252 → 1.0.18

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.
package/lib/index.d.ts CHANGED
@@ -29,6 +29,12 @@ import { type UserConfig } from 'vite';
29
29
  * - MIAODA_FONTS_MIRROR_OFF `1` 关 Google Fonts 代理替换
30
30
  * - MIAODA_APP_TYPE 妙搭应用类型(数字字符串,供 lite Safety 徽标判断)
31
31
  * - MIAODA_APP_ARCH_TYPE 妙搭应用架构类型(数字字符串)
32
+ * - MIAODA_BUILD_TARGET `standalone` 切到离线产物构建(miaoda app export-standalone 注入):
33
+ * rollup output 换 iife(去 manualChunks)、挂 standalone-html 剥掉
34
+ * 入口 script 的 type="module"/crossorigin、摘掉 slardar / og-meta /
35
+ * view-context 三个平台注入插件。
36
+ * **严格相等判断**:不设或值不是 `standalone`(含大写、拼错)一律
37
+ * 按现有平台构建行为走,不做模糊匹配。
32
38
  */
33
39
  export interface PresetOptions {
34
40
  /** fullstack 模式下 NestJS server 端口,默认 3000;dev-proxy 反代目标 */
@@ -37,7 +43,7 @@ export interface PresetOptions {
37
43
  export declare function defineConfig(overrides?: UserConfig, options?: PresetOptions): UserConfig;
38
44
  export default defineConfig;
39
45
  export { routesPlugin, parseRoutes } from './plugins/routes';
40
- export { htmlMinifyPlugin, minifyHtmlWithHbsProtection } from './plugins/html-minify';
46
+ export { htmlMinifyPlugin, minifyHtmlWithHbsProtection, } from './plugins/html-minify';
41
47
  export { staticAssetsPlugin } from './plugins/static-assets';
42
48
  export { capabilitiesBundlePlugin } from './plugins/capabilities';
43
49
  export { errorOverlayPlugin } from './plugins/error-overlay';
@@ -53,6 +59,8 @@ export { viteClientPatchPlugin } from './plugins/vite-client-patch';
53
59
  export { invalidateOnOutdatedDepPlugin } from './plugins/invalidate-on-outdated-dep';
54
60
  export { slardarPlugin } from './plugins/slardar';
55
61
  export { devLogsPlugin } from './plugins/dev-logs';
62
+ export { standaloneHtmlPlugin } from './plugins/standalone-html';
63
+ export { standaloneRouterPlugin } from './plugins/standalone-router';
56
64
  export { devProxyPlugin } from './plugins/dev-proxy';
57
65
  export { htmlOutputPlugin } from './plugins/html-output';
58
66
  export { basenamePlugin } from './plugins/basename';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,UAAU,EAAsB,MAAM,MAAM,CAAC;AAoErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAC1B,SAAS,GAAE,UAAe,EAC1B,OAAO,GAAE,aAAkB,GAC1B,UAAU,CAoYZ;AAGD,eAAe,YAAY,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,iBAAiB,EACjB,qCAAqC,GACtC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,MAAM,CAAC;AA0Ed;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAC1B,SAAS,GAAE,UAAe,EAC1B,OAAO,GAAE,aAAkB,GAC1B,UAAU,CAodZ;AAGD,eAAe,YAAY,CAAC;AAG5B,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EACL,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EACL,iBAAiB,EACjB,qCAAqC,GACtC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC"}
package/lib/index.js CHANGED
@@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.registerSnapDomProxyMiddleware = exports.normalizeBasePathWithoutTrailingSlash = exports.normalizeBasePath = exports.serverLogPlugin = exports.basenamePlugin = exports.htmlOutputPlugin = exports.devProxyPlugin = exports.devLogsPlugin = exports.slardarPlugin = exports.invalidateOnOutdatedDepPlugin = exports.viteClientPatchPlugin = exports.polyfillPlugin = exports.fontsMirrorPlugin = exports.ogMetaPlugin = exports.moduleAliasPlugin = exports.viewContextPlugin = exports.healthMiddlewarePlugin = exports.wsWatchdogPlugin = exports.hmrTimingPlugin = exports.errorOverlayPlugin = exports.capabilitiesBundlePlugin = exports.staticAssetsPlugin = exports.minifyHtmlWithHbsProtection = exports.htmlMinifyPlugin = exports.parseRoutes = exports.routesPlugin = void 0;
39
+ exports.registerSnapDomProxyMiddleware = exports.normalizeBasePathWithoutTrailingSlash = exports.normalizeBasePath = exports.serverLogPlugin = exports.basenamePlugin = exports.htmlOutputPlugin = exports.devProxyPlugin = exports.standaloneRouterPlugin = exports.standaloneHtmlPlugin = exports.devLogsPlugin = exports.slardarPlugin = exports.invalidateOnOutdatedDepPlugin = exports.viteClientPatchPlugin = exports.polyfillPlugin = exports.fontsMirrorPlugin = exports.ogMetaPlugin = exports.moduleAliasPlugin = exports.viewContextPlugin = exports.healthMiddlewarePlugin = exports.wsWatchdogPlugin = exports.hmrTimingPlugin = exports.errorOverlayPlugin = exports.capabilitiesBundlePlugin = exports.staticAssetsPlugin = exports.minifyHtmlWithHbsProtection = exports.htmlMinifyPlugin = exports.parseRoutes = exports.routesPlugin = void 0;
40
40
  exports.defineConfig = defineConfig;
41
41
  const fs = __importStar(require("node:fs"));
42
42
  const path = __importStar(require("node:path"));
@@ -61,6 +61,8 @@ const vite_client_patch_1 = require("./plugins/vite-client-patch");
61
61
  const invalidate_on_outdated_dep_1 = require("./plugins/invalidate-on-outdated-dep");
62
62
  const slardar_1 = require("./plugins/slardar");
63
63
  const dev_logs_1 = require("./plugins/dev-logs");
64
+ const standalone_html_1 = require("./plugins/standalone-html");
65
+ const standalone_router_1 = require("./plugins/standalone-router");
64
66
  // fullstack-only 4 件套(MIAODA_APP_TYPE === '3' 时启用)
65
67
  const dev_proxy_1 = require("./plugins/dev-proxy");
66
68
  const html_output_1 = require("./plugins/html-output");
@@ -111,13 +113,17 @@ function defineConfig(overrides = {}, options = {}) {
111
113
  // 通过 env 而非 vite.config 第二参,让同一份 preset 同时给 jsPage 和 fullstack 用,
112
114
  // user vite.config 不用感知。
113
115
  const isFullstack = process.env.MIAODA_APP_TYPE === '3';
116
+ // standalone 构建:产出可脱离妙搭平台本地访问的产物(miaoda app export-standalone 注入)。
117
+ // 与 isFullstack 同形态——单个 derived const,不在各处读 env。
118
+ // 严格相等:拼错值按平台模式走,不猜测意图。
119
+ const isStandalone = process.env.MIAODA_BUILD_TARGET === 'standalone';
114
120
  const fullstackServerPort = options.serverPort ?? 3000;
115
121
  // ASSETS_CDN_PATH 来自 miaoda-cli 注入的 MIAODA_RESOURCE_CDN_PREFIX,通常是完整 URL
116
122
  // (`https://cdn.bytetos.com/...`)。必须用 URL-safe 的 normalize,不能强加 `/` 前缀
117
123
  // —— 否则会变成 `/https://cdn.bytetos.com/...` 直接破掉 Vite 的 base 替换。
118
124
  const assetsCdnPath = (0, normalize_base_path_1.normalizeBasePathWithoutTrailingSlash)(process.env.ASSETS_CDN_PATH);
119
125
  // dev / prod base 来源不同:dev 完全用 clientBasePath,prod 优先 CDN
120
- const publicPath = isDev ? clientBasePath : (assetsCdnPath || clientBasePath);
126
+ const publicPath = isDev ? clientBasePath : assetsCdnPath || clientBasePath;
121
127
  const base = publicPath ? `${publicPath}/` : '/';
122
128
  // 从 clientBasePath 提取 appId 给 viewContext 用
123
129
  const isNewPathFormat = /^\/app\/[^/]/.test(clientBasePath);
@@ -143,7 +149,8 @@ function defineConfig(overrides = {}, options = {}) {
143
149
  'process.env.CLIENT_BASE_PATH': JSON.stringify(clientBasePath),
144
150
  __APP_BASE_PATH__: JSON.stringify(clientBasePath),
145
151
  // 未设置时替换为字面量 `undefined`,让 `??` fallback 正确触发(`""`/`undefined` 行为不同)
146
- 'process.env.FORCE_FRAMEWORK_DOMAIN_MAIN': process.env.FORCE_FRAMEWORK_DOMAIN_MAIN
152
+ 'process.env.FORCE_FRAMEWORK_DOMAIN_MAIN': process.env
153
+ .FORCE_FRAMEWORK_DOMAIN_MAIN
147
154
  ? JSON.stringify(process.env.FORCE_FRAMEWORK_DOMAIN_MAIN)
148
155
  : 'undefined',
149
156
  'process.env.CWD': JSON.stringify(''),
@@ -161,8 +168,14 @@ function defineConfig(overrides = {}, options = {}) {
161
168
  'process.env.MIAODA_APP_SOURCE': process.env.MIAODA_APP_SOURCE
162
169
  ? JSON.stringify(process.env.MIAODA_APP_SOURCE)
163
170
  : 'undefined',
171
+ // standalone 导出构建标记(miaoda app pack)。client-toolkit* 的 AppContainer 据此
172
+ // 不挂 Safety 徽标 / 豆包水印 —— 那些判据是 fail-open 的,离线产物里必然显示。
173
+ 'process.env.MIAODA_BUILD_TARGET': process.env.MIAODA_BUILD_TARGET
174
+ ? JSON.stringify(process.env.MIAODA_BUILD_TARGET)
175
+ : 'undefined',
164
176
  // 部署环境(boe/pre/online),豆包水印「投诉与举报」域名据此选
165
- 'process.env.FORCE_FRAMEWORK_ENVIRONMENT': process.env.FORCE_FRAMEWORK_ENVIRONMENT
177
+ 'process.env.FORCE_FRAMEWORK_ENVIRONMENT': process.env
178
+ .FORCE_FRAMEWORK_ENVIRONMENT
166
179
  ? JSON.stringify(process.env.FORCE_FRAMEWORK_ENVIRONMENT)
167
180
  : 'undefined',
168
181
  };
@@ -290,23 +303,38 @@ function defineConfig(overrides = {}, options = {}) {
290
303
  // OG Meta tags + title + favicon 注入 HBS 占位符({{appName}} / {{appAvatar}} 等)
291
304
  // 由部署运行时(vefaas)调 platform API 拿 appInfo 后做 hbs replace;
292
305
  // dev 预览看到的是字面占位符,业务侧用 useAppInfo + useEffect setTitle 兜底
293
- (0, og_meta_1.ogMetaPlugin)(),
306
+ //
307
+ // standalone 下摘掉:没有 vefaas 替换环节,留着会让标签页标题显示字面 "{{appName}}"
308
+ !isStandalone && (0, og_meta_1.ogMetaPlugin)(),
294
309
  // head 顺序敏感:slardar 必须排在 viewContext **之前**——
295
310
  // Vite 同 bucket(head-prepend)是"后执行者插更前"。
296
311
  // 数组里 slardar 在前 → HTML 里 viewContext 在 slardar 之上 → onload 时拿得到 window.tenantId
297
- (0, slardar_1.slardarPlugin)({ bid: 'apaas_miaoda' }),
298
- (0, view_context_1.viewContextPlugin)({ appId: isDev ? appId : undefined, clientBasePath }),
312
+ //
313
+ // standalone 下两者都摘:slardar 注入 4 个外链脚本(Slardar / Tea / performance),
314
+ // viewContext prod 注入 {{userId}} / {{tenantId}} HBS 占位符 —— 脱离 vefaas 没人替换,
315
+ // window.tenantId 会是字符串 "{{tenantId}}",业务代码 if (tenantId) 会判成真值。
316
+ !isStandalone && (0, slardar_1.slardarPlugin)({ bid: 'apaas_miaoda' }),
317
+ !isStandalone &&
318
+ (0, view_context_1.viewContextPlugin)({ appId: isDev ? appId : undefined, clientBasePath }),
299
319
  // basename 运行时注入:改写入口文件的 process.env.CLIENT_BASE_PATH 为运行时读 window.__BASENAME__
300
320
  // enforce:'pre' 确保在 vite define 替换之前执行,只影响入口文件,SDK 内部代码保持编译期常量
301
321
  (0, basename_injection_1.basenameInjectionPlugin)({ envBasePath: clientBasePath }),
302
322
  // prod only: 老浏览器 polyfill(按需加载)
303
- !isDev && (0, polyfill_1.polyfillPlugin)(),
323
+ // standalone 下不挂:该形态**不承诺浏览器兼容性**——接口失败、CDN 外链不本地化
324
+ // 都已是明确口径,老浏览器支持同理。带着 polyfill 反而是个没验证过的承诺
325
+ // (standalone 产物从未在老浏览器上测过,file:// 下还可能有别的未知问题)。
326
+ !isDev && !isStandalone && (0, polyfill_1.polyfillPlugin)(),
327
+ // standalone:BrowserRouter → HashRouter。enforce:'pre',必须早于 react() 转译。
328
+ // 不换的话产物首屏直接落 404 页(pathname 匹配不上任何 Route),实测确认。
329
+ isStandalone && (0, standalone_router_1.standaloneRouterPlugin)(),
330
+ // standalone:剥掉 Vite 写死的 type="module" / crossorigin,否则 file:// 下被 CORS 拦
331
+ isStandalone && (0, standalone_html_1.standaloneHtmlPlugin)(),
304
332
  // build-time HTML minify(HBS 占位符保护)
305
333
  (0, html_minify_1.htmlMinifyPlugin)(),
306
334
  // dev only DX 插件
307
335
  isDev && (0, hmr_timing_1.hmrTimingPlugin)(),
308
336
  isDev && (0, ws_watchdog_1.wsWatchdogPlugin)({ clientBasePath }),
309
- isDev && (0, health_1.healthMiddlewarePlugin)(),
337
+ isDev && (0, health_1.healthMiddlewarePlugin)({ serverPort: fullstackServerPort }),
310
338
  // 客户端日志收集 endpoint(POST /dev/logs/collect{,-batch})
311
339
  isDev && (0, dev_logs_1.devLogsPlugin)({ basePath: clientBasePath }),
312
340
  // Google Fonts → 妙搭字体代理(编译时字符串 replace;dev / build 都有用)
@@ -321,10 +349,11 @@ function defineConfig(overrides = {}, options = {}) {
321
349
  appId,
322
350
  }),
323
351
  // dev 写出 dist/client/index.html 让 NestJS HBS 渲染;prod 修正 outDir + minify
324
- isFullstack && (0, html_output_1.htmlOutputPlugin)({
325
- isDev,
326
- outDir: path.resolve(rootDir, 'dist/client'),
327
- }),
352
+ isFullstack &&
353
+ (0, html_output_1.htmlOutputPlugin)({
354
+ isDev,
355
+ outDir: path.resolve(rootDir, 'dist/client'),
356
+ }),
328
357
  // CLIENT_BASE_PATH 占位符替换为运行时 window.__BASENAME__
329
358
  isFullstack && (0, basename_1.basenamePlugin)({ envBasePath: clientBasePath }),
330
359
  // 挂 devtool-kits 的 dev-logs middleware:提供 /server-logs SSE 等 endpoints
@@ -362,7 +391,9 @@ function defineConfig(overrides = {}, options = {}) {
362
391
  allowedHosts: true,
363
392
  headers: {
364
393
  ...(process.env.FORCE_FRAMEWORK_DOMAIN_MAIN
365
- ? { 'Access-Control-Allow-Origin': process.env.FORCE_FRAMEWORK_DOMAIN_MAIN }
394
+ ? {
395
+ 'Access-Control-Allow-Origin': process.env.FORCE_FRAMEWORK_DOMAIN_MAIN,
396
+ }
366
397
  : {}),
367
398
  },
368
399
  watch: {
@@ -372,7 +403,12 @@ function defineConfig(overrides = {}, options = {}) {
372
403
  },
373
404
  // 优先级:独立 WS 域名 > 反代 wss > 本地 ws;切域名时 clientPort 固定 443
374
405
  hmr: process.env.MIAODA_WS_HOST
375
- ? { protocol: 'wss', host: process.env.MIAODA_WS_HOST, clientPort: 443, path: '/ws' }
406
+ ? {
407
+ protocol: 'wss',
408
+ host: process.env.MIAODA_WS_HOST,
409
+ clientPort: 443,
410
+ path: '/ws',
411
+ }
376
412
  : process.env.FORCE_FRAMEWORK_DOMAIN_MAIN
377
413
  ? { protocol: 'wss', path: '/ws' }
378
414
  : { path: '/ws' },
@@ -387,23 +423,54 @@ function defineConfig(overrides = {}, options = {}) {
387
423
  outDir: path.resolve(rootDir, 'dist/client'),
388
424
  // build.sh 已经在 vite build 前 `rm -rf dist`,这里不再让 vite 自己清
389
425
  emptyOutDir: false,
390
- sourcemap: isDev ? true : 'hidden',
426
+ // standalone 不产 sourcemap:产物拿去分发,map sourcesContent 内嵌原始源码
427
+ // (实测真实应用 486 条、含 12 个业务文件);且 hidden 模式产物里没有
428
+ // sourceMappingURL 引用它,纯属白生成。
429
+ sourcemap: isStandalone ? false : isDev ? true : 'hidden',
391
430
  minify: !isDev,
392
431
  cssTarget: ['ios12', 'safari12', 'chrome80'],
432
+ // standalone 刻意产单 chunk,体积必然超默认 500kB 阈值。该警告给的三条建议
433
+ // (动态 import 拆包 / 开 codeSplitting / 调阈值)前两条正是 standalone 不能做的,
434
+ // 留着是纯噪音,会盖住真正需要注意的构建输出。
435
+ ...(isStandalone
436
+ ? { chunkSizeWarningLimit: Number.POSITIVE_INFINITY }
437
+ : {}),
393
438
  rollupOptions: {
394
439
  input: resolveClientPath(rootDir, 'index.html'),
395
- output: {
396
- // 按依赖拆 chunk,优化缓存和并行加载
397
- manualChunks(id) {
398
- if (id.includes('@lark-apaas/client-toolkit-lite'))
399
- return 'toolkit';
400
- if (id.includes('@radix-ui'))
401
- return 'radix';
402
- if (id.includes('@data-loom'))
403
- return 'dataloom';
404
- return undefined;
440
+ // standalone:产物要能在 file:// 下打开,而 <script type="module"> 在 opaque
441
+ // origin 下必被 CORS 拦,故 JS 体必须是经典脚本 → iife。
442
+ //
443
+ // ⚠️ **iife 下 rolldown 会把 `import.meta` 整体替换成 `{}`**,并对每个出现点
444
+ // 打 EMPTY_IMPORT_META 警告。刻意**不消音**(试过 `transform.define:
445
+ // {'import.meta':'{}'}` 能清零,但会把信号一起埋掉)。两处来源已实测分析:
446
+ // 1. react-router dist/development:`if (... && import.meta.hot)` 真值判断,
447
+ // `{}` → undefined → falsy,完全安全。
448
+ // 2. vite 内部 preload-helper:`new URL(spec, import.meta.url)` ——
449
+ // `import.meta.url` undefined 时**会抛 TypeError**。当前不炸,是因为
450
+ // iife ⇒ codeSplitting:false ⇒ 动态 import 被内联 ⇒ 待预加载的 deps 为空,
451
+ // 那段代码根本不执行。
452
+ //
453
+ // **即:安全性依赖「iife 蕴含无代码分割」这个隐式耦合。** 若哪天让 standalone
454
+ // 重新开启代码分割,preload-helper 会真的跑起来并抛错 —— 那条警告就是提示。
455
+ // iife 蕴含 codeSplitting:false,此时带 manualChunks 会直接 build fail:
456
+ // Invalid configuration: "output.manualChunks" cannot be used when
457
+ // "output.codeSplitting" is set to false.
458
+ // ⚠️ 只切 format 不够——Vite 8 的 build-html 仍会写死 type="module" crossorigin,
459
+ // 剥属性由 standaloneHtmlPlugin 负责(另见 Task 1.5)。
460
+ output: isStandalone
461
+ ? { format: 'iife' }
462
+ : {
463
+ // 按依赖拆 chunk,优化缓存和并行加载
464
+ manualChunks(id) {
465
+ if (id.includes('@lark-apaas/client-toolkit-lite'))
466
+ return 'toolkit';
467
+ if (id.includes('@radix-ui'))
468
+ return 'radix';
469
+ if (id.includes('@data-loom'))
470
+ return 'dataloom';
471
+ return undefined;
472
+ },
405
473
  },
406
- },
407
474
  },
408
475
  copyPublicDir: true,
409
476
  },
@@ -446,7 +513,9 @@ function defineConfig(overrides = {}, options = {}) {
446
513
  }
447
514
  }
448
515
  // SnapDom proxy(client 截图库的跨域转发)
449
- (0, snapdom_proxy_1.registerSnapDomProxyMiddleware)(server.middlewares, { baseUrl: clientBasePath });
516
+ (0, snapdom_proxy_1.registerSnapDomProxyMiddleware)(server.middlewares, {
517
+ baseUrl: clientBasePath,
518
+ });
450
519
  // 注:客户端日志收集 endpoint 现在由 devLogsPlugin 自己挂载(plugin 数组里),
451
520
  // 这里不再做集中注册——以前依赖 @lark-apaas/devtool-kits 已彻底去除
452
521
  },
@@ -493,6 +562,10 @@ var slardar_2 = require("./plugins/slardar");
493
562
  Object.defineProperty(exports, "slardarPlugin", { enumerable: true, get: function () { return slardar_2.slardarPlugin; } });
494
563
  var dev_logs_2 = require("./plugins/dev-logs");
495
564
  Object.defineProperty(exports, "devLogsPlugin", { enumerable: true, get: function () { return dev_logs_2.devLogsPlugin; } });
565
+ var standalone_html_2 = require("./plugins/standalone-html");
566
+ Object.defineProperty(exports, "standaloneHtmlPlugin", { enumerable: true, get: function () { return standalone_html_2.standaloneHtmlPlugin; } });
567
+ var standalone_router_2 = require("./plugins/standalone-router");
568
+ Object.defineProperty(exports, "standaloneRouterPlugin", { enumerable: true, get: function () { return standalone_router_2.standaloneRouterPlugin; } });
496
569
  // fullstack-only 4 件套(option fullstack:true 启用,也可单独引入)
497
570
  var dev_proxy_2 = require("./plugins/dev-proxy");
498
571
  Object.defineProperty(exports, "devProxyPlugin", { enumerable: true, get: function () { return dev_proxy_2.devProxyPlugin; } });
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * `/dev/health` 的判定实现。
3
+ *
4
+ * 协议(飞书文档 - 启动状态梳理):
5
+ * ```jsonc
6
+ * { "status": "pending" | "ready" | "backend_failed", "ready": boolean }
7
+ * ```
8
+ * - curl 无法访问 → 外壳视为服务启动中,超时后流转「应用启动失败」
9
+ * - status: pending → 应用启动中
10
+ * - status: ready → 流转到前端「应用加载中」
11
+ * - status: backend_failed → 应用启动失败,message 带原因
12
+ *
13
+ * `ready` 恒等于 `status === 'ready'`,是投影而非独立信号(给只认布尔的老外壳用)。
14
+ *
15
+ * ⚠️ **这份实现在多个 preset 里各存一份**(fullstack-vite-preset /
16
+ * coding-vite-preset / coding-preset-vite-react / fullstack-rspack-preset)。
17
+ * 刻意不抽公共包:这些 preset 的公共依赖 `@lark-apaas/devtool-kits` 带
18
+ * ts-morph / babel / pino,为几十行探测逻辑把它变成硬依赖不划算。
19
+ * 代价是**改一处必须同步其余几处**,改动前先全仓搜 `HEALTH_ENDPOINT`。
20
+ */
21
+ export declare const HEALTH_ENDPOINT = "/dev/health";
22
+ export type HealthStatus = 'pending' | 'ready' | 'backend_failed';
23
+ export interface HealthPayload {
24
+ /** 恒等于 `status === 'ready'`,是 status 的投影 */
25
+ ready: boolean;
26
+ status: HealthStatus;
27
+ /** 仅 backend_failed 时出现,供展示与排查;外壳不得据其文本做流程决策 */
28
+ message?: string;
29
+ }
30
+ /**
31
+ * 这个应用是否有 Node 后端。
32
+ *
33
+ * 同一套 preset 同时服务全栈和纯前端应用(jsPage / apex / 升级链路上的存量
34
+ * 应用)。纯前端应用根本没有进程监听 SERVER_PORT,若一律按有后端处理,
35
+ * 它们会在超时后被误报 `backend_failed`——正常应用被判成启动失败。
36
+ *
37
+ * 方向刻意保守:**只有明确是 fullstack 才认为有后端**。最坏是全栈故障探不出
38
+ * (功能失效),而不是正常前端应用被误判(破坏可用应用)。
39
+ */
40
+ export declare function isFullstackApp(): boolean;
41
+ /**
42
+ * 探测本机端口是否有人监听。只做 TCP 连接,不发 HTTP。
43
+ *
44
+ * **必须同时探 IPv4 和 IPv6**:nrf 模板的 `main.ts` 用
45
+ * `app.listen(port, process.env.SERVER_HOST || 'localhost')`,而 `localhost`
46
+ * 在 macOS / 部分 Node 版本下解析到 `::1`,Nest 便只监听 IPv6 环回。
47
+ * 此时只探 `127.0.0.1` 会稳定拿到 ECONNREFUSED,把活着的服务误判成挂了。
48
+ * 实测:`lsof` 显示 `TCP [::1]:3000 (LISTEN)`,`127.0.0.1` 连接被拒。
49
+ */
50
+ export declare function probePort(port: number, hosts?: string[], timeoutMs?: number): Promise<boolean>;
51
+ /**
52
+ * 构造「后端编译当前是不是挂着的」判定器。
53
+ *
54
+ * 这是对超时的**加速**,不是替代:命中就立刻判失败不用干等,没命中什么都不做、
55
+ * 继续走超时兜底。所以 nest / tsc 换了输出格式导致匹配不到时,最坏只是「退回等
56
+ * 超时」,既不会误报也不会卡住用户——方向天然安全。
57
+ *
58
+ * **必须记基线偏移**:`dev.js` 以 append 模式写 `server.std.log`,日志跨 dev
59
+ * 会话累积。不设基线的话,上一次会话遗留的 `Found 1 error` 会让新会话刚启动
60
+ * 就误报。构造时记下当前文件大小,之后只看这之后写入的内容;文件被截断或轮转
61
+ * (size < 基线)时基线归零。
62
+ */
63
+ export declare function createCompileErrorScanner(logDir: string): () => boolean;
64
+ export interface HealthProbeOptions {
65
+ /** dev server 自身是否已 listen */
66
+ isClientReady: () => boolean;
67
+ /** 本应用是否有 Node 后端;缺省按 MIAODA_APP_TYPE 判定 */
68
+ hasServer?: boolean;
69
+ /** 后端端口;缺省读 SERVER_PORT,再兜底 3000 */
70
+ serverPort?: number;
71
+ /** 后端绑定的 host;缺省读 SERVER_HOST。探测仍会兜底同时试 127.0.0.1 与 ::1 */
72
+ serverHost?: string;
73
+ /** server.std.log 所在目录;缺省读 LOG_DIR,再兜底 ./logs */
74
+ logDir?: string;
75
+ /** 超时上限(ms),可用 MIAODA_HEALTH_TIMEOUT_MS 覆写 */
76
+ timeoutMs?: number;
77
+ }
78
+ /**
79
+ * 构造健康探测函数。
80
+ *
81
+ * `status` 判定顺序:
82
+ * 0. 前端 dev server 都还没起来 → `pending`;
83
+ * 1. 本应用没有后端(纯前端) → `ready`,永不 `backend_failed`;
84
+ * 2. 日志尾部显示编译没过 → `backend_failed`,不用干等(无条件优先,
85
+ * 因为端口还通也可能是 nest watch 留着旧进程在服务旧代码);
86
+ * 3. 后端端口连得上 → `ready`;
87
+ * 4. 都不是 → 超时前 `pending`,超时后 `backend_failed`。
88
+ *
89
+ * 有状态是因为要记住 dev server 启动时刻(计时锚点)和日志基线偏移。
90
+ */
91
+ export declare function createHealthProbe(options: HealthProbeOptions): () => Promise<HealthPayload>;
92
+ //# sourceMappingURL=health-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-core.d.ts","sourceRoot":"","sources":["../../src/plugins/health-core.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,gBAAgB,CAAC;AAElE,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAyBD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAkCD;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAM,EAAO,EACpB,SAAS,SAAO,GACf,OAAO,CAAC,OAAO,CAAC,CAKlB;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,OAAO,CAqCvE;AAED,MAAM,WAAW,kBAAkB;IACjC,8BAA8B;IAC9B,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CA4C3F"}
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HEALTH_ENDPOINT = void 0;
7
+ exports.isFullstackApp = isFullstackApp;
8
+ exports.probePort = probePort;
9
+ exports.createCompileErrorScanner = createCompileErrorScanner;
10
+ exports.createHealthProbe = createHealthProbe;
11
+ const node_fs_1 = __importDefault(require("node:fs"));
12
+ const node_net_1 = __importDefault(require("node:net"));
13
+ const node_path_1 = __importDefault(require("node:path"));
14
+ /**
15
+ * `/dev/health` 的判定实现。
16
+ *
17
+ * 协议(飞书文档 - 启动状态梳理):
18
+ * ```jsonc
19
+ * { "status": "pending" | "ready" | "backend_failed", "ready": boolean }
20
+ * ```
21
+ * - curl 无法访问 → 外壳视为服务启动中,超时后流转「应用启动失败」
22
+ * - status: pending → 应用启动中
23
+ * - status: ready → 流转到前端「应用加载中」
24
+ * - status: backend_failed → 应用启动失败,message 带原因
25
+ *
26
+ * `ready` 恒等于 `status === 'ready'`,是投影而非独立信号(给只认布尔的老外壳用)。
27
+ *
28
+ * ⚠️ **这份实现在多个 preset 里各存一份**(fullstack-vite-preset /
29
+ * coding-vite-preset / coding-preset-vite-react / fullstack-rspack-preset)。
30
+ * 刻意不抽公共包:这些 preset 的公共依赖 `@lark-apaas/devtool-kits` 带
31
+ * ts-morph / babel / pino,为几十行探测逻辑把它变成硬依赖不划算。
32
+ * 代价是**改一处必须同步其余几处**,改动前先全仓搜 `HEALTH_ENDPOINT`。
33
+ */
34
+ exports.HEALTH_ENDPOINT = '/dev/health';
35
+ /** 后端端口多久没起来就判失败。主要服务「首次进入应用」这一个场景。 */
36
+ const DEFAULT_TIMEOUT_MS = 30000;
37
+ /** 探测结果缓存时长,避免外壳高频轮询时每次建连 */
38
+ const PROBE_CACHE_MS = 1000;
39
+ /** 只读日志尾部这么多字节,避免日志膨胀后拖慢探测 */
40
+ const TAIL_BYTES = 32 * 1024;
41
+ /**
42
+ * `nest start --watch` 每轮编译结束都会打这一行,N>0 即本轮没过。
43
+ * `errors?` 的 `s` 只为可读性——`error` 本就是 `errors` 的前缀,加不加都能匹配。
44
+ */
45
+ const COMPILE_RESULT = /Found (\d+) errors?/g;
46
+ // eslint-disable-next-line no-control-regex
47
+ const ANSI = /\u001b\[[0-9;]*[a-zA-Z]/g;
48
+ /**
49
+ * 妙搭 fullstack stack 的 `MIAODA_APP_TYPE` 取值。口径与
50
+ * `@lark-apaas/coding-preset-vite-react` 的 `isFullstack` 一致——health 判定
51
+ * 与 dev 反代必须对同一个应用给出相同结论,否则会出现「反代到 3000 但 health
52
+ * 说没有后端」这类自相矛盾的状态。
53
+ */
54
+ const FULLSTACK_APP_TYPE = '3';
55
+ /**
56
+ * 这个应用是否有 Node 后端。
57
+ *
58
+ * 同一套 preset 同时服务全栈和纯前端应用(jsPage / apex / 升级链路上的存量
59
+ * 应用)。纯前端应用根本没有进程监听 SERVER_PORT,若一律按有后端处理,
60
+ * 它们会在超时后被误报 `backend_failed`——正常应用被判成启动失败。
61
+ *
62
+ * 方向刻意保守:**只有明确是 fullstack 才认为有后端**。最坏是全栈故障探不出
63
+ * (功能失效),而不是正常前端应用被误判(破坏可用应用)。
64
+ */
65
+ function isFullstackApp() {
66
+ return process.env.MIAODA_APP_TYPE === FULLSTACK_APP_TYPE;
67
+ }
68
+ /**
69
+ * 端口取值收口。**必须校验合法性**:调用方常写 `Number(process.env.SERVER_PORT)`,
70
+ * env 缺失或非数字时会得到 `NaN`,而 `??` 只挡 null/undefined 挡不住 NaN,
71
+ * NaN 会一路透传到探测端把「连不上」坐实,最终把正常应用误判成 backend_failed。
72
+ */
73
+ function toPort(value) {
74
+ const n = Number(value);
75
+ return Number.isInteger(n) && n >= 1 && n <= 65535 ? n : undefined;
76
+ }
77
+ function connectOnce(port, host, timeoutMs) {
78
+ return new Promise((resolve) => {
79
+ const socket = new node_net_1.default.Socket();
80
+ let settled = false;
81
+ const done = (alive) => {
82
+ if (settled)
83
+ return;
84
+ settled = true;
85
+ socket.destroy();
86
+ resolve(alive);
87
+ };
88
+ socket.setTimeout(timeoutMs);
89
+ socket.once('connect', () => done(true));
90
+ socket.once('timeout', () => done(false));
91
+ socket.once('error', () => done(false));
92
+ try {
93
+ socket.connect(port, host);
94
+ }
95
+ catch {
96
+ done(false);
97
+ }
98
+ });
99
+ }
100
+ /**
101
+ * 探测本机端口是否有人监听。只做 TCP 连接,不发 HTTP。
102
+ *
103
+ * **必须同时探 IPv4 和 IPv6**:nrf 模板的 `main.ts` 用
104
+ * `app.listen(port, process.env.SERVER_HOST || 'localhost')`,而 `localhost`
105
+ * 在 macOS / 部分 Node 版本下解析到 `::1`,Nest 便只监听 IPv6 环回。
106
+ * 此时只探 `127.0.0.1` 会稳定拿到 ECONNREFUSED,把活着的服务误判成挂了。
107
+ * 实测:`lsof` 显示 `TCP [::1]:3000 (LISTEN)`,`127.0.0.1` 连接被拒。
108
+ */
109
+ async function probePort(port, hosts = [], timeoutMs = 1000) {
110
+ if (!Number.isInteger(port) || port <= 0 || port > 65535)
111
+ return false;
112
+ const targets = [...new Set([...hosts.filter(Boolean), '127.0.0.1', '::1'])];
113
+ const results = await Promise.all(targets.map((h) => connectOnce(port, h, timeoutMs)));
114
+ return results.some(Boolean);
115
+ }
116
+ function safeSize(file) {
117
+ try {
118
+ return node_fs_1.default.statSync(file).size;
119
+ }
120
+ catch {
121
+ return 0;
122
+ }
123
+ }
124
+ /**
125
+ * 构造「后端编译当前是不是挂着的」判定器。
126
+ *
127
+ * 这是对超时的**加速**,不是替代:命中就立刻判失败不用干等,没命中什么都不做、
128
+ * 继续走超时兜底。所以 nest / tsc 换了输出格式导致匹配不到时,最坏只是「退回等
129
+ * 超时」,既不会误报也不会卡住用户——方向天然安全。
130
+ *
131
+ * **必须记基线偏移**:`dev.js` 以 append 模式写 `server.std.log`,日志跨 dev
132
+ * 会话累积。不设基线的话,上一次会话遗留的 `Found 1 error` 会让新会话刚启动
133
+ * 就误报。构造时记下当前文件大小,之后只看这之后写入的内容;文件被截断或轮转
134
+ * (size < 基线)时基线归零。
135
+ */
136
+ function createCompileErrorScanner(logDir) {
137
+ const file = node_path_1.default.join(logDir, 'server.std.log');
138
+ let baseline = safeSize(file);
139
+ return function hasCompileError() {
140
+ let fd;
141
+ try {
142
+ const size = safeSize(file);
143
+ if (size < baseline)
144
+ baseline = 0; // 日志被截断/轮转
145
+ const available = size - baseline;
146
+ if (available <= 0)
147
+ return false;
148
+ const length = Math.min(available, TAIL_BYTES);
149
+ const buf = Buffer.alloc(length);
150
+ fd = node_fs_1.default.openSync(file, 'r');
151
+ node_fs_1.default.readSync(fd, buf, 0, length, size - length);
152
+ const text = buf.toString('utf8').replace(ANSI, '');
153
+ // 取最后一次结果:修好之后 tsc 会再打一条 `Found 0 errors`,
154
+ // 只有以最后一条为准才能正确恢复。
155
+ let last = null;
156
+ for (const m of text.matchAll(COMPILE_RESULT))
157
+ last = Number(m[1]);
158
+ return last !== null && last > 0;
159
+ }
160
+ catch {
161
+ // 日志缺失 / 不可读 → 不下结论,交给超时兜底
162
+ return false;
163
+ }
164
+ finally {
165
+ if (fd !== undefined) {
166
+ try {
167
+ node_fs_1.default.closeSync(fd);
168
+ }
169
+ catch {
170
+ // 关闭失败不影响本次扫描结果,且 fd 会随进程退出被回收。
171
+ // 刻意不打日志:health 被外壳高频轮询,打了会刷屏掩盖真正的错误。
172
+ }
173
+ }
174
+ }
175
+ };
176
+ }
177
+ function resolveTimeoutMs(explicit) {
178
+ if (typeof explicit === 'number')
179
+ return explicit;
180
+ const raw = Number(process.env.MIAODA_HEALTH_TIMEOUT_MS);
181
+ return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_TIMEOUT_MS;
182
+ }
183
+ function settle(status, message) {
184
+ return message === undefined
185
+ ? { ready: status === 'ready', status }
186
+ : { ready: status === 'ready', status, message };
187
+ }
188
+ /**
189
+ * 构造健康探测函数。
190
+ *
191
+ * `status` 判定顺序:
192
+ * 0. 前端 dev server 都还没起来 → `pending`;
193
+ * 1. 本应用没有后端(纯前端) → `ready`,永不 `backend_failed`;
194
+ * 2. 日志尾部显示编译没过 → `backend_failed`,不用干等(无条件优先,
195
+ * 因为端口还通也可能是 nest watch 留着旧进程在服务旧代码);
196
+ * 3. 后端端口连得上 → `ready`;
197
+ * 4. 都不是 → 超时前 `pending`,超时后 `backend_failed`。
198
+ *
199
+ * 有状态是因为要记住 dev server 启动时刻(计时锚点)和日志基线偏移。
200
+ */
201
+ function createHealthProbe(options) {
202
+ const startedAt = Date.now();
203
+ const serverPort = toPort(options.serverPort) ?? toPort(process.env.SERVER_PORT) ?? 3000;
204
+ const serverHost = options.serverHost ?? process.env.SERVER_HOST ?? '';
205
+ const logDir = node_path_1.default.resolve(options.logDir ?? process.env.LOG_DIR ?? './logs');
206
+ const timeoutMs = resolveTimeoutMs(options.timeoutMs);
207
+ const hasServer = options.hasServer ?? isFullstackApp();
208
+ const hasCompileError = createCompileErrorScanner(logDir);
209
+ let cachedAlive = false;
210
+ let cachedAt = 0;
211
+ return async function probe() {
212
+ try {
213
+ if (!options.isClientReady())
214
+ return settle('pending');
215
+ if (!hasServer)
216
+ return settle('ready');
217
+ if (hasCompileError()) {
218
+ return settle('backend_failed', `后端服务编译未通过,请查看 ${node_path_1.default.join(logDir, 'server.std.log')}`);
219
+ }
220
+ const nowMs = Date.now();
221
+ if (nowMs - cachedAt >= PROBE_CACHE_MS) {
222
+ cachedAlive = await probePort(serverPort, serverHost ? [serverHost] : []);
223
+ cachedAt = nowMs;
224
+ }
225
+ if (cachedAlive)
226
+ return settle('ready');
227
+ const elapsed = Date.now() - startedAt;
228
+ if (elapsed <= timeoutMs)
229
+ return settle('pending');
230
+ return settle('backend_failed', `后端服务未启动:端口 ${serverPort} 在 ${Math.round(elapsed / 1000)}s 内始终未监听,` +
231
+ `请查看 ${node_path_1.default.join(logDir, 'server.std.log')}`);
232
+ }
233
+ catch {
234
+ // 探测本身出错绝不能误报失败:降级为「还在启动」
235
+ return settle('pending');
236
+ }
237
+ };
238
+ }
239
+ //# sourceMappingURL=health-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-core.js","sourceRoot":"","sources":["../../src/plugins/health-core.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,24 @@
1
1
  import type { Plugin } from 'vite';
2
+ import { HEALTH_ENDPOINT } from './health-core';
2
3
  /**
3
- * 妙搭沙箱外壳探活接口。协议(飞书文档 - 启动状态梳理):
4
- * ```jsonc
5
- * { "ready": true, "status": "ready" }
6
- * ```
7
- * - 无法访问 → 服务启动中,超时后流转为「应用启动失败」
8
- * - status: pending → 应用启动中
9
- * - status: ready → 流转到前端「应用加载中」
10
- * - status: backend_failed → 应用启动失败
4
+ * 给妙搭沙箱外壳提供统一的 health endpoint。协议与判定见 `./health-core`。
11
5
  *
12
- * 本栈是 client-only,没有 Node 后端可等,dev server 起来即 `ready`,
13
- * **永不产生 `backend_failed`**。
6
+ * **本 preset 同时服务 jsPage fullstack**(见 `src/index.ts` 的
7
+ * `isFullstack = MIAODA_APP_TYPE === '3'`,它 gate 了 devProxyPlugin 等
8
+ * fullstack-only 插件;升级链路上的存量全栈应用也走这个包)。
9
+ * 缺省由 `isFullstackApp()` 判定,与 `isFullstack` 同一口径,保证
10
+ * 「反代到 3000」和「health 说有后端」不会分叉。
14
11
  */
12
+ export { HEALTH_ENDPOINT };
15
13
  export interface HealthMiddlewarePluginOptions {
16
14
  /** Health endpoint 路径,默认 `/dev/health`。 */
17
15
  endpoint?: string;
16
+ /** 后端端口;缺省读 SERVER_PORT,再兜底 3000 */
17
+ serverPort?: number;
18
+ /** server.std.log 所在目录;缺省读 LOG_DIR,再兜底 ./logs */
19
+ logDir?: string;
20
+ /** 本应用是否有 Node 后端;缺省按 MIAODA_APP_TYPE 判定 */
21
+ hasServer?: boolean;
18
22
  }
19
23
  export declare function healthMiddlewarePlugin(options?: HealthMiddlewarePluginOptions): Plugin;
20
24
  export default healthMiddlewarePlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/plugins/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAElD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,6BAA6B;IAC5C,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,6BAAkC,GAAG,MAAM,CAiC1F;AAED,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/plugins/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAElD,OAAO,EAAE,eAAe,EAAqB,MAAM,eAAe,CAAC;AAEnE;;;;;;;;GAQG;AACH,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,MAAM,WAAW,6BAA6B;IAC5C,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,6BAAkC,GAAG,MAAM,CAqD1F;AAED,eAAe,sBAAsB,CAAC"}
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HEALTH_ENDPOINT = void 0;
3
4
  exports.healthMiddlewarePlugin = healthMiddlewarePlugin;
5
+ const health_core_1 = require("./health-core");
6
+ Object.defineProperty(exports, "HEALTH_ENDPOINT", { enumerable: true, get: function () { return health_core_1.HEALTH_ENDPOINT; } });
4
7
  function healthMiddlewarePlugin(options = {}) {
5
- const endpoint = options.endpoint ?? '/dev/health';
8
+ const endpoint = options.endpoint ?? health_core_1.HEALTH_ENDPOINT;
6
9
  let viteReady = false;
7
10
  return {
8
11
  name: 'miaoda-health',
@@ -21,15 +24,33 @@ function healthMiddlewarePlugin(options = {}) {
21
24
  viteReady = true;
22
25
  });
23
26
  }
27
+ const probe = (0, health_core_1.createHealthProbe)({
28
+ isClientReady: () => viteReady,
29
+ hasServer: options.hasServer,
30
+ serverPort: options.serverPort,
31
+ logDir: options.logDir,
32
+ });
24
33
  server.middlewares.use(endpoint, (req, res, next) => {
25
34
  if (req.method && req.method !== 'GET')
26
35
  return next();
27
- res.setHeader('Content-Type', 'application/json');
28
- res.setHeader('Cache-Control', 'no-store');
29
- res.statusCode = 200;
30
- // ready 恒等于 status === 'ready',是 status 的投影而非独立信号
31
- const status = viteReady ? 'ready' : 'pending';
32
- res.end(JSON.stringify({ ready: status === 'ready', status }));
36
+ const write = (payload) => {
37
+ res.setHeader('Content-Type', 'application/json');
38
+ res.setHeader('Cache-Control', 'no-store');
39
+ res.statusCode = 200;
40
+ res.end(JSON.stringify(payload));
41
+ };
42
+ // probe() 内部已兜底不会 reject;但 write 本身可能抛(响应已被销毁等),
43
+ // 不接 catch 的话请求会一直挂到外壳超时,还会留下 unhandled rejection。
44
+ void probe()
45
+ .then(write)
46
+ .catch(() => {
47
+ try {
48
+ write({ ready: false, status: 'pending' });
49
+ }
50
+ catch {
51
+ res.end();
52
+ }
53
+ });
33
54
  });
34
55
  },
35
56
  };
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/plugins/health.ts"],"names":[],"mappings":";;AAoBA,wDAiCC;AAjCD,SAAgB,sBAAsB,CAAC,UAAyC,EAAE;IAChF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC;IACnD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,OAAO;QAEd,eAAe,CAAC,MAAqB;YACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YACrC,QAAQ;YACR,2CAA2C;YAC3C,4CAA4C;YAC5C,0BAA0B;YAC1B,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBACxC,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;oBAChC,SAAS,GAAG,IAAI,CAAC;gBACnB,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBAClD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;oBAAE,OAAO,IAAI,EAAE,CAAC;gBACtD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;gBAClD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;gBAC3C,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,kDAAkD;gBAClD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/plugins/health.ts"],"names":[],"mappings":";;;AA0BA,wDAqDC;AA7ED,+CAAmE;AAW1D,gGAXA,6BAAe,OAWA;AAaxB,SAAgB,sBAAsB,CAAC,UAAyC,EAAE;IAChF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,6BAAe,CAAC;IACrD,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,OAAO;QAEd,eAAe,CAAC,MAAqB;YACnC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YACrC,QAAQ;YACR,2CAA2C;YAC3C,4CAA4C;YAC5C,0BAA0B;YAC1B,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;gBACxC,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;oBAChC,SAAS,GAAG,IAAI,CAAC;gBACnB,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,GAAG,IAAA,+BAAiB,EAAC;gBAC9B,aAAa,EAAE,GAAG,EAAE,CAAC,SAAS;gBAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBAClD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK;oBAAE,OAAO,IAAI,EAAE,CAAC;gBAEtD,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAE,EAAE;oBACjC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;oBAClD,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;oBAC3C,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;oBACrB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACnC,CAAC,CAAC;gBAEF,iDAAiD;gBACjD,mDAAmD;gBACnD,KAAK,KAAK,EAAE;qBACT,IAAI,CAAC,KAAK,CAAC;qBACX,KAAK,CAAC,GAAG,EAAE;oBACV,IAAI,CAAC;wBACH,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBAC7C,CAAC;oBAAC,MAAM,CAAC;wBACP,GAAG,CAAC,GAAG,EAAE,CAAC;oBACZ,CAAC;gBACH,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,sBAAsB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { Plugin } from 'vite';
2
+ /**
3
+ * standalone 构建:剥掉 Vite 注入的入口 `<script>` 上的 `type="module"` 与 `crossorigin`,
4
+ * 并在剥掉 `type="module"` 时补 `defer` 以保留其隐含的延迟执行语义。
5
+ *
6
+ * **为什么要剥属性**:Vite 8 的 build-html 插件写死这两个属性,完全不看 `output.format`
7
+ * (`vite/dist/node/chunks/node.js` 的 `toScriptTag`)。所以即便 `format: 'iife'` 让 JS
8
+ * **内容**变成了经典脚本,标签仍是 `<script type="module" crossorigin src=...>`。
9
+ *
10
+ * 而在 `file://` 下文档 origin 是 `null`(opaque):
11
+ * - `type="module"` 按规范强制走 CORS 模式加载 → opaque origin 必失败
12
+ * - `crossorigin` 同样把经典脚本切到 CORS 模式 → 同样失败
13
+ * 两个属性各自都足以让产物打不开,必须都剥掉。
14
+ *
15
+ * **为什么要补 `defer`**:`type="module"` 本身隐含 defer 语义——模块脚本总是等文档
16
+ * 解析完才执行。Vite 把入口 script 放在 `<head>` 里,正是依赖这条隐含语义。剥掉
17
+ * `type="module"` 会让它退化成 `<head>` 里的**同步经典脚本**,在 `<body>` 解析完之前
18
+ * 就执行——真实后果是入口代码 `document.getElementById('root')` 拿到 `null`,
19
+ * 页面白屏(`Cannot set properties of null`)。补 `defer` 找回同等的执行时机。
20
+ *
21
+ * 只在**这次真的剥掉了** `type="module"` 时才补 `defer`:
22
+ * - 已有 `async` 的标签不补——`async` 优先级更高,`defer` 是死权重,且 `async` 是
23
+ * Vite `toScriptTag` 的 `isAsync` 分支刻意选的调度方式,不该被静默改写。
24
+ * - 已有 `defer` 的标签不重复添加。
25
+ * - 从未有 `type="module"` 的标签(用户手写的经典 `<script src>`)完全不碰——
26
+ * 那是作者自己选的执行时机,不该被这条 standalone-only 逻辑动。
27
+ *
28
+ * **只处理带 `src` 的标签**:inline `<script>` 没有这两个属性,正则也不该碰它的内容
29
+ * (内容里可能恰好含 `type: "module"` 字样);`<link>`(如 modulepreload)同理不动。
30
+ *
31
+ * **`transformIndexHtml` 用 object 形式 + `order: 'post'`**:build-html 插件本身不注册
32
+ * `transformIndexHtml` hook——它是在派发所有 hook 之前,自己往 HTML 里注入 script/link 标签
33
+ * (`vite/dist/node/chunks/node.js` 里先 emitTag 再 applyHtmlTransforms)。所以我们的 hook
34
+ * 无论排在哪个阶段都能看到已注入的标签;`order: 'post'` 给的是另一层保证——
35
+ * `resolveHtmlTransforms` 只认 `hook.order`(plain function 一律扔进 normalHooks,
36
+ * `plugin.enforce` 在这里根本不参与判断),把我们钉死在真正的 postHooks 里,
37
+ * 确保将来任何新增的、同样想动 script 标签的 post 阶段 transform 都排在我们之后,
38
+ * 不会把 `type="module"` 之类的属性重新写回来。
39
+ *
40
+ * `enforce: 'post'` 仍然保留:它作用于 `sortUserPlugins`,决定本插件在用户插件数组里的
41
+ * 相对位置(排在 `ogMetaPlugin` / `viewContextPlugin` 之后),跟 `order: 'post'` 是两套
42
+ * 独立机制,各自负责一段排序。
43
+ *
44
+ * `apply: 'build'`:只在 dev(`vite serve`)意外设置 MIAODA_BUILD_TARGET=standalone 时,
45
+ * 避免把 `/@vite/client` 和入口模块的 `type="module"` 也剥掉——那样 dev server 会静默死掉,
46
+ * 且现象很难联想到这个插件。
47
+ *
48
+ * CSS 无需处理:iife 下 rolldown 把样式内联进 JS 运行时注入,不产
49
+ * `<link rel="stylesheet" crossorigin>`。
50
+ */
51
+ export declare function standaloneHtmlPlugin(): Plugin;
52
+ export default standaloneHtmlPlugin;
53
+ //# sourceMappingURL=standalone-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone-html.d.ts","sourceRoot":"","sources":["../../src/plugins/standalone-html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA2BnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CA+B7C;AAED,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.standaloneHtmlPlugin = standaloneHtmlPlugin;
4
+ /**
5
+ * 匹配整个 `<script ...>` 开标签。属性区用 `(?:"[^"]*"|'[^']*'|[^>])*` 而非 `[^>]*`
6
+ * —— 后者会被属性值里的 `>` 提前截断(如 `onload="if(a>b)f()"`)。
7
+ * 原先「原样重发匹配前缀」能自愈截断,但**追加 defer 之后不再成立**:defer 会被插进
8
+ * 属性值中间,产出 `onload="if(a defer>b)f()"` 这种损坏标签。已实测确认。
9
+ */
10
+ const SCRIPT_TAG_RE = /<script\b((?:"[^"]*"|'[^']*'|[^>])*)>/gi;
11
+ /** 只处理带 src 的标签:inline script 没有这些属性,其内容也可能含 `type: "module"` 字样。 */
12
+ const HAS_SRC_RE = /\bsrc\s*=/i;
13
+ // 探测 / 剥离都不带 g:attrs 是单个标签内的属性串,至多一个 type / crossorigin,
14
+ // 且非 global 正则的 .test() 不受 lastIndex 状态影响,可安全复用为模块级 const。
15
+ const TYPE_MODULE_DETECT_RE = /\btype\s*=\s*(?:"module"|'module'|module\b)/i;
16
+ const TYPE_MODULE_STRIP_RE = /\s+type\s*=\s*(?:"module"|'module'|module\b)/i;
17
+ const CROSSORIGIN_STRIP_RE = /\s+crossorigin(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s"'>]*))?/i;
18
+ /** 属性是否存在(裸属性或带值均可),要求左右是串首/空白/`=`,避免误命中
19
+ * `data-async-foo` 之类子串。 */
20
+ function hasBareAttr(attrs, name) {
21
+ const re = name === 'async' ? /(^|\s)async(=|\s|$)/i : /(^|\s)defer(=|\s|$)/i;
22
+ return re.test(attrs);
23
+ }
24
+ /**
25
+ * standalone 构建:剥掉 Vite 注入的入口 `<script>` 上的 `type="module"` 与 `crossorigin`,
26
+ * 并在剥掉 `type="module"` 时补 `defer` 以保留其隐含的延迟执行语义。
27
+ *
28
+ * **为什么要剥属性**:Vite 8 的 build-html 插件写死这两个属性,完全不看 `output.format`
29
+ * (`vite/dist/node/chunks/node.js` 的 `toScriptTag`)。所以即便 `format: 'iife'` 让 JS
30
+ * **内容**变成了经典脚本,标签仍是 `<script type="module" crossorigin src=...>`。
31
+ *
32
+ * 而在 `file://` 下文档 origin 是 `null`(opaque):
33
+ * - `type="module"` 按规范强制走 CORS 模式加载 → opaque origin 必失败
34
+ * - `crossorigin` 同样把经典脚本切到 CORS 模式 → 同样失败
35
+ * 两个属性各自都足以让产物打不开,必须都剥掉。
36
+ *
37
+ * **为什么要补 `defer`**:`type="module"` 本身隐含 defer 语义——模块脚本总是等文档
38
+ * 解析完才执行。Vite 把入口 script 放在 `<head>` 里,正是依赖这条隐含语义。剥掉
39
+ * `type="module"` 会让它退化成 `<head>` 里的**同步经典脚本**,在 `<body>` 解析完之前
40
+ * 就执行——真实后果是入口代码 `document.getElementById('root')` 拿到 `null`,
41
+ * 页面白屏(`Cannot set properties of null`)。补 `defer` 找回同等的执行时机。
42
+ *
43
+ * 只在**这次真的剥掉了** `type="module"` 时才补 `defer`:
44
+ * - 已有 `async` 的标签不补——`async` 优先级更高,`defer` 是死权重,且 `async` 是
45
+ * Vite `toScriptTag` 的 `isAsync` 分支刻意选的调度方式,不该被静默改写。
46
+ * - 已有 `defer` 的标签不重复添加。
47
+ * - 从未有 `type="module"` 的标签(用户手写的经典 `<script src>`)完全不碰——
48
+ * 那是作者自己选的执行时机,不该被这条 standalone-only 逻辑动。
49
+ *
50
+ * **只处理带 `src` 的标签**:inline `<script>` 没有这两个属性,正则也不该碰它的内容
51
+ * (内容里可能恰好含 `type: "module"` 字样);`<link>`(如 modulepreload)同理不动。
52
+ *
53
+ * **`transformIndexHtml` 用 object 形式 + `order: 'post'`**:build-html 插件本身不注册
54
+ * `transformIndexHtml` hook——它是在派发所有 hook 之前,自己往 HTML 里注入 script/link 标签
55
+ * (`vite/dist/node/chunks/node.js` 里先 emitTag 再 applyHtmlTransforms)。所以我们的 hook
56
+ * 无论排在哪个阶段都能看到已注入的标签;`order: 'post'` 给的是另一层保证——
57
+ * `resolveHtmlTransforms` 只认 `hook.order`(plain function 一律扔进 normalHooks,
58
+ * `plugin.enforce` 在这里根本不参与判断),把我们钉死在真正的 postHooks 里,
59
+ * 确保将来任何新增的、同样想动 script 标签的 post 阶段 transform 都排在我们之后,
60
+ * 不会把 `type="module"` 之类的属性重新写回来。
61
+ *
62
+ * `enforce: 'post'` 仍然保留:它作用于 `sortUserPlugins`,决定本插件在用户插件数组里的
63
+ * 相对位置(排在 `ogMetaPlugin` / `viewContextPlugin` 之后),跟 `order: 'post'` 是两套
64
+ * 独立机制,各自负责一段排序。
65
+ *
66
+ * `apply: 'build'`:只在 dev(`vite serve`)意外设置 MIAODA_BUILD_TARGET=standalone 时,
67
+ * 避免把 `/@vite/client` 和入口模块的 `type="module"` 也剥掉——那样 dev server 会静默死掉,
68
+ * 且现象很难联想到这个插件。
69
+ *
70
+ * CSS 无需处理:iife 下 rolldown 把样式内联进 JS 运行时注入,不产
71
+ * `<link rel="stylesheet" crossorigin>`。
72
+ */
73
+ function standaloneHtmlPlugin() {
74
+ return {
75
+ name: 'miaoda-standalone-html',
76
+ enforce: 'post',
77
+ apply: 'build',
78
+ transformIndexHtml: {
79
+ order: 'post',
80
+ handler(html) {
81
+ return html.replace(SCRIPT_TAG_RE, (tag, attrs) => {
82
+ if (!HAS_SRC_RE.test(attrs))
83
+ return tag;
84
+ const hadModule = TYPE_MODULE_DETECT_RE.test(attrs);
85
+ let cleaned = attrs
86
+ // type="module" / type='module' / type=module(不带引号,以词边界收尾)
87
+ .replace(TYPE_MODULE_STRIP_RE, '')
88
+ // crossorigin / crossorigin="anonymous" / crossorigin=anonymous(值可不带引号)
89
+ .replace(CROSSORIGIN_STRIP_RE, '');
90
+ if (hadModule &&
91
+ !hasBareAttr(cleaned, 'async') &&
92
+ !hasBareAttr(cleaned, 'defer')) {
93
+ cleaned += ' defer';
94
+ }
95
+ return `<script${cleaned}>`;
96
+ });
97
+ },
98
+ },
99
+ };
100
+ }
101
+ exports.default = standaloneHtmlPlugin;
102
+ //# sourceMappingURL=standalone-html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone-html.js","sourceRoot":"","sources":["../../src/plugins/standalone-html.ts"],"names":[],"mappings":";;AA4EA,oDA+BC;AAzGD;;;;;GAKG;AACH,MAAM,aAAa,GAAG,yCAAyC,CAAC;AAEhE,qEAAqE;AACrE,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC,yDAAyD;AACzD,2DAA2D;AAC3D,MAAM,qBAAqB,GAAG,8CAA8C,CAAC;AAC7E,MAAM,oBAAoB,GAAG,+CAA+C,CAAC;AAC7E,MAAM,oBAAoB,GACxB,0DAA0D,CAAC;AAE7D;6BAC6B;AAC7B,SAAS,WAAW,CAAC,KAAa,EAAE,IAAuB;IACzD,MAAM,EAAE,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAC9E,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,SAAgB,oBAAoB;IAClC,OAAO;QACL,IAAI,EAAE,wBAAwB;QAC9B,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,OAAO;QACd,kBAAkB,EAAE;YAClB,KAAK,EAAE,MAAM;YACb,OAAO,CAAC,IAAY;gBAClB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,GAAW,EAAE,KAAa,EAAE,EAAE;oBAChE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;wBAAE,OAAO,GAAG,CAAC;oBACxC,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAEpD,IAAI,OAAO,GAAG,KAAK;wBACjB,2DAA2D;yBAC1D,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;wBAClC,wEAAwE;yBACvE,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;oBAErC,IACE,SAAS;wBACT,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC;wBAC9B,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,EAC9B,CAAC;wBACD,OAAO,IAAI,QAAQ,CAAC;oBACtB,CAAC;oBAED,OAAO,UAAU,OAAO,GAAG,CAAC;gBAC9B,CAAC,CAAC,CAAC;YACL,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,oBAAoB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Plugin } from 'vite';
2
+ /**
3
+ * standalone 构建:把 `BrowserRouter` / `createBrowserRouter` 换成 hash 版。
4
+ *
5
+ * **为什么必须换**(实测数据,别按"锦上添花"理解):
6
+ * `BrowserRouter` 拿 `location.pathname` 匹配路由。脱离平台后:
7
+ * - `file://` 下 pathname 是完整文件系统路径(`/Users/x/dist/index.html`),
8
+ * 匹配不上任何 `<Route>`,首屏直接落 `<Route path="*">` → **404 页**
9
+ * - 起了本地 server 也只有访问 `/` 才对,直接开 `/index.html` 仍是 404 页;
10
+ * 深链 `/about` 还要 server 配 SPA fallback,`npx serve` 默认没有
11
+ * - `pushState` 在 `file://` 的 opaque origin 下抛 `SecurityError`
12
+ * 换成 hash 版后三个问题同时消失:只读写 `location.hash`,不碰 pathname、不调 pushState,
13
+ * 链接变成 `index.html#/about`,放哪个目录都能用。
14
+ *
15
+ * **替换面是用户源码全量**,不限于入口文件 —— `BrowserRouter` 可能写在 `app.tsx` 或
16
+ * 自建的 providers 里。靠 `node_modules` 排除保证不动 react-router 自身的导出定义
17
+ * (改那里会直接崩)。
18
+ *
19
+ * `enforce: 'pre'` 是必需的:必须早于 react 插件转译,那时 JSX 标签名还是原样文本。
20
+ * `apply: 'build'` 保证 dev / 平台预览行为完全不变。
21
+ */
22
+ export declare function standaloneRouterPlugin(): Plugin;
23
+ export default standaloneRouterPlugin;
24
+ //# sourceMappingURL=standalone-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone-router.d.ts","sourceRoot":"","sources":["../../src/plugins/standalone-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAYnC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAc/C;AAED,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.standaloneRouterPlugin = standaloneRouterPlugin;
4
+ /** 只处理用户源码里的 JS/TS。CSS / JSON 等不含标识符,node_modules 更不能碰。 */
5
+ const SCRIPT_ID_RE = /\.(?:[cm]?[jt]sx?)(?:\?.*)?$/i;
6
+ /**
7
+ * `createBrowserRouter` 必须先于 `BrowserRouter` 判定存在性,但替换本身靠词边界隔离:
8
+ * `\bBrowserRouter\b` 在 `createBrowserRouter` 里匹配不到(`e` 与 `B` 都是词字符,无边界)。
9
+ */
10
+ const CREATE_RE = /\bcreateBrowserRouter\b/g;
11
+ const ROUTER_RE = /\bBrowserRouter\b/g;
12
+ /**
13
+ * standalone 构建:把 `BrowserRouter` / `createBrowserRouter` 换成 hash 版。
14
+ *
15
+ * **为什么必须换**(实测数据,别按"锦上添花"理解):
16
+ * `BrowserRouter` 拿 `location.pathname` 匹配路由。脱离平台后:
17
+ * - `file://` 下 pathname 是完整文件系统路径(`/Users/x/dist/index.html`),
18
+ * 匹配不上任何 `<Route>`,首屏直接落 `<Route path="*">` → **404 页**
19
+ * - 起了本地 server 也只有访问 `/` 才对,直接开 `/index.html` 仍是 404 页;
20
+ * 深链 `/about` 还要 server 配 SPA fallback,`npx serve` 默认没有
21
+ * - `pushState` 在 `file://` 的 opaque origin 下抛 `SecurityError`
22
+ * 换成 hash 版后三个问题同时消失:只读写 `location.hash`,不碰 pathname、不调 pushState,
23
+ * 链接变成 `index.html#/about`,放哪个目录都能用。
24
+ *
25
+ * **替换面是用户源码全量**,不限于入口文件 —— `BrowserRouter` 可能写在 `app.tsx` 或
26
+ * 自建的 providers 里。靠 `node_modules` 排除保证不动 react-router 自身的导出定义
27
+ * (改那里会直接崩)。
28
+ *
29
+ * `enforce: 'pre'` 是必需的:必须早于 react 插件转译,那时 JSX 标签名还是原样文本。
30
+ * `apply: 'build'` 保证 dev / 平台预览行为完全不变。
31
+ */
32
+ function standaloneRouterPlugin() {
33
+ return {
34
+ name: 'miaoda-standalone-router',
35
+ enforce: 'pre',
36
+ apply: 'build',
37
+ transform(code, id) {
38
+ if (id.includes('node_modules'))
39
+ return null;
40
+ if (!SCRIPT_ID_RE.test(id))
41
+ return null;
42
+ if (!code.includes('BrowserRouter'))
43
+ return null;
44
+ return code
45
+ .replace(CREATE_RE, 'createHashRouter')
46
+ .replace(ROUTER_RE, 'HashRouter');
47
+ },
48
+ };
49
+ }
50
+ exports.default = standaloneRouterPlugin;
51
+ //# sourceMappingURL=standalone-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone-router.js","sourceRoot":"","sources":["../../src/plugins/standalone-router.ts"],"names":[],"mappings":";;AAgCA,wDAcC;AA5CD,2DAA2D;AAC3D,MAAM,YAAY,GAAG,+BAA+B,CAAC;AAErD;;;GAGG;AACH,MAAM,SAAS,GAAG,0BAA0B,CAAC;AAC7C,MAAM,SAAS,GAAG,oBAAoB,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,sBAAsB;IACpC,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,OAAO;QACd,SAAS,CAAC,IAAY,EAAE,EAAU;YAChC,IAAI,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC7C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAAE,OAAO,IAAI,CAAC;YACjD,OAAO,IAAI;iBACR,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC;iBACtC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,sBAAsB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/coding-preset-vite-react",
3
- "version": "1.0.18-alpha.20260820122252",
3
+ "version": "1.0.18",
4
4
  "description": "Vite 8 preset for miaoda-coding vite-react (jsPage) templates — pure frontend, no fullstack baggage",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",