(node9以前)
nodeJs虽然可以实现99%的ES6的新特性,但是在NodeJs中使用ES6的import/export
仍然有一定的困难.
虽然不能直接使用,但是可以间接使用.
使用转换器babel
安装npm包-babel
,使用babel将js文件编译成nodejs支持的commonJs格式的代码.
下载-babel
包:
npm install babel-register babel-preset-env -D
接着可以使用命令运行含有import/export
语句的js文件
babel-node xx.js
以上的命令显然会有些麻烦,如果直接使用node xx.js
会报以下的错:
显然不支持,但是可以从报错提示可以看出解决方案:
-
将目标js文件后缀改为:
.mjs
(nodejs实验特性 node --experimental-modules)也即运行的时候变为:
node xx.mjs
-
在package.json文件中添加字段,声明为模块
type: "module"
以上方式是nodeJs对es6模块使用的解决方式
(node9以后)
node9提供了在flag模式下使用ECMAScript Modules,使得可以不用使用工具babel进行转换也可以直接使用es6 import/export
node9之后版本不断改善对ECMAScript Modules的支持,直到现在2021-6-23
发布的 v16.4.0
版本文档上显示,nodeJS完全支持ECMAScript Modules
Node.js fully supports ECMAScript modules as they are currently specified and provides interoperability between them and its original module format, CommonJS.
翻译:
Node.js完全支持当前指定的ECMAScript模块,并提供它们与其原始模块格式CommonJS之间的互操作性。
但是NodeJs默认是使用commonJs规范去解析Js代码的,如果要使用ECMAScript Modules也即es6中的import/export
来解析JS代码,可以采用以下方式:
-
将js文件扩展名改为:
.mjs
,并且在package.json
文件中加入以下字段:type: "module"
如果没有
package.json
文件,使用以下命令进行创建:npm init -y
-
第二种方式:在flag模式下使用ECMAScript Modules,在该模式下,js文件扩展名还是要求必须是
.mjs
node --experimental-modules XX.mjs
但是只写以上的命令,还是会报错,只有在
package.json
加个type
字段才行.这方面还不是很懂为什么.原文:
Node.js treats JavaScript code as CommonJS modules by default. Authors can tell Node.js to treat JavaScript code as ECMAScript modules via the
.mjs
file extension, thepackage.json
"type"field, or the
--input-type` flag. See Modules: Packages for more details.