现在可以在 Node 环境使用 ESM 了吗?

439 阅读1分钟

现状

  1. 只提供 CommonJS :Node.js官方DocsExpressKoaSequalize
  2. 提供 2 种格式:Sentry
  3. TS + ESM:Nest.js

目前如果不使用 Typescript 主流项目还是使用 CommonJS ,Sentry 则同时提供 ESM 且为默认展示。

如何启用 ESM

从 Node v15.3.0 版本开始,ESM 不需要使用 experimental 开关了,按官方文档,需要以下几种方式启用:

  1. 后缀为 .mjs
  2. package.json 设置 "type": "module"
  3. --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;