现状
目前如果不使用 Typescript 主流项目还是使用 CommonJS ,Sentry 则同时提供 ESM 且为默认展示。
如何启用 ESM
从 Node v15.3.0 版本开始,ESM 不需要使用 experimental 开关了,按官方文档,需要以下几种方式启用:
- 后缀为
.mjs
- 在
package.json
设置"type": "module"
--input-type
,如:cat use-esm.js | node --input-type=module
第三方 lib 只支持 CommonJS 格式
如 koa-router
只支持了 CommonJS 格式,那么在 ESM 中能使用吗?答案是可以的。阮一峰的Node.js 如何处理 ES6 模块有详细阐述,摘抄如下:
ES6 模块的
import
命令可以加载 CommonJS 模块,但是只能整体加载,不能只加载单一的输出项。
// 正确 import packageMain from 'commonjs-package'; // 报错 import { method } from 'commonjs-package';
这是因为 ES6 模块需要支持静态代码分析,而 CommonJS 模块的输出接口是
module.exports
,是一个对象,无法被静态分析,所以只能整体加载。加载单一的输出项,可以写成下面这样。
import packageMain from 'commonjs-package'; const { method } = packageMain;