在 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 模式设计之工厂模式学习心得
Apr 27 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
Jun 29 Javascript
js 中{},[]中括号,大括号使用详解
May 12 Javascript
让js弹出窗口居前显示的实现方法
Jul 10 Javascript
node.js正则表达式获取网页中所有链接的代码实例
Jun 03 Javascript
在JS数组特定索引处指定位置插入元素的技巧
Aug 24 Javascript
javascript 回调函数详解
Nov 11 Javascript
jquery dataTable 后台加载数据并分页实例代码
Jun 07 jQuery
vue实现鼠标移入移出事件代码实例
Mar 27 Javascript
判断“命令按钮”是否被鼠标单击详解
Jul 31 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
Sep 05 Javascript
微信小程序实现点击图片放大预览
Oct 21 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使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
javascript下过滤数组重复值的代码
2007/09/10 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
jquery.cookie实现的客户端购物车操作实例
2015/12/24 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
jQuery控制控件文本的长度的操作方法
2016/12/05 Javascript
jQuery层级选择器实例代码
2017/02/06 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
2018/08/30 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
python http基本验证方法
2018/12/26 Python
Python饼状图的绘制实例
2019/01/15 Python
详解python tkinter教程-事件绑定
2019/03/28 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
Python类super()及私有属性原理解析
2020/06/15 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
国培教师自我鉴定
2014/02/12 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
2014年爱国卫生工作总结
2014/11/22 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
零基础学java之循环语句的使用
2022/04/10 Java/Android