@cfp-studio/iframe 18.4.4 → 18.4.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cfp-studio/iframe",
3
- "version": "18.4.4",
3
+ "version": "18.4.5",
4
4
  "license": "MIT",
5
5
  "files": [
6
6
  "dist",
@@ -10,6 +10,7 @@
10
10
  "main": "./dist/index.mjs",
11
11
  "types": "./dist/index.d.mts",
12
12
  "dependencies": {
13
+ "@cfp-studio/analyzer-api": "0.1.15",
13
14
  "@cfp-studio/fiber-reader": "0.3.0"
14
15
  },
15
16
  "devDependencies": {
@@ -1,3 +1,5 @@
1
+ import { clearErrorPanel } from "@cfp-studio/analyzer-api";
2
+
1
3
  import { overrideCopyCutPaste } from "./copy-cut-paste";
2
4
  import { setUpLinkInterception } from "./links";
3
5
  import { setUpLogInterception } from "./logs";
@@ -67,11 +69,20 @@ export function initPreview({
67
69
  shouldAbortRender: () => renderId !== thisRenderId,
68
70
  loadRenderer,
69
71
  });
72
+ // 渲染成功:上一次的错误覆盖层该撤了。
73
+ //
74
+ // 面板现在挂在 `document.body` 的独立覆盖层上(不占 `#root`),所以不会被
75
+ // `root.innerHTML` 覆写带走 —— 必须显式清 —— 否则改好代码后面板会永久赖着。
76
+ clearErrorPanel();
70
77
  } catch (error: any) {
71
- if (root.innerHTML !== rootHtml) {
72
- // 重新调用前一次渲染,以确保预览不会白屏。
73
- root.innerHTML = rootHtml;
74
- }
78
+ // **不再 `root.innerHTML = rootHtml` 回填快照**。
79
+ //
80
+ // 旧行为(为了「不白屏」而回滚)实测症状:「错误面板闪现一下,然后被正常页面
81
+ // 覆盖」,用户看不到真正原因。现在改成:保留错误覆盖层(半透明遮罩盖住旧画面),
82
+ // 同时继续 `reportEvent` 给宿主侧。
83
+ //
84
+ // `rootHtml` 仍用于判定:没变化说明连上一次的 DOM 都没建立,无需特别处理。
85
+ void rootHtml;
75
86
  window.__PREVIEWJS_IFRAME__.reportEvent({
76
87
  kind: "error",
77
88
  source: "renderer",
@@ -46,7 +46,15 @@ export function setupViteHmrListener() {
46
46
  isFirstUpdate = false;
47
47
  }
48
48
  if (window.__PREVIEWJS_IFRAME__.lastRenderFailed) {
49
- window.location.reload();
49
+ // **不要 `location.reload()`**。
50
+ //
51
+ // 旧行为:上一次渲染失败时整页重载。实测症状(真实反馈):
52
+ // 「保存后闪现错误页面,然后被白屏覆盖」—— 错误面板刚画出来就被重载抹了,
53
+ // 重载后 `runNewRender` 又在 `loadRenderer` 阶段抛错,用户什么都看不到。
54
+ //
55
+ // 现在:面板是独立覆盖层(见 `analyzer-api` 的 `renderErrorPanel`),
56
+ // 只要重新渲染就行 —— 成功时 `runNewRender` 会自己 `clearErrorPanel()`。
57
+ window.__PREVIEWJS_IFRAME__.refresh({ refetchPreviewableModule: true });
50
58
  } else {
51
59
  window.__PREVIEWJS_IFRAME__.reportEvent({
52
60
  kind: "vite-before-update",