# 05 — 模块合成:保声明的 export 改写 Status: resolved Type: task ## 问题 `file://` 下不能用 ES module,所以发布版的 ES module 要在自包含包里合成经典脚本。第一版把 `export const X = 1` 改写成 `exports.X = 1`,**删掉了模块内的局部绑定**。 症状极具误导性:构建、加载、尺寸检查全部正常,只在第一帧渲染时抛 `ReferenceError: REFERENCE_ASPECT is not defined`——因为默认参数 `referenceAspect = REFERENCE_ASPECT` 到那一刻才求值。 ## 答案 改写**保留声明**,把导出追加到模块体末尾: | 源码 | 产物 | | --- | --- | | `export const X = 1` | `const X = 1` … 末尾 `exports.X = X;` | | `export function f() {}` | `function f() {}` … 末尾 `exports.f = f;` | | `export default {…}` | `exports.default = {…}` | 收尾有一道 `if (/^export\b/m.test(out)) throw` 兜底,任何漏改的 `export` 都会在构建期报错而不是留到浏览器。 ## 影响 `tools/checks/test-transform-module.mts` 里 **9 条断言编码的是旧的错误输出**,必须一并改写。新增两组断言:一组确认本地绑定还活着,一组把改写后的代码**真的跑一遍**(不只是解析),确保产物可执行。