在 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 相关文章推荐
Jquery实现图片预加载与延时加载的方法
Dec 22 Javascript
js判断是否按下了Shift键的方法
Jan 27 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
Jan 06 Javascript
基于javascript实现右下角浮动广告效果
Jan 08 Javascript
Treegrid的动态加载实例代码
Apr 29 Javascript
浅谈jquery点击label触发2次的问题
Jun 12 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
Nov 28 Javascript
jQuery将表单序列化成一个Object对象的实例
Nov 29 Javascript
canvas绘制的直线动画
Jan 23 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
Jan 04 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
May 05 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
Jun 05 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
[原创]网络复制内容时常用的正则+editplus
2006/11/30 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
微信公众号中的JSSDK接入及invalid signature等常见错误问题分析(全面解析)
2020/04/11 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
Python常见数据类型转换操作示例
2019/05/08 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
Python制作词云图代码实例
2019/09/09 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
最新党员思想汇报
2014/01/01 职场文书
大学迎新晚会主持词
2014/03/24 职场文书
安全在我心中演讲稿
2014/09/01 职场文书
初中教师个人工作总结
2015/02/10 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript
SpringRetry重试框架的具体使用
2021/07/25 Java/Android