前言
前几天,看到 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 模块
在 v8.5.0 的提案中,可以看到 Nodejs 开始实验性支持 ES6 模块,不过需要命令来开启。v8.5.0 proposal #15308
这个新功能的大部分功劳都归功于 Bradley Farias。module: 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 之前就可以稳定支持了。(^__^)
最终方案订了?就是 mjs 了?
@rwing 没有,当前稳定性是 1 (此功能仍处于积极的发展阶段,并且在任何将来的版本中都会进行非向后兼容的更改,甚至删除。)
有点遥远 - -//
事实上就是没什么卵用
然并卵,对于 node 开发者没啥追新的必要性,更何况现在不支持互调,残废品。
@atian25 这么说就不对了吧,现在的require是完全同步操作,在异步的node里,你咋不说require是残废品呢?
而且mjs和js能在项目结构里区分出模块和文件,对于团队开发是很好的。
很期待快点变为stable吧!
更期待nodejs的10LTS
有个疑问,nodejs 模块是放在 nodemodules 目录的,那这个 import 怎么搞?也支持 nodejs 这一套吗
那就等10lts
等 v10.0 吧,据说还支持 import() 形式
使用TypeScript;你要的都有[滑稽]
@meiwhu 用 typescript/babel 转出来的代码,会不会比原生的代码要慢?有没有做过测试?
@Lizhooh 没有测试;不过我相信微软做编程语言的实力;而且即使有差距,也不重要,除非是要使用node进行大量计算,如果这样还不如写C。
@Bingmang 都不能互相调用,项目里区分 mjs 和 js 有啥用……