ONE EDGE · BEFORE → AFTER
把一根「查号」线,换成一根「名片」线
例子卡说的那件事,就是下面这两条线的差别。
上面那条线经过 3 个中间人,下面那条只经过 0 个。工厂本身(lrc.js)两边都不动。
本页只解释,不改产品代码。LRC 这根边还没真的迁移;行号取自当前工作树。
01三个名词 = 三个实物
"依赖袋"不是术语,是我随手起的名字。它对应下面三样东西,都能点进文件。
02这根边今天是这么走的
从"有人写了个解析 LRC 的函数"到"导入按钮能用",经过四站。
03亲手把电话簿按坏
规则照抄 editor-runtime.js:20-35。改名字,点查号。
04工厂收到的是"那一刻"的 helpers
门面的 34 次查号顺序如下。排在切线左边的才塞进了袋子,右边的看不见。点时刻切换切线。
这一刻已经在袋里 · 22
▼第 33 行utils-lrc
在这里进袋
在这里进袋
还进不去 · 11
例外:
utils-word-timing(第 30 行)查回来存进 wordTimingHelpers,从没进袋子,只在第 349 行展开到最终对象。后面的工厂拿不到它。05那 4 行代码,一行一行对回现状
左边新代码,右边它顶掉的现状。三行等价,一行不等价。
新代码(目标形状)
顶掉的现状(真实代码)
等价换形
import { createUtilsModule as createLrcModule }
from "../shared/utils/lrc.js";必须起别名:清单里 63 个模块有 40+ 个都叫 createUtilsModule,同作用域直接撞名。→
build-editor.mjs:144,167 代写的
import + MAWE.register("utils-lrc", …)查号从"运行时按字符串"变成"构建期按路径"等价
const lrcHelpers = createLrcModule(editorHelpers);lrc 的工厂现在不收参数,传袋子只为统一形状,行为不变。→
MAWE.resolve('utils-lrc', helpers)
/* 写在 :33 里 */同一个袋子、同一个时刻,只是不再经手电话簿完全等价
Object.assign(editorHelpers, lrcHelpers);现状这行本来就长这样。→
Object.assign(helpers, …)
/* editor-utils.js:33 */塞 parseLrcSegments 进袋子⚠ 不等价
window.AsrEditorUtils = Object.freeze(editorHelpers);现状是手工列 key 的清单,不是冻结袋子。顺手改=同一步里扩大公开面。见坑 1。→
window.AsrEditorUtils = {
...wordTimingHelpers,
PROJECT_SCHEMA, parseLrcSegments, …
};/* :349 列 key */列 key 就是为了挡住"袋里有但不对外"的东西06本步切的是左边这根,不是右边那两根
07归属只有三条路,前两条现在是死的
08其余四个坑(每个一张小图)
坑 1冻结整个袋子 ≠ 现状那份清单
换成 freeze(helpers) 会顺手扩大公开面,而且只是浅冻结。
所以:这一行保持现状,"发布面"另立一步单独验证。
坑 2「查回来 → 塞袋 → 冻结」这套模板有个例外
套模板没注意这个例外,迁完会出现"某个函数突然没了"。
坑 3"ESM 入口"目前不存在
卡片里那个写 import 的入口文件要新建;现在 import 全是 builder 代写。
坑 4行序 = 依赖图本身
"在原来的初始化点创建同一份 helper"——位置比写法更要紧。
坑 5注册表不缓存:查到一次就执行一次
第 03 节演示框按两次查号就能看到计数在涨。
09真要动手时该碰的文件
| 文件 | 现在 | 本步 |
|---|---|---|
web/shared/utils/lrc.js | 无参工厂 | 不动 |
web/editor-modules.json:130 | 声明 utils-lrc | 按第 07 节选归属 |
scripts/build-editor.mjs:144,167,169 | 代写 import+register;清单外按 classic 内联 | 需补"由入口手工装配"的表达 |
web/shared/editor-utils.js:33 | resolve('utils-lrc', helpers) | 换成 import 结果,位置不动 |
web/shared/editor-utils.js:349 | 显式列 key | 不动(坑 1) |
web/editor/boot/* | 零 import | 新建 ESM 入口 |
…multi-import.js:238 · …loading-progress.js:60 | 走全局桥 | 不动(第 06 节虚线) |
pnpm run check:editor # 产物新鲜度
node scripts\build-editor.mjs --write # 改装配逻辑后重建
node --test tests\test_editor_script_syntax.mjs tests\test_editor_script_order.mjs
python scripts\run_check.py --timeout 180 -- uv run --no-sync python scripts\run_tests.py