CommonJs 转 ESM

101 阅读1分钟

简单记录一下自己写的一个 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。