在 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 调试器简介
Feb 21 Javascript
javascript 多种搜索引擎集成的页面实现代码
Jan 02 Javascript
javascript各浏览器中option元素的表现差异
Apr 07 Javascript
js动画(animate)简单引擎代码示例
Dec 04 Javascript
Javascript中string转date示例代码
Nov 01 Javascript
JavaScript去除数组里重复值的方法
Jul 13 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
Sep 05 Javascript
ReactNative Image组件使用详解
Aug 07 Javascript
深入理解JavaScript的async/await
Aug 05 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
Oct 10 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
Aug 07 Javascript
vue下载二进制流图片操作
Oct 26 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+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
Yii扩展组件编写方法实例分析
2015/06/29 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
javascript动画对象支持加速、减速、缓入、缓出的实现代码
2012/09/30 Javascript
js图片向右一张张滚动效果实例代码
2013/11/23 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
python 的列表遍历删除实现代码
2020/04/12 Python
Python爬虫之xlml解析库(全面了解)
2017/08/08 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
实习生自我鉴定
2013/12/12 职场文书
自荐信的格式
2014/03/10 职场文书
交通事故调解协议书
2014/04/16 职场文书
商场开业庆典策划方案
2014/06/02 职场文书
关于运动会的口号
2014/06/07 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
个人融资协议书
2014/10/02 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
债务纠纷代理词
2015/05/25 职场文书
党员转正介绍人意见
2015/06/03 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP