我想知道在 Node.js 8 中如何导入模块——我们还是要使用 require
吗?
或者说,我们是否仍需要使用 babel 来使用 import
?
我已经做了些调查,但似乎找不到答案。如果我们仍然需要使用 require,为什么 Node.js 还不能实现 import
呢?
简短回答
我们仍然使用 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
语法而创建一个流程管道并没有太多的激励,除非从积极的语法角度考虑。
有关实现差异的更多详细信息,请参见 此文