跳至主要内容
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 容器 时,以最大限度地减少冷启动时间

Postinstall 脚本

与 npm 不同,Deno 不会自动运行 postinstall 脚本。在 npm 中,这些脚本可以执行来自第三方包的不受信任的代码——通过允许任意代码以完全访问你的系统权限运行,从而构成重大的安全风险。Deno 的方法通过要求你显式允许脚本来避免这种情况。

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

deno install --allow-scripts=npm:sqlite3

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

详细了解 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 只存储一次。这种设计最大限度地减少了磁盘使用量并加快了安装速度,尤其是在 monorepo 或具有共享依赖项的项目中。

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

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 教程系列,你将在其中学习

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