在 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 相关文章推荐
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
Aug 21 Javascript
javascript 操作cookies及正确使用cookies的属性
Oct 15 Javascript
javascript 不间断的图片滚动并可点击
Jan 15 Javascript
javascript开发中因空格引发的错误
Nov 08 Javascript
深入解析contentWindow, contentDocument
Jul 04 Javascript
深入理解js数组的sort排序
May 28 Javascript
详解jquery easyui之datagrid使用参考
Dec 05 Javascript
JS实现焦点图轮播效果的方法详解
Dec 19 Javascript
20行JS代码实现粘贴板复制功能
Feb 06 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
Nov 01 jQuery
javascript实现简易的计算器
Jan 17 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
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
php数组操作之键名比较与差集、交集赋值的方法
2014/11/10 PHP
php查询ip所在地的方法
2014/12/05 PHP
php DES加密算法实例分析
2019/09/18 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
JS实现在页面随时自定义背景颜色的方法
2015/02/27 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
Python生成随机数组的方法小结
2017/04/15 Python
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
公司薪酬管理制度
2014/01/31 职场文书
高二政治教学反思
2014/02/01 职场文书
运动会800米加油稿
2014/02/22 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
给上级领导的感谢信
2015/01/22 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
聘任书范文大全
2015/09/21 职场文书
汽车销售合同文本
2019/08/08 职场文书
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android
剑指Offer之Java算法习题精讲二叉树的构造和遍历
2022/03/21 Java/Android