问题描述
我正在尝试了解Node和ES模块。具体来说,如何/是否可以从import语句的路径字符串值中省略文件扩展名(并且可以选择使VSCode自动完成这些路径)。
我了解您可以给文件提供.mjs
扩展名,也可以在"type" = "modules"
中设置package.json
,但是两种方法都会导致以下问题。
- 如果文件扩展名为
.mjs
,VSCode不会自动完成路径,如果文件扩展名为.js
,则它只会看到文件。但是,如果它是.js
,则自动完成功能会忽略字符串中的扩展名,并且导入会失败,直到我手动添加它为止。 - 尝试在我自己的模块中使用类似
graphql
之类的库也失败了,因为graphql模块中.mjs
文件之间的所有import语句都被编写为省略了字符串的扩展名。
SO ...何时不包括对ES6模块导入有效的扩展,并且是否有通过NodeJS启用此条件的方法?
解决方法
node.js ES6模块的实现专门不执行https://nodejs.org/api/esm.html#esm_customizing_esm_specifier_resolution_algorithm中记录的自动文件扩展名解析:
当前的说明符分辨率不支持CommonJS加载程序的所有默认行为。行为差异之一是文件扩展名的自动解析以及导入具有索引文件的目录的能力。
但是,可以通过命令行参数--experimental-specifier-resolution=[mode]
因此,不提供文件扩展名默认为无效,但可以根据运行node.js的方式使其有效。
但是,在编写ES6规范之前,有一些系统可以实现类似ES6的import
语法,例如Typescript和Babel。这些系统假定您可以在导入中排除文件扩展名。如果您使用这样的系统将ES6 imports
编译为ES5语法,则有时可以排除文件扩展名,具体取决于您使用的编译器版本是否支持它。