Skip to content

ESM

ESM 是 JavaScript 标准模块系统。Node.js 通过 .mjs.cjs 扩展名或最近的 package.jsontype 字段确定模块类型。

json
{
  "type": "module"
}
js
// math.js
export function add(a, b) {
  return a + b
}

// app.js
import { add } from './math.js'
import { readFile } from 'node:fs/promises'

必知规则

  • 相对和绝对 import 必须写完整扩展名:./math.js,不能写 ./math
  • 内置模块使用 node:,明确避免与三方包同名:node:path
  • ESM 没有 requiremodule.exports__filename__dirname
  • ESM 支持顶层 await,但入口模块的顶层等待会延迟整个模块图的执行。

当前文件与资源

Node.js 20.11+ 可使用 import.meta.dirnameimport.meta.filename。为兼容较低版本,或加载相邻资源时,直接基于 import.meta.url 构造 URL:

js
import { readFile } from 'node:fs/promises'

const content = await readFile(new URL('./template.html', import.meta.url), 'utf8')

exports 边界

发布包时使用 package.jsonexports 声明公共入口,避免消费者深层导入内部文件;条件导出可为 importrequire 分别提供 ESM/CJS 入口。

基于 MIT 许可发布