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 — 硬编码个人路径 ✅ 已修复
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。