在 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禁用右键单击功能屏蔽F5刷新
Mar 17 Javascript
用JavaScript实现页面重定向功能的教程
Jun 04 Javascript
谈谈PHP中相对路径的问题与绝对路径的使用
Aug 16 Javascript
jQuery实现获取元素索引值index的方法
Sep 18 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
Dec 24 Javascript
利用express启动一个server服务的方法
Sep 17 Javascript
简化vuex的状态管理方案的方法
Jun 02 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
Dec 10 Javascript
利用d3.js实现蜂巢图表带动画效果
Sep 03 Javascript
解决在layer.open中使用时间控件laydate失败的问题
Sep 11 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
Apr 11 Javascript
前端开发基础javaScript的六大作用
Aug 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读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
详解js闭包
2014/09/02 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
javascript执行环境及作用域详解
2016/05/05 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
Vue.js 和 MVVM 的注意事项
2016/11/07 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
详解JavaScript中的六种错误类型
2017/09/21 Javascript
Vue Router的懒加载路径的解决方法
2018/06/21 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
使用python 获取进程pid号的方法
2014/03/10 Python
python3 webp转gif格式的实现示例
2019/12/10 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
Keras 快速解决OOM超内存的问题
2020/06/11 Python
python 实现两个npy档案合并
2020/07/01 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
敬老院院长事迹材料
2014/05/21 职场文书
环境卫生倡议书
2014/08/29 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
金榜题名主持词
2015/07/02 职场文书
“5.12”护士节主持词
2015/07/04 职场文书
退伍军人感言
2015/08/01 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
使用goaccess分析nginx日志的详细方法
2021/07/09 Servers
纯CSS如何禁止用户复制网页的内容
2021/11/01 HTML / CSS