隆重推出你的全新 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 容器 时,以最大限度地减少冷启动时间。
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 或具有共享依赖项的项目中。
以下是在缓存和非缓存设置中安装速度的比较
下一步是什么
这些新的子命令使在 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 教程系列,你将在其中学习
……以及更多内容,以简短、精悍的视频形式呈现。每周二和周四发布新的教程。