跳到主要内容

导入映射

为了让 Deno 能够解析像 "react""lodash" 这样的 裸规范,它需要知道在哪里查找它。"lodash" 是指一个 npm 模块,还是映射到一个 https URL?

import lodash from "lodash";

Node 和 npm 使用 package.jsonnode_modules 文件夹来进行这个解析。另一方面,Deno 使用 导入映射 标准。

要使上面的 import lodash from "lodash" 工作,将以下内容添加到 deno.json 配置文件

{
"imports": {
"lodash": "https://esm.sh/lodash@4.17.21"
}
}

deno.json 文件会自动发现并起到(除其他功能外)导入映射的作用。 在这里了解更多关于 deno.json 的信息

这也适用于 npm 规范。与上面的方法不同,我们也可以在 deno.json 配置文件中编写类似的内容:

{
"imports": {
"lodash": "npm:lodash@^4.17"
}
}

示例 - 通过 fmt/ 使用 deno_std 的 fmt 模块

deno.json
{
"imports": {
"fmt/": "https://deno.land/std@0.208.0/fmt/"
}
}
color.ts
import { red } from "fmt/colors.ts";

console.log(red("hello world"));

示例 - 使用项目根目录进行绝对导入

要在项目根目录中进行绝对导入:

deno.json
{
"imports": {
"/": "./",
"./": "./"
}
}

这将导致以 / 开头的导入规范相对于 导入映射的 URL 或文件路径进行解析。

覆盖导入

导入映射非常有用的另一种情况是在特定模块中覆盖导入。

假设您希望将 deno_std 从 0.177.0 覆盖到所有导入的模块中的最新版本,但对于 https://deno.land/x/example/ 模块,您希望使用本地 patched 目录中的文件。您可以使用导入映射中的作用域来实现这样的效果,示例如下:

{
"imports": {
"https://deno.land/std@0.177.0/": "https://deno.land/std@0.208.0/"
},
"scopes": {
"https://deno.land/x/example/": {
"https://deno.land/std@0.177.0/": "./patched/"
}
}
}

导入映射适用于应用程序

值得注意的是,导入映射配置文件仅适用于 Deno 应用程序,而不适用于您的应用程序代码可能导入的各种库。这使您作为应用程序作者能够决定包含在您的项目中的库的版本。

如果您正在开发一个库,您应该更倾向于使用 管理依赖 中讨论的 deps.ts 模式。