静态分析能自动识别重写CommonJS语法但不能一键迁移,需三步:配置识别(检查package.json"type": "module")、语法转换(require→import等)、边界修复(__dirname替换、动态导入标注等)。
静态分析能自动识别和重写 CommonJS 模块语法,但不能“一键完成”迁移——它解决的是可判定部分,比如 require 和 module.exports 的模式匹配与替换,而路径补全、动态导入判断、__dirname 替换、第三方兼容处理等需结合规则+人工校验。核心是三步:配置识别、语法转换、边界修复。
静态分析工具(如 jscodeshift、esbuild --tree-shaking 配合自定义插件,或专用迁移工具 cjs-to-esm)需先确认项目是否已声明 ESM 意图:
package.json 是否含 "type": "module";若无,工具应提示添加,否则后续解析可能误判为 CJS.cjs 文件),静态分析需按扩展名分组处理,避免跨类型误改.js 判断)——Node.js v14+ 后,type 字段才是权威依据这是静态分析最成熟的部分,基于 AST 精准定位并替换:
const fs = require('fs'); 转为 import fs from 'fs';;将 const { read } = require('fs'); 转为 import { read } from 'fs';
require('./util') 自动补扩展名,生成 import util from './util.js'(非 .mjs,因 type: module 下 .js 已为 ESM)module.exports = function() {} → export default function() {};识别 module.exports.a = 1; module.exports.b = 2; → export const a = 1; export const b = 2;
require(someVar) 或拼接路径 require('./' + name),标记为「需手动处理」静态分析无法执行代码,但可检测潜在 ESM 不兼容点并生成报告:
import.meta.url 并附转换公式(如 new URL('./', import.meta.url).pathname)if (x) require('a') else require('b') 模式,提示改用 await (x ? import('a') : import('b')),并检查所在作用域是否支持顶层 awaitnode_modules 中各依赖的 package.json,提取 exports、type、main、module 字段,标出仅提供 CJS 入口的包(如未导出 exports['.']['import'])import 链(如 A → B → A)高质量的静态分析不止输出代码,还提供验证支持:
test-esm.mjs,尝试 import 所有被修改的入口文件,捕获 ERR_MODULE_NOT_FOUND 或 ERR_UNSUPPORTED_DIRNAME
index.js.cjs.bak),确保可快速回退node_modules 或配置文件(如 webpack.config.cjs),这些需单独评估