Node 新增 ES6 Modules 支持,不用 Babel 实现 import

Node 新增 ES6 Modules 支持,不用 Babel 实现 import

刚刚不久(9月8日凌晨),Node 项目 master 合并了实验性的 import 关键字支持,全称 ECMAScript Modules。

新功能文档见:github.com/nodejs/node/

科普

  • require 关键字是 CommonJS 规范里支持 JavaScript 文件之间依赖的通用规范
  • import 关键字是 ES6 里的严肃模块依赖规范

由于早年 JavaScript 还算不上是一个严肃的编程语言,该规范的实现是在运行时加载依赖文件,实际上是运行时动态加载一个 object,模块的输出都是 object 的 field。

require 规范对于模块间的输入输出不能做静态验证,容易在运行时崩溃,运行时崩溃对于服务端的 Node 来说这一直是个潜在隐患,就如同 Java 的 NullPointerException。

早在今年3月份,已经有了关于 Node 的 ES6 模块支持提议:github.com/nodejs/node-

import 规范则是将每个 js 文件在编译时做成一个真正的模块,可以指定模块输出的接口,其他模块则可以引入部分或者全部的接口,在编译时做到静态检查,语法功能也更加丰富便捷。import 关键字的原生支持会让 Node 更像一个严肃的服务端解决方案。

新功能尝鲜

由于 Ayo.js 的分裂还没有结束,Node 8.5.0 遥遥无期,想使用 Node 原生 import 关键字,目前需要手动编译最新 master 分支。

All CommonJS, JSON, and C++ modules can be used with import.
  • 根据新功能文档,使用 ES6 模块规范的代码和之前使用 require 的代码可以兼容
  • 建议使用 .mjs 作为模块化的 Node 源码文件后缀名
  • 编译好最新的 master 分支后,需要用实验性 flag 运行 ES6 模块源码
node --experimental-modules my-app.mjs

// my-app.mjs

// old usage:
// const readFile = require('fs').readFile;

// new usage
import { readFile } from 'fs';

目前 import 的实现还没有达到 ES6 规范,一些用法需要 V8 后续升级支持。

建议

Stability: 1 - Experimental

目前该功能还处于实验性阶段,发生变动的可能性极大,后续 Node 8.5.0 提供该功能后,也不建议立即使用。

可以先用 Babel 实现 import 语法支持,便于将来项目语法的统一。

等到 Node 8.x 进入 LTS 计划 API 稳定后,再在实际工程中使用该功能。

编辑于 2017-09-08

文章被以下专栏收录