在 Node.js 中使用原生 ES 模块方法解析


Posted in Javascript onSeptember 19, 2017

从版本 8.5.0 开始,Node.js 开始支持原生 ES 模块,可以通过命令行选项打开该功能。新功能很大程度上得归功于 Bradley Farias。

1.演示

这个示例的代码目录结构如下:

esm-demo/
 lib.mjs
 main.mjs

lib.mjs:

export function add(x, y) {
 return x + y;
}

main.mjs:

import {add} from './lib.mjs';
console.log('Result: '+add(2, 3));

运行演示:

$ node --experimental-modules main.mjs
Result: 5

2.清单:需要注意的事情

ES 模块:

·不能动态导入模块。但是 动态import() 的相关工作正在进行中,应该很快就能提供支持。

·没有元变量,如 __dirname 和 __filename。但是,有一个的类似功能的提案:“import.meta”。看起来可能是这样:

console.log(import.meta.url);

·现在所有模块标识符都是 URL(这部分在 Node.js 是新增的):

·文件 - 带文件扩展名的相对路径: ../util/tools.mjs

·库 - 没有文件扩展名,也没有路径 lodash

·如何更好地使 npm 库在浏览器中也可用(不使用 bundler)仍有待观察。一种可能性是引入 RequireJS 风格的配置数据,将路径映射到实际路径。目前,在浏览器中使用 bare path 的模块标识符是非法的。

与 CJS 模块的互操作性

你可以导入 CJS 模块,但它们总是只有默认的导出 - 即 module.exports 的值。让 CJS 模块支持命名导出已经在做了,但可能需要一段时间。如果你能帮忙,可以来做。

import fs1 from 'fs';
console.log(Object.keys(fs1).length); // 86
import * as fs2 from 'fs';
console.log(Object.keys(fs2)); // ['default']

 · 不能在 ES 模块中使用 require()。主要原因是:

 · 路径解析工作稍有不同:ESM 不支持 NODE_PATH 和 require.extensions。而且,它的标识符始终是 URL 也会导致一些细微差异。

 · ES 模块始终以异步方式加载,这确保了与 Web 的最大兼容性。这种加载风格并不能通过 require() 混合使用同步加载 CJS 模块。

 · 禁止同步模块加载也可以为 Top-level await 导入 ES 模块保留后路(一个当前正在考虑的功能)。

3.早期版本的 Node.js 上的 ES 模块

如果要在 8.5.0 之前的 Node.js 版本上使用 ES 模块,请参阅 John-David Dalton 的 @std/esm。

提示:如果不启用任何可解锁的额外功能,将在 Node.js 保持 100% 兼容原生 ES 模块.

FAQ

什么时候可以不带命令行选项使用ES 模块?

目前的计划是在 Node.js 10 LTS 中默认可使用 ES 模块。

进一步阅读

有关 Node.js 和浏览器中 ES 模块的更多信息:

 · “Making transpiled ES modules more spec-compliant” [using ES modules natively vs. transpiling them via Babel]

 · “Module specifiers: what's new with ES modules?” [Why .mjs? How are module specifiers resolved? Etc.]

 · “Modules” [in-depth chapter on ES modules in “Exploring ES6”]

即将到来的 ECMAScript 提案:

 · 博客: “ES proposal: import() ? dynamically importing ES modules”

 · 提案: “import.meta”

总结

以上就是小编给大家带来的在 Node.js 中使用原生 ES 模块方法解析的全部内容,希望对大家有所帮助。如果您有什么问题,可以给我留言。感谢大家对本站的支持。

Javascript 相关文章推荐
Js切换功能的简单方法
Nov 23 Javascript
多种方法实现JS动态添加事件
Nov 01 Javascript
node.js实现BigPipe详解
Dec 05 Javascript
jQuery和AngularJS的区别浅析
Jan 29 Javascript
JavaScript更改字符串的大小写
May 07 Javascript
简单理解JavaScript中的封装与继承特性
Mar 19 Javascript
js实现String.Fomat的实例代码
Sep 02 Javascript
浅谈移动端之js touch事件 手势滑动事件
Nov 07 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
Apr 13 Javascript
详解win7 cmd执行vue不是内部命令的解决方法
Jul 27 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
Jan 09 Javascript
webpack下实现动态引入文件方法
Feb 22 Javascript
Webpack 服务器端代码打包的示例代码
Sep 19 #Javascript
原生js中ajax访问的实例详解
Sep 19 #Javascript
angularjs实现过滤并替换关键字小功能
Sep 19 #Javascript
详解vue-cli与webpack结合如何处理静态资源
Sep 19 #Javascript
前端常见跨域解决方案(全)
Sep 19 #Javascript
详解.vue文件中监听input输入事件(oninput)
Sep 19 #Javascript
JavaScript数组去重的多种方法(四种)
Sep 19 #Javascript
You might like
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
一个简单的jquery的多选下拉框(自写)
2014/05/05 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
javascript实现页面刷新时自动清空表单并选中的方法
2015/07/18 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
jQuery实现Table表格隔行变色及高亮显示当前选择行效果示例
2017/02/14 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
微信小程序实践之动态控制组件的显示/隐藏功能
2018/07/18 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
理解Python中的With语句
2016/03/18 Python
Python数据类型详解(四)字典:dict
2016/05/12 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
Python 代码调试技巧示例代码
2020/08/11 Python
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
体育教师工作总结的自我评价
2013/10/10 职场文书
婚礼新郎父母答谢词
2014/01/16 职场文书
房地产项目策划书
2014/02/05 职场文书
英语故事演讲稿
2014/04/29 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
鼋头渚导游词
2015/02/05 职场文书
现货白银电话营销话术
2015/05/29 职场文书
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js