在 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 相关文章推荐
javascript下给元素添加事件的方法与代码
Aug 13 Javascript
JavaScript实现继承的4种方法总结
Oct 16 Javascript
JS获取input file绝对路径的方法(推荐)
Aug 02 Javascript
关于JSON与JSONP简单总结
Aug 16 Javascript
BootStrap 下拉菜单点击之后不会出现下拉菜单(下拉菜单不弹出)的解决方案
Dec 14 Javascript
jquery实现二级导航下拉菜单效果实例
May 14 jQuery
vue iview多张图片大图预览、缩放翻转
Jul 13 Javascript
vue源码nextTick使用及原理解析
Aug 13 Javascript
JS数组方法reduce的用法实例分析
Mar 03 Javascript
ES2020系列之空值合并运算符 '??'
Jul 22 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
Sep 02 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
Sep 04 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
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
解决nginx不支持thinkphp中pathinfo的问题
2015/07/21 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
JavaScript入门学习书籍推荐
2008/06/12 Javascript
Jquery ThickBox插件使用心得(不建议使用)
2010/09/08 Javascript
关于JS中的闭包浅谈
2013/08/23 Javascript
js 阻止子元素响应父元素的onmouseout事件具体实现
2013/12/23 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
2014/03/19 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
详解Python中的相对导入和绝对导入
2017/01/06 Python
Python网络编程 Python套接字编程
2017/09/13 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
python 多进程队列数据处理详解
2019/12/23 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
numpy库reshape用法详解
2020/04/19 Python
Keras预训练的ImageNet模型实现分类操作
2020/07/07 Python
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
夜大毕业生自我评价分享
2013/11/10 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
简单租房协议书
2014/04/09 职场文书
工程售后服务方案
2014/06/08 职场文书
记账会计岗位职责
2014/06/16 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
清洁工个人总结
2015/03/04 职场文书
警示教育观后感
2015/06/17 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书