Node.js v8.7.0 文档


ECMAScript模块#

查看英文版 / 查看英文md文件 / 编辑中文md文件

稳定性: 1 - 试验的

Node.js包含了对基于 Node.js EP for ES Modules 的ES模块的支持。

不是所有EP的功能都是完整的并且将随着VM的支持和实现而就绪的。有问题的地方正在被修改完善。

启用#

查看英文版 / 查看英文md文件 / 编辑中文md文件

--experimental-modules 标志可用于启用加载ES模块的功能。

一旦被设置启用,以 .mjs 为后缀的文件将能够作为ES模块加载。

node --experimental-modules my-app.mjs

特性#

Supported#

查看英文版 / 查看英文md文件 / 编辑中文md文件

只有在程序主入口添加CLI参数可以成为ES模块的入口点。在未来 import() 可以在程序运行时创建ES模块入口点。

Unsupported#

查看英文版 / 查看英文md文件 / 编辑中文md文件

特性 原因
require('./foo.mjs') ES模块具有不同的加载方式,使用 import()语言标准
import() 等待在Node.js中使用更加新的V8版本
import.meta 等待V8实现
Loader Hooks 等待Node.js EP创建/达成共识

importrequire 之间的显著差异#

No NODE_PATH#

查看英文版 / 查看英文md文件 / 编辑中文md文件

根据 NODE_PATH 查询模块不是解析 import 的环节之一。如果想要怎么做,那么请使用符号链接。

No require.extensions#

查看英文版 / 查看英文md文件 / 编辑中文md文件

require.extensions 没有被 import 使用。但是值得期望的是,加载器钩子可能在未来提供这个工作流流程。

No require.cache#

查看英文版 / 查看英文md文件 / 编辑中文md文件

require.cache 没有被 import 使用。它有一个独立的缓存。

URL based paths#

查看英文版 / 查看英文md文件 / 编辑中文md文件

ESM基于URL语义来解析和缓存。这意味着那些包含特殊字符的文件名,如 #? 需要进行转义。

如果使用 import 来解析一个拥有不同查询或片段的模块,该模块将被加载多次。

import './foo?query=1'; // loads ./foo with query of "?query=1"
import './foo?query=2'; // loads ./foo with query of "?query=2"

直到现在,模块只能使用 file: 协议来加载。

与现有模块的交互#

查看英文版 / 查看英文md文件 / 编辑中文md文件

所有CommonJS,JSON和C++模块都可以通过 import 来加载。

以这种方式加载的模块只加载一次,即使 import 语句中同一个模块的查询或片段字符串不同。

当通过 import 加载时,这些模块将提供一个 default 导出相当于完成计算后的 module.exports

import fs from 'fs';
fs.readFile('./foo.txt', (err, body) => {
  if (err) {
    console.error(err);
  } else {
    console.log(body);
  }
});