跳到主要内容
Deno 2.4 已发布,带来 deno bundle、bytes/text 导入、稳定的 OTel 等更多功能
了解更多
Deno is now a package manager with new subcommands add, remove, install, and more.

介绍您的新 JavaScript 包管理器:Deno

Deno 2 中,我们引入了几个子命令来简化依赖管理:deno adddeno removedeno install。这些命令对 Node 用户来说会很熟悉,但提供了更大的灵活性,允许您无缝导入 npm 和 JSR 包——甚至在 Node 项目中也可以。

在这篇文章中,我们将介绍如何使用 Deno 的工具管理包,无论您是使用 npm、JSR,还是包含 package.json 的项目。我们还将探讨其性能与其他包管理器相比如何。

🚨️ Deno 2 已发布。 🚨️

凭借与 Node/npm 的向后兼容性内置包管理一体化零配置工具链,以及原生 TypeScriptWeb API 支持,编写 JavaScript 从未如此简单。

新子命令

deno add

使用 deno add 直接将依赖项添加到您的 deno.jsonpackage.json 文件中

deno add jsr:@std/path npm:chalk

如果不存在任何配置文件,Deno 将创建一个包含导入映射的 deno.json

{
  "imports": {
    "@std/path": "jsr:@std/path@^1.0.8",
    "chalk": "npm:chalk@^5.3.0"
  }
}

在包含 package.json 的项目中,npm 模块将添加到该文件中。上述命令会将 "chalk": "^5.3.0" 添加到 package.json,而 deno.json 则保留 JSR 依赖项。

deno remove

deno removedeno.jsonpackage.json 中删除依赖项。deno uninstall 是此命令的别名。以下是一个示例

deno remove jsr:@std/path npm:chalk

要删除全局安装的二进制文件,您可以使用 --global

deno remove --global file-server
# ➜ deleted /Users/deno/.deno/bin/file-server

deno install

npm install 类似,deno install 会安装 deno.jsonpackage.json 中列出的所有依赖项。如果存在 package.json,npm 依赖项将安装在 node_modules 中。否则,Deno 会将包安装到全局缓存中。

deno install
注意:Deno 使用硬链接(类似于 pnpm)来优化空间和速度。请参阅性能部分以了解基准测试结果。

缓存依赖项

对于包含 jsr:npm:http: 和/或 https: 依赖项的项目,您可以使用 --entrypoint 标志预缓存这些依赖项

deno install --entrypoint main.ts

这对于生产部署特别有用,例如构建 Docker 容器时,以最大限度地减少冷启动时间

安装后脚本

与 npm 不同,Deno 不会自动运行安装后脚本。在 npm 中,这些脚本可以执行来自第三方包的不可信代码——这会带来重大的安全风险,因为它允许任意代码以完全访问系统的方式运行。Deno 的方法通过要求您明确允许脚本来避免这种情况。

要允许特定包运行其安装后脚本,请使用 --allow-scripts 标志

deno install --allow-scripts=npm:sqlite3

此命令允许 npm:sqlite3 运行其安装后脚本,同时阻止其他脚本。这种设置让您可以更好地控制哪些脚本(如果有)可以执行,保护您的系统免受潜在有害或不受信任的代码的侵害。

了解更多关于 Deno 如何通过其可选权限系统实现默认安全

使用 Node 和 npm 进行包管理

由于 Deno 识别 package.json,这些子命令在 Node 项目中会像您期望的那样工作。例如

/tmp# deno -A npm:create-vite
✔ Project name: … vite-project
✔ Select a framework: › Vanilla
✔ Select a variant: › TypeScript

Scaffolding project in /private/tmp/vite-project...

Done. Now run:

  cd vite-project
  deno install
  deno run dev

/tmp# cd vite-project/
/tmp/vite-project# deno install

这种兼容性意味着您可以将 Deno 与 Node 和 npm 中的各种 JavaScript 框架一起使用。了解更多关于使用 Vite 构建 React 应用使用 create-next-app 构建 Next.js 应用构建 Astro 应用以及更多

性能

Deno 使用带硬链接的全局缓存,类似于 pnpm,以提高速度并减少跨项目的存储使用。硬链接(在 Linux 上)和 clonefile(在 macOS 上)指向磁盘上与原始文件相同的位置,从而避免冗余复制,同时显示在多个位置。这意味着如果依赖项 foo 占用 1MB 空间,它将在 node_modules 和全局存储中都显示为 1MB,但实际上这 1MB 只存储一次。这种设计最大限度地减少了磁盘使用量并加快了安装速度,尤其是在 monorepos 或具有共享依赖项的项目中。

以下是缓存和非缓存设置下安装速度的比较

Benchmark of package installation times across various package managers

有关此基准测试的更多详细信息,请参阅此 GitHub 仓库

下一步

这些新的子命令使 Deno 和 Node 项目中的依赖管理更快、更熟悉、更通用。请留意更多附加功能,包括deno updatedeno outdated,它们将在下一个版本中发布。

$ deno outdated
---------------------------------------------
Package       |  Current |   Update |  Latest
---------------------------------------------
jsr:@std/http |   ^1.0.0 |    1.0.7 |   1.0.7 
npm:react     |   17.0.2 |   17.0.2 |  18.3.1
npm:vite      |    4.5.5 |    4.5.5 |   5.4.8

$ deno outdated react
---------------------------------------------
Package       |  Current |   Update |  Latest
--------------------------------------------- 
npm:react     |   17.0.2 |   17.0.2 |  18.3.1

🚨️ 想了解更多 Deno 吗? 🚨️

查看我们新的Deno 学习教程系列,您将在其中学习

……以及更多,以简短、易懂的视频形式呈现。每周二和周四发布新教程。