作者:
Deno 团队
译者:
林语冰
资源:Deno 官方博客[1]
免责声明:活人翻译,略有删改,仅供粉丝参考!
00. 前言
Node 之父领导的 Deno 团队官宣,Deno 现在不仅是 Node 运行时的替代品,还可以作为 npm 包管理器 的替代品。👍
Deno 2[2] 引入了 deno add
等若干子命令,来简化依赖管理。
这些命令对 Node 用户而言似曾相识,但提供了更大的灵活性,即使是在 Node 项目中,也允许你无缝导入 npm 和 JSR[3] 模块。
这篇 Deno 官方博客将科普如何使用 Deno 管理模块,无论你使用的是 npm、JSR 还是具有 package.json
的项目,还测评了 Deno 的性能与其他包管理器的跑分:
deno add
等命令速成- 和 Node 与 npm 集成
- 性能跑分
- 即将推出的新功能
01. Deno 全新子命令
1.1 deno add
deno add
可以直接将依赖添加到 deno.json
或 package.json
文件中:
deno add jsr:@std/path npm:vite
如果配置文件不存在,Deno 会创建一个带有导入映射的 deno.json
:
{
"imports": {
"vite": "npm:vite@^5.0",
"@std/path": "jsr:@std/path@^1.0.8"
}
}
如果项目中有 package.json
,npm 模块会被添加进去。
上述命令会将 “vite”: “^5.0”
添加到 package.json
中,而 deno.json
则保留 JSR 的依赖。
1.2 deno remove
deno remove
从 deno.json
和 package.json
中删除依赖,deno uninstall
是它的别名。
举个栗子:
deno remove npm:vite
要删除全局安装的二进制文件,可以使用 --global
:
deno remove --global vite
# 删除根目录下的
# /Users/deno/.deno/bin/vite
1.3 deno install
与 npm install
一样,deno install
会安装 deno.json
或 package.json
中列举的所有依赖。
如果 package.json
存在,那么 npm 依赖会安装在 node_modules
中。否则,Deno 会把模块安装到全局缓存。
deno install
⛔ 请注意,Deno 使用了类似 pnpm 的硬链接来优化空间和速度。
1.4 依赖缓存
对于项目中的 jsr:
、npm:
、http:
和/或 https:
等依赖,你可以使用 --entrypoint
flag 预先缓存这些依赖:
deno install --entrypoint main.ts
这在构建 Docker 容器等生产部署特别有用,可以最大限度减少冷启动时间。
1.5 postinstall
脚本
与 npm 不同,Deno 不会自动运行 postinstall
脚本。
在 npm 中,这些脚本可以执行来自第三方包不受信任的代码,从而允许任意代码以对系统的完全访问权限运行,这带来了重大的安全风险。
Deno 要求你明确允许脚本,从而规避这种隐患。
要允许特定模块运行其 postinstall
脚本,请使用 --allow-scripts
flag:
deno install --allow-scripts=npm:vite
此命令允许 npm:vite
运行其 postinstall
脚本,同时阻止其他脚本。
此设置让你可以更好地控制脚本的执行,从而保护你的系统免受可能有害或不受信任的代码侵害。
02. 管理 Node 和 npm 的模块
Deno 可以识别 package.json
,因此这些子命令可以在 Node 项目中如期工作。
举个栗子,和 Vite 一起使用:
/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 的各种 JS 框架一起使用。
03. 性能
Deno 使用类似 pnpm
硬链接的全局缓存,提高速度并减少跨项目的存储占用。
Linux 的硬链接和 macOS 的 clonefile
指向磁盘上与原文件相同的位置,因此它们避免了冗余副本,同时出现在多个地方。
这意味着,如果 vite
依赖占用 1MB 的空间,它在 node_modules
和全局存储中都会显示为 1MB,但实际上这 1MB 只存储了一次。
这种设计最大限度减少磁盘占用并加快安装速度,尤其是在 monorepo 或具有共享依赖的项目中。
👇 以下是缓存和非缓存设置中的安装速度跑分:
04. 未来规划
这些新型子命令使 Deno 和 Node 项目的依赖管理更快且用途广泛。
下个版本还有其他功能,包括 deno update
和 deno outdated
。
$ deno outdated
---------------------------------------------
Package | Current | Update | Latest
---------------------------------------------
npm:vite | 4.5.5 | 4.5.5 | 5.4.8
$ deno outdated react
---------------------------------------------
Package | Current | Update | Latest
---------------------------------------------
npm:vite | 4.5.5 | 4.5.5 | 5.4.8
粉丝互动 😍
👉 本期的话题是:如何评价 Deno 统一了 Node 和 npm,你最喜欢或想要哪个新命令?
欢迎你在本文下方留言互动,或者友情转发。👻
我是大家的林语冰 👨💻,欢迎持续关注我,随时了解前端社区的最新资讯。
谢谢大家的点赞和转发,我们下期再见,掰掰~ 👍
参考文献
[1] Deno 官方博客: deno.com/blog/your-n…
[2] Deno 2: deno.com/blog/v2.0
[3] JSR: jsr.io