preface
在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS
和 AMD
两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS
和 AMD
模块,都只能在运行时确定这些东西。比如,CommonJS
模块就是对象,输入时必须查找对象属性
node采用的模块方案是CommonJS
。
module正是ES6引入的模块方案。node对ES6支持一直不错,不过并没有支持module,因为和node自身使用的CommonJS
有所冲突,没拿出比较合适的解决方案。
直到最近的v8.5.0
才开始支持module,到本文写作时,最新的版本是v8.7.0
使用
module
Add support for ESM. This is currently behind the --experimental-modules
flag and requires the .mjs extension. node --experimental-modules index.mjs
目前使用这个功能,还需要将你的js文件后缀从js
改为mjs
以下是示范
one.mjs
1 | let firstName = 'Michael'; |
tow.mjs
1 | import {firstName, lastName, year} from './one'; |
node --experimental-modules tow.mjs
main.mjs
1 | let tokenizer = (input) =>{ |
app.mjs
1 | import {tokenizer} from './main' |
node --experimental-modules app.mjs