JavaScript 导入如何找到没有扩展的模块?



我知道我们可以使用import {x} from "./file"并且变量x将从同一目录中的file.js导入。如果目录中存在具有不同扩展名的同名文件,如何处理?

例如,如果同一目录中有file.jsfile.tsimport {x} from "./file"的行为将如何?它会取决于 JavaScript 的版本吗?

这取决于javascript的版本吗?

不,这取决于 JavaScript 运行时的行为,即执行脚本的东西。

在支持 ES 模块 (ESM) 的浏览器中,不会向您import的 URL 添加任何扩展名 - 例如,如果您的文件具有.js扩展名,则必须编写import {x} from "./file.js"。浏览器没有有用的方法来查找服务器上哪些扩展名可用的文件。

在没有原生支持 ESM 的浏览器中,您必须将模块转译为可以在浏览器中运行的捆绑格式。在这种情况下,这取决于您选择使用的特定捆绑器的行为(见下文)。

在支持 ESM 的 Node.js 版本中,运行时不会搜索扩展,但会按名称解析node_modules模块。例如import 'lodash'可以解析为./node_modules/lodash/index.mjs,而不需要知道index.mjs的扩展。

在不支持 ESM 的 Node.js 版本中,你不能使用import- 你必须先将模块转写为 CommonJS 格式,最终会使用require.require有一个扩展列表,它将在文件系统中搜索这些扩展。

例如,如果同一目录中有 file.js 和 file.ts,import {x} from "./file"的行为将如何?

这要看情况。

转译或编译脚本时,识别哪些扩展取决于编译器和为编译提供的设置。

例如,在 webpack 中,有预定义的支持扩展名列表 - '.wasm'、'.mjs'、'.js'、'.json',但可以通过在webpack.config.js文件中使用 resolve.extension 设置来更改它。

如果您将webpack与 ts-loader 插件一起使用,.ts文件扩展名也会被识别,但加载器会尝试将其编译.ts以便将文件编译成.js文件,并在捆绑时尝试使用该编译.js文件。

如果您使用普通打字稿编译器来编译脚本,编译器将查找扩展名为".ts"的文件来执行类型检查,但它将生成代码,当您运行脚本时,它将查找扩展名为".js"的文件。此外,如果编译了扩展名为".ts"的文件,编译器将在扩展名为".js"的文件中编写生成的代码,并且可能会覆盖您的 javascript 文件(如果有),具体取决于告诉它在哪里输出".js"文件的设置。

@PeterT描述对我有用。但我仍然喜欢解释更多。在开发中,webpack 设置了所有配置和捆绑,所以我们不需要做任何这样的事情。当我们自己学习打字稿模块并想尝试使用基本的打字稿编译器时,我们肯定需要这样做。

在打字稿文件中,导入包括导入部分中的.js扩展名,如下所示

从"X.js"导入 {x};//记住包括".js">

相关内容

  • 没有找到相关文章

最新更新