👉 Deno 统一了 Node 和 npm,既是 JS 运行时,又是包管理器

1,129 阅读4分钟

00-deno.png

作者:Deno 团队

译者:林语冰

资源:Deno 官方博客[1]

免责声明:活人翻译,略有删改,仅供粉丝参考!

00. 前言

Node 之父领导的 Deno 团队官宣,Deno 现在不仅是 Node 运行时的替代品,还可以作为 npm 包管理器 的替代品。👍

01-pkg.png

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.jsonpackage.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 removedeno.jsonpackage.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.jsonpackage.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 或具有共享依赖的项目中。

👇 以下是缓存和非缓存设置中的安装速度跑分:

02-cache.png

04. 未来规划

这些新型子命令使 Deno 和 Node 项目的依赖管理更快且用途广泛。

下个版本还有其他功能,包括 deno updatedeno 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