在 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模版引擎-tmpl的bug修复与性能优化分析
Oct 23 Javascript
js实现文章文字大小字号功能完整实例
Nov 01 Javascript
javascript实现按回车键切换焦点
Feb 09 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
Sep 04 Javascript
微信小程序 两种为对象属性赋值的方式详解
Feb 23 Javascript
基于angular实现三级联动的生日插件
May 12 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
Aug 03 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
Mar 17 Javascript
浅谈vue3中effect与computed的亲密关系
Oct 10 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
Oct 21 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
Oct 09 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+javascript实现二级级联菜单的制作
2008/05/06 PHP
php限制文件下载速度的代码
2015/10/20 PHP
golang 调用 php7详解及实例
2017/01/04 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
2020/01/23 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
js精美的幻灯片画集特效代码分享
2015/08/29 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
js字符串引用的两种方式(必看)
2016/09/18 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
Python字符串逆序输出的实例讲解
2019/02/16 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
详解如何修改python中字典的键和值
2020/09/29 Python
jupyter 添加不同内核的操作
2021/02/06 Python
纯HTML5+CSS3制作生日蛋糕代码
2016/11/16 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
英国网上花店:Bunches
2016/11/29 全球购物
食堂员工工作职责
2013/12/18 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
《石榴》教学反思
2014/03/02 职场文书
yy婚礼主持词
2014/03/14 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
相亲活动方案
2014/08/26 职场文书
党支部先进事迹材料
2014/12/24 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记