库 / SDK
denoland/deno avatar
denoland/deno

Deno 2.9:用 Rust 重写的 JavaScript 运行时,默认安全与原生 TypeScript 支持

JavaScript 和 TypeScript 的现代运行时。

108,423 个 Star6,371 个 ForkRustMIT

秒懂

它是什么?
Deno 是一个基于 V8、Rust 和 Tokio 的 JavaScript、TypeScript 与 WebAssembly 运行时,主打安全默认和开箱即用的 TypeScript 体验。本文从架构、安装、使用、限制与替代方案等角度评估其适用性。
适合谁用?
Deno 适合追求安全默认、原生 TypeScript 和零配置开发体验的团队,尤其是新项目或边缘函数场景。不适合需要大量现有 npm 生态兼容的老项目,因为其模块解析和权限模型与 Node.js 有根本差异。
能商用吗?
可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 1 天前。
用什么语言写的?
主要是 Rust(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。

开源项目深度解析

一个带着安全执念的运行时

Deno 解决的问题很具体:Node.js 默认给予脚本完全的系统访问权限,任何一行代码都能读写文件、发起网络请求。Deno 从设计上扭转了这一点,脚本必须显式声明需要的权限,比如 --allow-net 才能联网。这种安全默认来自其底层架构,它用 Rust 和 Tokio 构建,V8 负责执行 JavaScript,权限检查则发生在运行时边界。目标用户很清晰:写 Web 服务的前端和后端工程师,特别是那些受够了 Node.js 配置地狱、希望 TypeScript 直接运行而不用先编译的人。

权限模型与 TypeScript 原生执行的机制

Deno 的权限系统不是简单的开关,而是细粒度的标志,比如 --allow-net 可以指定域名,--allow-read 可以限定目录。这种设计让最小权限原则得以落地。TypeScript 支持是内置的,Deno 直接使用 V8 的编译器转换 TS 语法,不需要单独的 tsc 步骤。模块解析默认走 URL 导入,可以是 https:// 或 JSR 包,这与 Node.js 的 node_modules 有本质区别。运行时还集成了 WebAssembly 支持,理论上可以直接加载 .wasm 模块。这些机制都写在 README 中,但实际执行细节需要查阅官方文档。

安装与第一个服务器:命令即文档

安装 Deno 有多种途径。macOS 和 Linux 用 curl -fsSL https://deno.land/install.sh | sh,Windows 用 PowerShell 的 irm https://deno.land/install.ps1 | iex。此外还有 Homebrew、Chocolatey、WinGet 和 Scoop 等包管理器。安装后写一个 server.ts,内容为 Deno.serve((_req: Request) => { return new Response("Hello, world!"); }),然后运行 deno run --allow-net server.ts,就能在 localhost:8000 看到响应。这个例子展示了 Deno.serve 作为内置 HTTP 服务器的能力,不需要额外框架。注意 --allow-net 是必须的,否则网络请求会被拒绝。

生态与依赖管理:JSR 与标准库的取舍

Deno 官方推荐使用 JSR 作为包注册中心,同时也兼容 npm 包。但 JSR 的生态远小于 npm,这是实际限制。标准库(Deno Standard Library)由官方维护,覆盖文件操作、HTTP 客户端等常见需求,但相比 Node.js 的 npm 生态,可用的第三方库数量差距明显。如果你依赖某个只在 npm 上存在的包,Deno 可以导入,但原生模块或依赖 Node.js API 的包可能无法运行。这个兼容性问题在 README 中没有详细说明,但基于其模块解析机制可以推断。

一个明显的失败模式:权限与部署的摩擦

Deno 的安全模型在开发时是优点,在部署时可能变成负担。你的脚本需要列出所有访问的外部资源,一旦遗漏,运行时就会拒绝执行。在微服务架构中,依赖的域名列表会很长,维护这些标志容易出错。另一个限制是 Deno.serve 的并发模型依赖 Tokio,虽然性能不错,但如果你习惯 Node.js 的 cluster 模块或 PM2 的进程管理,迁移时需要重新设计。文档没有提供这些场景的详细对比,但基于其单进程设计可以判断。

替代方案:Node.js 与 Bun 的差异

最直接的替代是 Node.js,它与 Deno 的差异在于安全模型和模块系统。Node.js 默认无权限限制,但拥有庞大的 npm 生态和成熟的工具链,比如 Express、Webpack。另一个替代是 Bun,它同样主打速度和内置 TypeScript 支持,但 Bun 更强调兼容 Node.js API,而 Deno 更强调安全。Bun 的包管理使用 bun install,与 npm 兼容,而 Deno 的 JSR 是全新生态。选择哪个取决于你对现有依赖的依赖程度,以及是否愿意接受权限标志带来的额外配置。

维护成本与许可证

Deno 的发布节奏较快,最近一个月内就有 v2.9.4、v2.9.5、v2.9.6 三个版本,说明项目活跃。升级成本取决于你使用的 API,比如 Deno.serve 在 2.x 中保持稳定,但内部实现可能变化。许可证是 MIT,允许商用和修改,没有传染性条款,这对企业采用友好。但要注意,Deno 本身依赖 V8 和 Rust 生态,这些组件的许可证各不相同,不过通常不影响使用。文档没有提供具体的升级迁移指南,但社区和官方博客会发布变更日志。

编辑结论

Deno 适合追求安全默认、原生 TypeScript 和零配置开发体验的团队,尤其是新项目或边缘函数场景。不适合需要大量现有 npm 生态兼容的老项目,因为其模块解析和权限模型与 Node.js 有根本差异。采用前应验证:你的依赖是否能在 JSR 或 npm 上正常导入,以及 Deno.serve 的性能是否满足生产要求。最终判断:Deno 2.9 是一个设计激进但成熟度不断提升的运行时,若你愿意调整工作流,它能显著减少配置负担。

官方来源

  1. Official documentation
  2. Official README
  3. Project repository
  4. Release notes
社区笔记

社区笔记