写在前面
Node.js 前不久发布了v13.2.0,宣布开始支持ES modules。在此之前,想要在node中使用ES modules,需要添加--experimental-module
。v13.2.0版本后,可以直接使用ES modules了。
在Node中使用ES Modules
想要在项目中使用ES modules,有以下两种方法:
1、文件后缀名使用.mjs
举个例子,假设项目目录如下:
.|____component| |____a.mjs|____index.mjs
文件内容如下:
// component/a.mjslet a = 'This is component a';export default a; // index.mjsimport a from './component/a.mjs';console.log(a);
执行node index.mjs
,代码可以正确执行,输出如下:
(node:77465) ExperimentalWarning: The ESM module loader is experimental.This is component a
2、文件依然使用.js
的后缀名,在项目的package.json
中设置:type:module
项目目录如下:
.|____component| |____a.js|____package.json|____index.js
各个文件内容如下:
// component/a.jslet a = 'This is component a';export default a; // index.jsimport a from './component/a.mjs';console.log(a); // package.json{ ... "type": "module", // 必须要有这一行 ...}
执行node index.js
,代码可以正确执行,输出如下:
(node:78977) ExperimentalWarning: The ESM module loader is experimental.This is component a
如果在命令行使用ES module,需要加上--input-type=module
。举个例子:
node --input-type=module --eval "import { sep } from 'path'; console.log(sep);"
需要注意的是,目前,ES module的实现还是实验性质的,后续有随时调整的可能。
Import
import引入ES module时,支持以下几种方式:
- 相对路径 (
./file.mjs
) - 绝对路径 (
file:///opt/app/file.mjs
) - 模块名 (
es-module-package’
) - 模块内路径 (
es-module-package/lib/file.mjs
)
另外,使用import引用ES module时,可以像这样使用:
import _ from ‘es-module-package’
import { shuffle } from ‘es-module-package
import * as fs from ‘fs
所有的Node内置模块,例如fs
和path
,均支持上述三种方式来引用。
Import与Commonjs
import也可以引入Commonjs的模块,包含以下两种情况:
1、模块使用Commonjs规范编写,并且后缀名为:.cjs
例如代码目录如下:
.|____component| |____a.cjs|____package.json|____index.js
文件内容如下:
// component/a.cjslet a = 'This is component a';console.log('aaaa');module.exports = a; // index.jsimport a from './component/a.cjs'; console.log(a); // package.json{ ... "type": "module", ...}
执行node index.js
,代码可以正确执行,输入如下:
(node:81677) ExperimentalWarning: The ESM module loader is experimental.aaaaThis is component a
2、模块拥有自身的package.json,没有设置"type": "module"
或设置"type": "commonjs"
。
举个例子,代码目录如下:
.|____component| |____a.js| |____package.json|____package.json|____index.js
文件内容如下:
// component/a.jslet a = 'This is component a';console.log('aaaa');module.exports = a; // component/package.json{ "type": "commonjs" // 也可以不设置type字段} // index.jsimport a from './component/a.js';console.log(a); // package.json{ ... "type": "module", ...}
执行node index.js
,代码可以正确执行,输入如下:
(node:81677) ExperimentalWarning: The ESM module loader is experimental.aaaaThis is component a
写在后面
本文通过示例,简单介绍了Node.js中ES Module的相关使用方法,更多详细介绍请参考官方文档: