在 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 相关文章推荐
用ADODB.Stream转换
Jan 22 Javascript
jQuery判断元素是否是隐藏的代码
Apr 24 Javascript
JS保留两位小数 四舍五入函数的小例子
Nov 20 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
Dec 14 Javascript
avalonjs制作响应式瀑布流特效
May 06 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
Jun 07 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
Sep 17 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
Oct 25 Javascript
JavaScript中清空数组的方法总结
Dec 02 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
Apr 11 Javascript
express + jwt + postMan验证实现持久化登录
Jun 05 Javascript
JavaScript如何优化逻辑判断代码详解
Jun 08 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初学者头疼问题总结
2006/10/09 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
laravel自定义分页效果
2017/07/23 PHP
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
jquery $.ajax入门应用一
2008/11/19 Javascript
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
深入理解JavaScript中的浮点数
2016/05/18 Javascript
BootStrap中
2016/12/10 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
Python闭包函数定义与用法分析
2018/07/20 Python
python每天定时运行某程序代码
2019/08/16 Python
python 监测内存和cpu的使用率实例
2019/11/28 Python
Python如何输出整数
2020/06/07 Python
pandas 数据类型转换的实现
2020/12/29 Python
印度在线杂货店:bigbasket
2018/08/23 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
日语系毕业生推荐信
2013/11/11 职场文书
高三历史教学反思
2014/01/09 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
教师师德考核自我评价
2014/09/13 职场文书
边城读书笔记
2015/06/29 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
Python办公自动化解决world文件批量转换
2021/09/15 Python
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技