简单记录一下自己写的一个 CommonJs 转 ESM 的插件:
const types = require('@babel/types')
function replaceExportConstToDotAssignment() {
return {
visitor: {
ExportNamedDeclaration(path) {
if (
path.node.declaration &&
path.node.declaration.type === 'VariableDeclaration' &&
path.node.declaration.kind === 'const' &&
path.node.declaration.declarations.length === 1
) {
const declaration = path.node.declaration.declarations[0]
if (
declaration.id.name === 'appDevConfig' &&
declaration.init &&
declaration.init.type === 'ArrayExpression'
) {
// 创建新的MemberExpression节点
const memberExpr = types.memberExpression(
types.identifier('exports'),
types.identifier('appDevConfig'),
false
)
// 创建新的AssignmentExpression节点
const assignmentExpr = types.assignmentExpression(
'=',
memberExpr,
declaration.init
)
// 替换原来的ExportNamedDeclaration为ExpressionStatement
const newStatement = types.expressionStatement(assignmentExpr)
path.replaceWith(newStatement)
}
}
}
}
}
}
module.exports = replaceExportConstToDotAssignment
可能没有适配所有情况,后续会不断完善,end。