在 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广告代码
May 30 Javascript
JavaScript面象对象设计
Apr 28 Javascript
初学js 新节点的创建 删除 的步骤
Jul 04 Javascript
利用Keydown事件阻止用户输入实现代码
Mar 11 Javascript
JavaScript实现的GBK、UTF8字符串实际长度计算函数
Aug 27 Javascript
浅谈被jQuery抛弃的函数及替代函数
May 03 Javascript
关于Javascript回调函数的一个妙用
Aug 29 Javascript
javascript事件的绑定基础实例讲解(34)
Feb 14 Javascript
JS实现点击链接切换显示隐藏内容的方法
Oct 19 Javascript
微信小程序返回箭头跳转到指定页面实例解析
Oct 08 Javascript
Vue-Cli项目优化操作的实现
Oct 27 Javascript
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
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中读取文件的8种方法和代码实例
2014/08/05 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
利用php-cli和任务计划实现刷新token功能的方法
2017/05/03 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
jQuery实现平滑滚动的标签分栏切换效果
2015/08/28 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
python字典基本操作实例分析
2015/07/11 Python
python变量不能以数字打头详解
2016/07/06 Python
Django中的Model操作表的实现
2018/07/24 Python
python各类经纬度转换的实例代码
2019/08/08 Python
python基于event实现线程间通信控制
2020/01/13 Python
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
飞利浦美国官网:Philips美国
2020/02/28 全球购物
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
写给女朋友的道歉信
2014/01/08 职场文书
护士个人自我鉴定
2014/03/24 职场文书
销售内勤岗位职责
2014/04/15 职场文书
大学课外活动总结
2014/07/09 职场文书
公司人事专员岗位职责
2014/08/11 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL