介绍您的新 JavaScript 包管理器:Deno
在 Deno 2 中,我们引入了几个子命令来简化依赖管理:deno add
、deno remove
和 deno install
。这些命令对 Node 用户来说会很熟悉,但提供了更大的灵活性,允许您无缝导入 npm 和 JSR 包——甚至在 Node 项目中也可以。
在这篇文章中,我们将介绍如何使用 Deno 的工具管理包,无论您是使用 npm、JSR,还是包含 package.json
的项目。我们还将探讨其性能与其他包管理器相比如何。
🚨️ Deno 2 已发布。 🚨️
凭借与 Node/npm 的向后兼容性、内置包管理、一体化零配置工具链,以及原生 TypeScript 和Web API 支持,编写 JavaScript 从未如此简单。
新子命令
deno add
使用 deno add
直接将依赖项添加到您的 deno.json
或 package.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 remove
从 deno.json
和 package.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.json
或 package.json
中列出的所有依赖项。如果存在 package.json
,npm 依赖项将安装在 node_modules
中。否则,Deno 会将包安装到全局缓存中。
deno install
缓存依赖项
对于包含 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 或具有共享依赖项的项目中。
以下是缓存和非缓存设置下安装速度的比较
下一步
这些新的子命令使 Deno 和 Node 项目中的依赖管理更快、更熟悉、更通用。请留意更多附加功能,包括deno update
和 deno 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 学习教程系列,您将在其中学习
……以及更多,以简短、易懂的视频形式呈现。每周二和周四发布新教程。