在 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 相关文章推荐
jQuery 淡出一个图像到另一个图像的实现代码
Jun 12 Javascript
动态加载jquery库的方法
Feb 12 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
Apr 17 Javascript
JQuery用户名校验的具体实现
Mar 18 Javascript
js实现将json数组显示前台table中
Jan 10 Javascript
Node.js使用Express创建Web项目详细教程
Mar 31 Javascript
angular中实现控制器之间传递参数的方式
Apr 24 Javascript
使用veloticy-ui生成文字动画效果
Feb 08 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
Nov 05 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
Apr 16 Javascript
详解async/await 异步应用的常用场景
May 13 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
Sep 06 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 加密解密内部算法
2010/04/22 PHP
php数组中删除元素的实现代码
2012/06/22 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
Laravel 5框架学习之表单验证
2015/04/08 PHP
phpMyAdmin安装并配置允许空密码登录
2015/07/04 PHP
php语言的7种基本的排序方法
2020/12/28 PHP
ie支持function.bind()方法实现代码
2012/12/27 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
微信小程序获取用户信息并保存登录状态详解
2019/05/10 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
python3 拼接字符串的7种方法
2018/09/12 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
2020/02/29 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
详解基于python的全局与局部序列比对的实现(DNA)
2020/10/07 Python
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
NICKIS.com荷兰:设计师儿童时装
2020/01/08 全球购物
解释i节点在文件系统中的作用
2013/11/26 面试题
保安自我鉴定范文
2013/12/08 职场文书
规划编制实施方案
2014/03/15 职场文书
学前班评语大全
2014/05/04 职场文书
小学生大队委竞选稿
2015/11/20 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
Python实现为PDF去除水印的示例代码
2022/04/03 Python
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android