Node项目中 CommonJs语法 和ES6 Module的语法 ,两个不同语法的文件可以互相导入吗?-灵析社区

刘传疯子

### A1: 可以混用,但最好不要这么做。 ESM 里引入 CommonJS 的话就正常 `import` 就好了,没什么特殊的。 CommonJS 里引入 ESM 稍微有点儿特殊,需要用 `dynamic import` 而不是 `require()`: - let bModule = require('./pathA/pathB/b.js'); - console.log('bModule', bModule); + import('./pathA/pathB/b.js').then((bModule) => { + console.log('bModule', bModule); + }); * * * ### A2: `.mjs`、`.cjs` 文件分别以何种方式加载这没什么争议,有问题的是 `.js` 这种文件。 因为模块加载器需要提前知道一个 `.js` 到底是 CommonJS 还是 ESM 的、好来决定用哪种方式去加载,但显然通过文件名本身是没办法知道的,所以变成了通过 package.json 来区分。优先会找你导入的那个模块同级目录下的 package.json、如果没有那就向上一级目录找、还没有就再向上 …… 直到项目根目录为止,此时也就是跟你项目本身的设置保持一致了。 * * * ### A3: 如果是只支持一种模块方案的,那就在 `package.json` 里配置 `type` 这个字段来标明。不标明默认就是 CommonJS,毕竟要跟以前的 Node 项目兼容 —— 老项目肯定都是只支持 CommonJS 的。 如果两种都支持,Node v14 之后 `package.json` 有了 `exports` 这个新的配置,你可以通知配置 CommonJS 和 ESM 两种模块的指向。新一点的库一般都是这种方式了,你会发现它的项目结构里同时有 `es` 和 `lib` 两个子目录,其实就分别代表 ESM 和 CommonJS,然后 `exports` 里会分别指向这两个目录。 当然了,开发的时候都是按一种方式去开发,最后通过 Webpack、Rollup 之类的构建工具转译成两种模块方案;而不是写两遍代码。

阅读量:1

点赞量:0

问AI