在 Node.js 中使用原生 ES 模块方法解析

所属分类: 网络编程 / JavaScript 阅读数: 657
收藏 0 赞 0 分享

从版本 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 模块方法解析的全部内容,希望对大家有所帮助。如果您有什么问题,可以给我留言。感谢大家对本站的支持。

更多精彩内容其他人还在看

BootStrap数据表格实例代码

本文通过实例代码给大家分享了BootStrap数据表格的相关知识,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

基于vue的短信验证码倒计时demo

这篇文章主要介绍了基于vue的短信验证码倒计时demo,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解React Native开源时间日期选择器组件(react-native-datetime)

本篇文章主要介绍了详解React Native开源时间日期选择器组件(react-native-datetime),具有一定的参考价值,有兴趣的可以了解一下
收藏 0 赞 0 分享

JS库particles.js创建超炫背景粒子插件(附源码下载)

particles.js用于创建粒子的轻量级 JavaScript 库。使用方法非常简单,代码也很容易实现,下面通过本文给大家分享JS库particles.js创建超炫背景粒子插件附源码下载,需要的朋友参考下吧
收藏 0 赞 0 分享

JS库之Waypoints的用法详解

waypoints的功能非常强大,一款用于捕获各种滚动事件的插件,下面跟随脚本之家小编一起学习JS库之Waypoints的用法吧
收藏 0 赞 0 分享

强大的JavaScript响应式图表Chartist.js的使用

本篇文章主要介绍了强大的JavaScript响应式图表Chartist.js的使用,具有一定的参考价值,有兴趣的可以了解一下
收藏 0 赞 0 分享

详解wow.js中各种特效对应的类名

本篇文章主要介绍了wow.js中各种特效对应的类名 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

JS库之Highlight.js的用法详解

highlight.js是一款轻量级的Web代码语法高亮库。下面通过实例代码给大家分享JS库之Highlight.js的用法详解,感兴趣的朋友跟随脚本之家小编一起学习吧
收藏 0 赞 0 分享

详解动画插件wow.js的使用方法

本篇文章主要介绍了动画插件wow.js的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

JS库 Highlightjs 添加代码行号的实现代码

Highlightjs是一款优秀的代码高亮Js组件,可以很方便地对各种语言编写的代码添加语法高亮样式。本文重点给大家介绍Highlightjs 添加代码行号的实现代码,需要的朋友参考下吧
收藏 0 赞 0 分享
查看更多