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