@lark-apaas/coding-preset-vite-react 1.0.17 → 1.0.18-alpha.20260819082506
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/plugins/health.d.ts +11 -3
- package/lib/plugins/health.d.ts.map +1 -1
- package/lib/plugins/health.js +2 -1
- package/lib/plugins/health.js.map +1 -1
- package/lib/plugins/vite-client-patch.d.ts.map +1 -1
- package/lib/plugins/vite-client-patch.js +7 -35
- package/lib/plugins/vite-client-patch.js.map +1 -1
- package/package.json +1 -1
package/lib/plugins/health.d.ts
CHANGED
|
@@ -3,9 +3,17 @@ import type { Plugin } from 'vite';
|
|
|
3
3
|
* 给妙搭沙箱外壳提供统一的 health endpoint。
|
|
4
4
|
*
|
|
5
5
|
* 协议(飞书文档 - 妙搭应用 Health Check 接口规范):
|
|
6
|
-
* - HTTP connection refused / timeout
|
|
7
|
-
* - 200 + { ready: true }
|
|
8
|
-
* - 200 + { ready: false }
|
|
6
|
+
* - HTTP connection refused / timeout → dev server 没起来 → 外壳重启沙箱
|
|
7
|
+
* - 200 + { ready: true, failed: false } → 应用已就绪
|
|
8
|
+
* - 200 + { ready: false, failed: false } → 还在启动,继续轮询
|
|
9
|
+
* - 200 + { ready: false, failed: true } → 终态失败,停止轮询并呈现 message
|
|
10
|
+
*
|
|
11
|
+
* 本栈是 client-only(没有 Node 服务端),`ready` 等价于 vite dev server 是否 listen,
|
|
12
|
+
* `failed` 恒为 false —— 与改造前行为完全一致,只是补齐了 `failed` 字段。
|
|
13
|
+
*
|
|
14
|
+
* 判定的规范实现在 `@lark-apaas/devtool-kits` 的 health 模块(供 nrf / rspack 等
|
|
15
|
+
* 全栈场景使用)。本包刻意不引入该依赖:它带 ts-morph / babel / pino,
|
|
16
|
+
* 而 client-only 分支的判定只是一个字面量,不值得为此加重 jsPage 栈的体积。
|
|
9
17
|
*
|
|
10
18
|
* 不归本接口管:
|
|
11
19
|
* - vite compile error / runtime error / 资源加载失败 → 浏览器侧自己上报
|
|
@@ -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
|
|
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;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,6BAA6B;IAC5C,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,6BAAkC,GAAG,MAAM,CAgC1F;AAED,eAAe,sBAAsB,CAAC"}
|
package/lib/plugins/health.js
CHANGED
|
@@ -27,7 +27,8 @@ function healthMiddlewarePlugin(options = {}) {
|
|
|
27
27
|
res.setHeader('Content-Type', 'application/json');
|
|
28
28
|
res.setHeader('Cache-Control', 'no-store');
|
|
29
29
|
res.statusCode = 200;
|
|
30
|
-
|
|
30
|
+
// client-only:永不产生终态失败
|
|
31
|
+
res.end(JSON.stringify({ ready: viteReady, failed: false }));
|
|
31
32
|
});
|
|
32
33
|
},
|
|
33
34
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/plugins/health.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/plugins/health.ts"],"names":[],"mappings":";;AA0BA,wDAgCC;AAhCD,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,uBAAuB;gBACvB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAC/D,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,sBAAsB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-client-patch.d.ts","sourceRoot":"","sources":["../../src/plugins/vite-client-patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-client-patch.d.ts","sourceRoot":"","sources":["../../src/plugins/vite-client-patch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA0BnC,wBAAgB,qBAAqB,IAAI,MAAM,CA2D9C;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -9,23 +9,12 @@ exports.viteClientPatchPlugin = viteClientPatchPlugin;
|
|
|
9
9
|
* 但 reload 用的是浏览器 HTTP/2 连接池里复用的休眠前死连接,
|
|
10
10
|
* 导致 ~18s `ERR_CONNECTION_TIMED_OUT` 白屏。
|
|
11
11
|
*
|
|
12
|
-
* 解:transform 拦截 `vite/dist/client/client.mjs
|
|
13
|
-
*
|
|
14
|
-
* 由用户决定是否刷新。顺带保住探活地址上的 `sandbox_token`:Vite 原本 `url.search = ""`
|
|
15
|
-
* 会把它一起抹掉,导致探活恒被沙箱网关 401(`ws_proxy_service.go` 的 `token == ""`)。
|
|
12
|
+
* 解:transform 拦截 `vite/dist/client/client.mjs`,直接删掉 reload 那一行。
|
|
13
|
+
* 用户需要新代码时手动刷新。
|
|
16
14
|
*
|
|
17
15
|
* 仅 dev(`apply: 'serve'`)。
|
|
18
16
|
*/
|
|
19
|
-
const
|
|
20
|
-
/**
|
|
21
|
-
* 匹配 transport 里的 HMR 心跳定时器:
|
|
22
|
-
* pingIntervalId = setInterval(() => { ... }, pingInterval);
|
|
23
|
-
* Vite 被动断开只走 close → `onDisconnection()`,不清定时器;且 `pingIntervalId` 被下次
|
|
24
|
-
* connect 覆盖后再也清不掉,重连后每断一次泄漏一个。改成 IIFE 内的局部 id 自清(不能清
|
|
25
|
-
* 共享变量,会误杀新连接的心跳;用 IIFE 而非 `const` 声明,避免注入点落在无大括号的
|
|
26
|
-
* 语句位置时产生语法错误)。已实测 Vite 7.3.x / 8.0.x 文本一致。
|
|
27
|
-
*/
|
|
28
|
-
const PING_INTERVAL_LEAK_PATTERN = /pingIntervalId = setInterval\(\(\) => \{\s*if \(socket\.readyState === socket\.OPEN\) socket\.send\(JSON\.stringify\(\{ type: "ping" \}\)\);\s*\}, pingInterval\);/;
|
|
17
|
+
const RECONNECT_RELOAD_PATTERN = /(await waitForSuccessfulPing\(url\.href\);)\r?\n(\s*)location\.reload\(\);/;
|
|
29
18
|
/**
|
|
30
19
|
* 匹配 @vite/client 顶层那处悬空的 HMR 建链调用(无 .catch):
|
|
31
20
|
* transport.connect(createHMRHandler(handleMessage));
|
|
@@ -41,19 +30,12 @@ function viteClientPatchPlugin() {
|
|
|
41
30
|
if (!id.includes('vite/dist/client/client.mjs'))
|
|
42
31
|
return;
|
|
43
32
|
let patched = code;
|
|
44
|
-
// patch 1:
|
|
45
|
-
if (
|
|
46
|
-
patched = patched.replace(
|
|
47
|
-
indent +
|
|
48
|
-
'url.search = __st ? "?sandbox_token=" + encodeURIComponent(__st) : "";\n' +
|
|
49
|
-
indent +
|
|
50
|
-
'await waitForSuccessfulPing(url.href);\n' +
|
|
51
|
-
indent +
|
|
52
|
-
'transport.connect(createHMRHandler(handleMessage)).catch((e) => { ' +
|
|
53
|
-
"console.warn('[miaoda-vite-client-patch] HMR reconnect failed (ignored):', e); });");
|
|
33
|
+
// patch 1: 删掉 WS 重连后的 location.reload()
|
|
34
|
+
if (RECONNECT_RELOAD_PATTERN.test(patched)) {
|
|
35
|
+
patched = patched.replace(RECONNECT_RELOAD_PATTERN, (_, pingLine) => pingLine);
|
|
54
36
|
}
|
|
55
37
|
else {
|
|
56
|
-
console.warn('[miaoda-vite-client-patch]
|
|
38
|
+
console.warn('[miaoda-vite-client-patch] reconnect-reload pattern not found in @vite/client. ' +
|
|
57
39
|
'patch NOT applied — Vite client.mjs may have changed.');
|
|
58
40
|
}
|
|
59
41
|
// patch 2: HMR 长链追加沙箱鉴权 token(gated on MIAODA_HMR_WS_TOKEN)
|
|
@@ -81,16 +63,6 @@ function viteClientPatchPlugin() {
|
|
|
81
63
|
console.warn('[miaoda-vite-client-patch] `transport.connect(createHMRHandler(handleMessage))` ' +
|
|
82
64
|
'call not found in @vite/client; closed-error guard NOT applied — Vite client.mjs may have changed.');
|
|
83
65
|
}
|
|
84
|
-
// patch 4: 心跳定时器自清,修 patch 1 自动重连放大的 Vite 定时器泄漏
|
|
85
|
-
if (PING_INTERVAL_LEAK_PATTERN.test(patched)) {
|
|
86
|
-
patched = patched.replace(PING_INTERVAL_LEAK_PATTERN, 'pingIntervalId = (() => { const id = setInterval(() => { ' +
|
|
87
|
-
'if (socket.readyState === socket.OPEN) socket.send(JSON.stringify({ type: "ping" })); ' +
|
|
88
|
-
'else clearInterval(id); }, pingInterval); return id; })();');
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
console.warn('[miaoda-vite-client-patch] ping-interval pattern not found in @vite/client; ' +
|
|
92
|
-
'stale heartbeat timers will leak on reconnect — Vite client.mjs may have changed.');
|
|
93
|
-
}
|
|
94
66
|
return patched === code ? undefined : { code: patched };
|
|
95
67
|
},
|
|
96
68
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-client-patch.js","sourceRoot":"","sources":["../../src/plugins/vite-client-patch.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"vite-client-patch.js","sourceRoot":"","sources":["../../src/plugins/vite-client-patch.ts"],"names":[],"mappings":";;AA0BA,sDA2DC;AAnFD;;;;;;;;;;;;GAYG;AACH,MAAM,wBAAwB,GAC5B,4EAA4E,CAAC;AAE/E;;;;GAIG;AACH,MAAM,eAAe,GACnB,8EAA8E,CAAC;AAEjF,SAAgB,qBAAqB;IACnC,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,OAAO;QAEd,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;gBAAE,OAAO;YAExD,IAAI,OAAO,GAAG,IAAI,CAAC;YAEnB,wCAAwC;YACxC,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3C,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;YACjF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,iFAAiF;oBAC/E,uDAAuD,CAC1D,CAAC;YACJ,CAAC;YAED,4DAA4D;YAC5D,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YACpD,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBAC1C,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;oBAChD,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,wBAAwB,EACxB,GAAG,EAAE,CAAC,oCAAoC,OAAO,EAAE,CACpD,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,2EAA2E;wBACzE,gEAAgE,CACnE,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,2CAA2C;YAC3C,8DAA8D;YAC9D,kFAAkF;YAClF,uDAAuD;YACvD,uDAAuD;YACvD,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,eAAe,EACf,oEAAoE;oBAClE,kFAAkF,CACrF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,kFAAkF;oBAChF,oGAAoG,CACvG,CAAC;YACJ,CAAC;YAED,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1D,CAAC;KACF,CAAC;AACJ,CAAC;AAED,kBAAe,qBAAqB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/coding-preset-vite-react",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.18-alpha.20260819082506",
|
|
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",
|