@lark-apaas/coding-preset-vite-react 1.0.16 → 1.0.17-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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;AA0BnC,wBAAgB,qBAAqB,IAAI,MAAM,CA2D9C;AAED,eAAe,qBAAqB,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;AAuCnC,wBAAgB,qBAAqB,IAAI,MAAM,CAqF9C;AAED,eAAe,qBAAqB,CAAC"}
@@ -9,12 +9,23 @@ exports.viteClientPatchPlugin = viteClientPatchPlugin;
9
9
  * 但 reload 用的是浏览器 HTTP/2 连接池里复用的休眠前死连接,
10
10
  * 导致 ~18s `ERR_CONNECTION_TIMED_OUT` 白屏。
11
11
  *
12
- * 解:transform 拦截 `vite/dist/client/client.mjs`,直接删掉 reload 那一行。
13
- * 用户需要新代码时手动刷新。
12
+ * 解:transform 拦截 `vite/dist/client/client.mjs`,把 reload 换成 WS 重连——重连与
13
+ * 探活同为 WebSocket 通道,不碰 HTTP/2 连接池,上述白屏不再触发;失败只打 warn,
14
+ * 由用户决定是否刷新。顺带保住探活地址上的 `sandbox_token`:Vite 原本 `url.search = ""`
15
+ * 会把它一起抹掉,导致探活恒被沙箱网关 401(`ws_proxy_service.go` 的 `token == ""`)。
14
16
  *
15
17
  * 仅 dev(`apply: 'serve'`)。
16
18
  */
17
- const RECONNECT_RELOAD_PATTERN = /(await waitForSuccessfulPing\(url\.href\);)\r?\n(\s*)location\.reload\(\);/;
19
+ const DISCONNECT_RECOVERY_PATTERN = /url\.search = "";\r?\n(\s*)await waitForSuccessfulPing\(url\.href\);\r?\n\s*location\.reload\(\);/;
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\);/;
18
29
  /**
19
30
  * 匹配 @vite/client 顶层那处悬空的 HMR 建链调用(无 .catch):
20
31
  * transport.connect(createHMRHandler(handleMessage));
@@ -30,12 +41,19 @@ function viteClientPatchPlugin() {
30
41
  if (!id.includes('vite/dist/client/client.mjs'))
31
42
  return;
32
43
  let patched = code;
33
- // patch 1: 删掉 WS 重连后的 location.reload()
34
- if (RECONNECT_RELOAD_PATTERN.test(patched)) {
35
- patched = patched.replace(RECONNECT_RELOAD_PATTERN, (_, pingLine) => pingLine);
44
+ // patch 1: 重写断线恢复——探活保住 sandbox_token,探活成功后重连(失败只打 warn)
45
+ if (DISCONNECT_RECOVERY_PATTERN.test(patched)) {
46
+ patched = patched.replace(DISCONNECT_RECOVERY_PATTERN, (_, indent) => 'const __st = url.searchParams.get("sandbox_token");\n' +
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); });");
36
54
  }
37
55
  else {
38
- console.warn('[miaoda-vite-client-patch] reconnect-reload pattern not found in @vite/client. ' +
56
+ console.warn('[miaoda-vite-client-patch] disconnect-recovery pattern not found in @vite/client. ' +
39
57
  'patch NOT applied — Vite client.mjs may have changed.');
40
58
  }
41
59
  // patch 2: HMR 长链追加沙箱鉴权 token(gated on MIAODA_HMR_WS_TOKEN)
@@ -63,6 +81,16 @@ function viteClientPatchPlugin() {
63
81
  console.warn('[miaoda-vite-client-patch] `transport.connect(createHMRHandler(handleMessage))` ' +
64
82
  'call not found in @vite/client; closed-error guard NOT applied — Vite client.mjs may have changed.');
65
83
  }
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
+ }
66
94
  return patched === code ? undefined : { code: patched };
67
95
  },
68
96
  };
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"vite-client-patch.js","sourceRoot":"","sources":["../../src/plugins/vite-client-patch.ts"],"names":[],"mappings":";;AAuCA,sDAqFC;AA1HD;;;;;;;;;;;;;;GAcG;AACH,MAAM,2BAA2B,GAC/B,mGAAmG,CAAC;AAEtG;;;;;;;GAOG;AACH,MAAM,0BAA0B,GAC9B,oKAAoK,CAAC;AAEvK;;;;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,yDAAyD;YACzD,IAAI,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,2BAA2B,EAC3B,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACZ,uDAAuD;oBACvD,MAAM;oBACN,0EAA0E;oBAC1E,MAAM;oBACN,0CAA0C;oBAC1C,MAAM;oBACN,oEAAoE;oBACpE,oFAAoF,CACvF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,oFAAoF;oBAClF,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,gDAAgD;YAChD,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,0BAA0B,EAC1B,2DAA2D;oBACzD,wFAAwF;oBACxF,4DAA4D,CAC/D,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,8EAA8E;oBAC5E,mFAAmF,CACtF,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.16",
3
+ "version": "1.0.17-beta.0",
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",