Skip to content

Commit 6bafa24

Browse files
committed
build(app): break md-katex chunk cycle
1 parent 5c39bdc commit 6bafa24

2 files changed

Lines changed: 19 additions & 15 deletions

File tree

‎app/src/build/manualChunks.test.ts‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ const EXACT_PINS: readonly (readonly [string, VendorGroup])[] = [
130130
["hast-util-to-text", "vendor-katex"],
131131
["hast-util-from-html-isomorphic", "vendor-katex"],
132132
["hast-util-is-element", "vendor-katex"],
133-
["hast-util-parse-selector", "vendor-katex"],
133+
["hast-util-parse-selector", "vendor-md"],
134134
["property-information", "vendor-md"],
135135
["hastscript", "vendor-md"],
136136
["web-namespaces", "vendor-md"],
@@ -280,11 +280,11 @@ describe("批 6 预留:GSAP 必须落进独立 chunk(本批不安装 GSAP)
280280
});
281281

282282
// 实测(Task 4):vite 警告 `Circular chunk: vendor-katex -> vendor-md -> vendor-katex`,两 chunk
283-
// 首行互指 ⇒ 130.66 kB gzip 熔成不可分簇。断环只靠**方向**(不靠把 katex 并进 md —— 那会被
284-
// 上面的 EXACT 钉值表抓住):md→katex 的桥留在 md 侧,katex→md 的单向边保留。
283+
// 首行互指 ⇒ 130.66 kB gzip 熔成不可分簇。断环只靠**方向**:md 侧不许反向依赖 katex,且**移动
284+
// 模块必须连它自己的依赖一起挪**(Task 5 实测:少挪 `hast-util-parse-selector` 时环仍在)。
285285
describe("循环 chunk 反例守卫(vendor-md ⇄ vendor-katex 不许成环)", () => {
286-
it("md→katex 的桥(property-information 族)必须留在 vendor-md", () => {
287-
for (const n of ["property-information", "hastscript", "web-namespaces"]) {
286+
it("md→katex 的两条桥(property-information 族 + 被移动模块自身的依赖)必须留在 vendor-md", () => {
287+
for (const n of ["property-information", "hastscript", "web-namespaces", "hast-util-parse-selector"]) {
288288
expect(EXACT[n]).toBe("vendor-md");
289289
expect(vendorGroupOf(`/r/node_modules/${n}/index.js`)).toBe("vendor-md");
290290
}

‎app/src/build/manualChunks.ts‎

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
* `{ "vendor-gsap": ["gsap"] }` —— 那会在 gsap 未安装时**直接让构建失败**。
2020
* @ai-context: 分组还可能**成环**(不只是「搬字节」):`vendor-md` 与 `vendor-katex` 互相静态
2121
* import 时被 vite 判为循环 chunk 并熔成不可分簇 ⇒ 懒加载边界静默失效。断环只能靠
22-
* **方向**;⚠️ 截至 Task 5 该环**尚未断净**(残留桥与已实测的最小解见下方管线段)。
22+
* **方向**:md 侧不得反向依赖 katex。⚠️ 移动模块时**必须连它自己的依赖一起挪**
23+
* (Task 5 实测:少挪一个直接依赖,环就还在)—— 见下方 Markdown 管线段。
2324
*
2425
* 副作用:无(纯函数)。
2526
* 边界:入参是 rollup 的模块 id(Windows 上可能含 `\`);不解析 tsconfig paths;不处理虚拟模块(`\0` 前缀)。
@@ -58,7 +59,6 @@ export const EXACT: Readonly<Record<string, VendorGroup>> = {
5859
"hast-util-to-text": "vendor-katex",
5960
"hast-util-from-html-isomorphic": "vendor-katex",
6061
"hast-util-is-element": "vendor-katex",
61-
"hast-util-parse-selector": "vendor-katex",
6262
// 编辑器(CodeMirror 6 无 scope 的几件)
6363
codemirror: "vendor-editor",
6464
crelt: "vendor-editor",
@@ -69,17 +69,21 @@ export const EXACT: Readonly<Record<string, VendorGroup>> = {
6969
zustand: "vendor-canvas",
7070
"use-sync-external-store": "vendor-canvas",
7171
// Markdown 管线
72-
// 🔴 以下三件是 **md → katex** 反向边的一条桥(`hast-util-to-jsx-runtime` → `property-information`),
73-
// 必须留在 vendor-md:归回 vendor-katex 会让该方向复活。⚠️ **Task 5 实测的诚实边界**:
74-
// 只挪这三件**不足以断环** —— 本组的 `hastscript` 仍 import `hast-util-parse-selector`
75-
// (仍登记在 vendor-katex)⇒ 构建**依旧**打印 `Circular chunk: vendor-katex -> vendor-md ->
76-
// vendor-katex`,两 chunk 依旧互相静态 import(130.58 kB gzip 熔成不可分簇)。
77-
// 已实测的**断环最小解** = 把 `hast-util-parse-selector` 一并挪来本组(我实测:vite 不再打印
78-
// 该警告、md→katex 边归零只剩 katex→md 单向);该行**超出控制方授权范围 ⇒ 本批未落地**,
79-
// 证据与复现命令见 `.superpowers/sdd/2026-09-11-frontend-redesign-batch2-bundle/task-5-report.md` §C。
72+
// 🔴 以下四件是断 `vendor-md ⇄ vendor-katex` **循环 chunk** 的关键,必须留在 vendor-md:
73+
// 它们消掉了两条 md → katex 边 ——
74+
// ① `hast-util-to-jsx-runtime` → `property-information`(前三件即可消除)
75+
// ② `hastscript` → `hast-util-parse-selector`:**移动一个模块必须连它自己的依赖一起挪**。
76+
// 只把 `hastscript` 挪来、把它的直接依赖 `hast-util-parse-selector` 留在 katex,
77+
// 就是一次**不完整的移动**,环仍在(Task 5 实测:3 行版构建照旧打印循环警告)。
78+
// 归回 katex 会立刻复活环:vite 打印 `Circular chunk: vendor-katex -> vendor-md ->
79+
// vendor-katex`,两 chunk 熔成不可分簇 ⇒「懒 markdown」与「懒 katex」变成同一件事。
80+
// 剩下的 katex → md 单向边(rehype-katex / hast-util-to-text / hast-util-from-dom →
81+
// unist-util-* / hastscript / web-namespaces)不成环,是允许的方向。
82+
// 证据与复现:task-5-report.md §C(P0 三行仍在环 / P1 四行环消失 的对照构建)。
8083
"property-information": "vendor-md",
8184
hastscript: "vendor-md",
8285
"web-namespaces": "vendor-md",
86+
"hast-util-parse-selector": "vendor-md",
8387
"react-markdown": "vendor-md",
8488
unified: "vendor-md",
8589
bail: "vendor-md",

0 commit comments

Comments
 (0)