Node.js 8中的模块导入 - 使用require还是import?

37

我想知道在 Node.js 8 中如何导入模块——我们还是要使用 require 吗?

或者说,我们是否仍需要使用 babel 来使用 import

我已经做了些调查,但似乎找不到答案。如果我们仍然需要使用 require,为什么 Node.js 还不能实现 import 呢?

1个回答

38

更新-2018.11.15 ↓

简短回答
我们仍然使用 require

详细解答
ESM loading已经部分实现在node 8.5.0 中,该版本于2017年9月发布。因此,它已经成为规范的一部分,作为实验性功能发布了一段时间:可以查看API文档这里。需要注意的是,需要使用--experimental-modules标志,并对模块使用新的.mjs扩展名。

在V8中仍然需要发生变化,ESM加载才能稳定并且具备完整功能, 因此与我原来的答案一样,如果您还没有在其他地方使用Babel, 我仍建议使用CommonJS的require

有关更详细的解释,请参见此文章


先前答案↓

两种实现方式在内部完全不同,因此问题比表面上看起来更复杂

要点是,规范仍存在一些问题/疑问(一直到V8),因此在Node中,import目前无法实现而不使用transpiler。

请参见贡献者之一的这条评论(日期为2017年2月):

当前阶段,ES6和虚拟机方面仍需要进行一些规范和实现问题的解决,才能使Node.js开始开发支持ES6模块的可支持实现。工作正在进行中,但是需要花费一些时间- 我们目前至少需要考虑一年左右。

请记住,转译器只是将ES6模块语法转换为CommonJS模块语法,因此目前没有性能上的优势。换句话说,如果您还没有Babel流程管道,那么仅仅为了使用新提出的 import 语法而创建一个流程管道并没有太多的激励,除非从积极的语法角度考虑。

有关实现差异的更多详细信息,请参见 此文


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接