aimode-compiler / aimode 代码审查问题记录

审查日期: 2026-07-04 审查范围: toolkit/ascf-toolkit/lib/aimode-compiler/ + toolkit/ascf-toolkit/lib/aimode/

Bug

1. aimode/compiler/template-compiler.js:40 — 指令替换顺序错误(子串匹配)

Object.keys(directiveMap.DIRECTIVE_MAP) 按插入顺序迭代,has:for 在 has:for-items 之前,导致 has:for-items 先被 has:for → v-for 替换成 v-for-items,后续再也匹配不到正确的 has:for-items。

修复方向: 按 key 长度降序排序后再遍历,确保长指令优先匹配。

2. webpack-config-factory.js:60 — 硬编码个人路径 ✅ 已修复

3. aimode/writers/card-writer.js:85-86 — 模板字符串单引号未转义

escapedTemplate 替换了 \、`、$,但第 85 行用单引号包裹模板内容:

'    template: \'' + escapedTemplate + '\','

模板内若含单引号会破坏生成的 JS 字符串字面量。

修复方向: escapedTemplate 增加 ' → \' 的转义。


Dead Code

4. aimode/config.js — 整文件未使用

WX_TO_HAS_API 和 AI_MODE_MARKERS 均未被任何其他模块 import。可直接删除。

5. aimode/transforms/skill.js — 零实际转换

var content = fs.readFileSync(indexPath, 'utf-8')
if (content.indexOf('createSkill') === -1) {
  console.warn(...)
}
fs.writeFileSync(indexPath, content, 'utf-8')

读取文件 → 检查 createSkill → 原样写回。没有任何字符串替换或 AST 转换。

修复方向: 删除该文件,并从 aimode/index.js 移除调用。

6. aimode-compiler/file-generator.js:walkDir() — 未调用

walkDir 函数(第 204 行)定义了但从未被调用,也未 export。可直接删除。

7. aimode-compiler/file-generator.js:bundleModule() + cjsToEsm() — 仅测试使用

两个函数只在 __tests__/index.test.js 中使用,生产代码没有任何调用方。

修复方向: 如果确定不需要,删除函数 + 对应测试。如果保留以备将来使用,加注释说明。


不好的实现

8. aimode/transforms/app.js:16-25 — 无实际变更的读写

读取 app.json → 遍历验证 skills → JSON.stringify(content, null, 2) 写回。唯一效果是 JSON 格式化。warning 信息有用但 transform 名不副实。

修复方向: 要么去掉格式化写入(只保留 warning),要么重命名为 validateAppJson。

9. aimode/transforms/component.js — 与 js-api.js 冗余

component.js 只做 wx.modelContext → has.modelContext,但 js-api.js 已在步骤 1 做了全局 wx. → has.(Babel AST 级别)。component.js 中的检查 has.modelContext 已存在时会跳过 — 这意味着 js-api 已处理后它永远不执行。

修复方向: 确认 js-api 是否已覆盖所有场景,若是则删除 component.js 的替换逻辑(或整个文件)。

10. aimode/compiler/style-compiler.js — CSS 透传、scopeId 未生效

compileCSS 计算了 scopeId 但 processedCSS = cssContent(原样透传),没有对 CSS 选择器做任何 scoping 变换(如添加 [data-scope-xxx] 属性选择器)。

修复方向: 要么实现 CSS scoping,要么移除 scopeId 避免误导。

11. aimode/writers/card-writer.js:65 — 正则无法匹配嵌套 data

var dataMatch = jsContent.match(/data\s*:\s*(\{[^}]+\})/)

[^}]+ 遇到嵌套对象的第一个 } 就会截断。

修复方向: 使用 brace-matching 或 Babel 解析。

12. aimode/writers/card-writer.js:29 — 脆弱的相对路径

var baseDir = options.outputDir || path.join(cardDir, '../../../../output/cards')

依赖调用方目录正好在 4 层深度之下。

修复方向: 使用绝对路径或 path.resolve(projectPath, 'output/cards')。

13. aimode-compiler/component-builder.js:38 — 无路径格式校验

var compName = path.basename(path.dirname(comp.path))

若 comp.path 无父目录(如 "index"),path.dirname 返回 ".",path.basename(".") = "."。

修复方向: 校验 comp.path 至少包含一层目录,否则跳过并 warn。