Skip to content

Commonjs 与 ESM 互相转换

cjs 转 esm

js
    esbuild.transformSync(code, {
        loader: 'jsx',
        format: 'esm'
    })

原理:将模块内容包裹到一个函数内,通过参数的形式传入module对象和module.exports属性,函数的执行结果为module.exports属性的值,并且通过高阶函数的形式来增加缓存导出的功能,转换导出的话直接export default该函数的执行结果,导入的话不能单独转换,需要都打包到同一个文件中,所以也就不存在转换后的import语句。

esm 转 cjs

js
    esbuild.transformSync(code, {
        loader: 'jsx',
        format: 'cjs'
    })

原理:所有导出的变量都挂载到一个对象上,然后module.exports该对象。导入的话会判断是经ESM转换的CJS模块,还是原始的CJS模块,都会先创建一个对象,原始CJS模块的话会添加一个default属性来保存导入的数据,非原始CJS模块的话会直接将属性拷贝到新对象上,最后这个新对象作为导入的结果。