期待已久 Nodejs 开始支持 ES6 模块
发布于 7 年前 作者 Lizhooh 20914 次浏览 来自 分享

前言

前几天,看到 Chrome 61 发布,支持 ES6 模块。Chrome 61 Beta:JavaScript 模块,桌面端的支付请求 API

<script type="module" src="main.js"></script>

<script type="module">
    import { addTextToBody } from './utils.js';
    addTextToBody('Modules are pretty cool.');
</script>

补充:ES6 模块在浏览器上使用参考,ECMAScript modules in browsers

随后,Nodejs 迅速跟上,更新到 v8.5.0,实验性的支持 ES6 模块。

支持 ES6 模块

20170914140254.png

在 v8.5.0 的提案中,可以看到 Nodejs 开始实验性支持 ES6 模块,不过需要命令来开启。v8.5.0 proposal #15308

20170914093620.png

这个新功能的大部分功劳都归功于 Bradley Fariasmodule: Allow runMain to be ESM #14369

使用姿势

文件结构:

demo/
    lib.mjs
    main.mjs

相关代码:

// lib.mjs [注意后缀是 mjs]
export function add(x, y) {
    return x + y;
}

// main.mjs [注意后缀是 mjs]
import { add } from './lib.mjs';
console.log('Result: '+add(2, 3));

运行结果:

$ node main.mjs --experimental-modules  # 注意加 --experimental-modules
Result: 5

目前来说,使用起来还是比较麻烦的。那么 ES6 模块什么时候可以无需命令行选项就能使用?目前的计划是在 Node.js 10 LTS 中默认支持 ES6 模块。当然,大家的热情肯定不只如此,也可能会在 v10.0.0 之前就可以稳定支持了。(^__^)

13 回复

最终方案订了?就是 mjs 了?

@rwing 没有,当前稳定性是 1 (此功能仍处于积极的发展阶段,并且在任何将来的版本中都会进行非向后兼容的更改,甚至删除。)

有点遥远 - -//

事实上就是没什么卵用

然并卵,对于 node 开发者没啥追新的必要性,更何况现在不支持互调,残废品。

@atian25 这么说就不对了吧,现在的require是完全同步操作,在异步的node里,你咋不说require是残废品呢?

而且mjs和js能在项目结构里区分出模块和文件,对于团队开发是很好的。

很期待快点变为stable吧!

更期待nodejs的10LTS

有个疑问,nodejs 模块是放在 nodemodules 目录的,那这个 import 怎么搞?也支持 nodejs 这一套吗

等 v10.0 吧,据说还支持 import() 形式

使用TypeScript;你要的都有[滑稽]

@meiwhu 用 typescript/babel 转出来的代码,会不会比原生的代码要慢?有没有做过测试?

@Lizhooh 没有测试;不过我相信微软做编程语言的实力;而且即使有差距,也不重要,除非是要使用node进行大量计算,如果这样还不如写C。

@Bingmang 都不能互相调用,项目里区分 mjs 和 js 有啥用……

回到顶部