在 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 相关文章推荐
根据分辩率调用不同的CSS.
Jan 08 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
Oct 14 Javascript
js对象的构造和继承实现代码
Dec 05 Javascript
jQuery的DOM操作之删除节点示例
Jan 03 Javascript
javascript比较两个日期的先后示例代码
Dec 31 Javascript
jQuery实现可用于博客的动态滑动菜单
Mar 09 Javascript
基于JS实现省市联动效果代码分享
Jun 06 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
Aug 24 Javascript
Vue.js每天必学之计算属性computed与$watch
Sep 05 Javascript
详解angular2实现ng2-router 路由和嵌套路由
Mar 24 Javascript
浅谈Angular路由守卫
Aug 26 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
Sep 10 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
mcrypt启用 加密以及解密过程详细解析
2013/08/07 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
一个网马的tips实现分析
2010/11/28 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
JS实现的新浪微博大厅文字内容滚动效果代码
2015/11/05 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
Jquery根据浏览器窗口改变调整大小的方法
2017/02/07 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
Pycharm 2020.1 版配置优化的详细教程
2020/08/07 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
10张动图学会python循环与递归问题
2021/02/06 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
简单的HTML5初步入门教程
2015/09/29 HTML / CSS
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
科学发展观标语
2014/10/08 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
生活委员竞选稿
2015/11/21 职场文书
2016廉政教育学习心得体会
2016/01/25 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
python办公自动化之excel的操作
2021/05/23 Python
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript