# 前言
Node 9最激动人心的是提供了在flag模式下使用ECMAScript Modules,虽然现在还是Stability: 1 - Experimental阶段,但是可以让Noder抛掉babel等工具的束缚,直接在Node环境下愉快地去玩耍import/export
如果觉得文字太多,看不下去,可以直接去玩玩demo,地址是https://github.com/chenshenhai/node-modules-demo
# Node 9下import/export使用简单须知
- Node 环境必须在 9.0以上
- 不加loader时候,使用
import/export的文件后缀名必须为*.mjs(下面会讲利用Loader Hooks兼容*.js后缀文件) - 启动必须加上flag
--experimental-modules - 文件的
import和export必须严格按照ECMAScript Modules语法 ECMAScript Modules和require()的cache机制不一样
# 使用简述
Node 9.x官方文档 https://nodejs.org/dist/latest-v9.x/docs/api/esm.html
# 与require()区别
| 能力 | 描述 | require() | import |
|---|---|---|---|
| NODE_PATH | 从NODE_PATH加载依赖模块 | Y | N |
| cache | 缓存机制 | 可以通过require的API操作缓存 | 自己独立的缓存机制,目前不可访问 |
| path | 引用路径 | 文件路径 | URL格式文件路径,例如import A from './a?v=2017' |
| extensions | 扩展名机制 | require.extensions | Loader Hooks |
| natives | 原生模块引用 | 直接支持 | 直接支持 |
| npm | npm模块引用 | 直接支持 | 需要Loader Hooks |
| file | 文件(引用) | *.js,*.json等直接支持 |
默认只能是*.mjs,通过Loader Hooks可以自定义配置规则支持*.js,*.json等Node原有支持文件 |
# Loader Hooks模式使用
由于历史原因,在ES6的Modules还没确定之前,JavaScript的模块化处理方案都是八仙过海,各显神通,例如前端的AMD、CMD模块方案,Node的CommonJS方案也在这个“乱世”诞生。 当到了ES6规范确定后,Node的CommonJS方案已经是JavaScript中比较成熟的模块化方案,但ES6怎么说都是正统的规范,“法理”上是需要兼容的,所以
*.mjs这个针对ECMAScript Modules规范的Node文件方案在一片讨论声中应运而生。
当然如果
import/export只能对*.mjs文件起作用,意味着Node原生模块和npm所有第三方模块都不能。所以这时候Node 9就提供了Loader Hooks,开发者可自定义配置Resolve Hook规则去利用import/export加载使用Node原生模块,*.js文件,npm模块,C/C++的Node编译模块等Node生态圈的模块。
# Loader Hooks 使用步骤
- 自定义loader规则
- 启动的flag要加载loader规则文件
- 例如:
node --experimental-modules --loader ./custom-loader.mjs ./index.js
- 例如:
# Koa2 直接使用import/export
看看demo4,https://github.com/chenshenhai/node-modules-demo/tree/master/demo4
- 文件目录
├── esm
│ 