当前位置: 移动技术网 > IT编程>开发语言>JavaScript > 在 Node.js 中使用原生 ES 模块方法解析

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

2017年12月12日  | 移动技术网IT编程  | 我要评论

从版本 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 模块:

·不能动态导入模块。但是 动态的相关工作正在进行中,应该很快就能提供支持。

·没有元变量,如 __dirname 和 __filename。但是,有一个的类似功能的提案:“”。看起来可能是这样:

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 的 。

提示:如果不启用任何可解锁的额外功能,将在 node.js 保持 100% 兼容原生 es 模块.

faq

什么时候可以不带命令行选项使用es 模块?

目前的计划是在 node.js 10 lts 中默认可使用 es 模块。

进一步阅读

有关 node.js 和浏览器中 es 模块的更多信息:

 · “” [using es modules natively vs. transpiling them via babel]

 · “?” [why .mjs? how are module specifiers resolved? etc.]

 · “” [in-depth chapter on es modules in “exploring es6”]

即将到来的 ecmascript 提案:

 · 博客: “es proposal: import() – dynamically importing es modules”

 · 提案: “”

总结

以上就是小编给大家带来的在 node.js 中使用原生 es 模块方法解析的全部内容,希望对大家有所帮助。如果您有什么问题,可以给我留言。感谢大家对本站的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网