📌 项目地址denoland/deno | ⭐ 108,018 颗星 | 🔧 Rust | 📜 未标注

核心价值:把”安全默认”从口号变成代码

Deno 是一个基于 V8、Rust 和 Tokio 构建的 JavaScript、TypeScript 与 WebAssembly 运行时。它的核心价值不是”更快”或”更小”,而是重新定义了运行时权限模型:默认不授予网络、文件系统、子进程等访问权。你必须在运行命令时显式声明程序需要用到的权限,否则代码只能做纯计算。这让依赖供应链攻击、恶意脚本滥用等问题的暴露面大幅缩小。

README 中给出的第一个示例就体现了这个设计:一个最简单的 HTTP 服务器,运行时必须加上 --allow-net,否则会被拒绝访问网络。这种”默认最小权限”的思路,比事后审计依赖树更直接。

快速上手:安装、运行、第一个服务器

安装方式覆盖主流系统。Linux/macOS 用 shell:

curl -fsSL https://deno.land/install.sh | sh

Windows 用 PowerShell:

irm https://deno.land/install.ps1 | iex

也可以用包管理器:macOS 的 Homebrew、Windows 的 Chocolatey/WinGet/Scoop 都支持,具体命名见 README 官方链接。

创建 server.ts

Deno.serve((_req: Request) => {
  return new Response("Hello, world!");
});

启动:

deno run --allow-net server.ts

访问 http://localhost:8000 即可看到 Hello, world!。注意那个 --allow-net 不是可有可无的——去掉它,Deno 会直接拒绝监听端口。这就是权限模型的最直观体验。

Deno 原生支持 TypeScript,不需要单独的编译步骤,.ts 文件直接运行。标准库和第三方包通过官方文档指引,包注册中心是 JSR(jsr.io),标准库在 jsr.io/@std,这些在 README 的 Additional resources 里都有明确入口。

与 Node.js 的实质差异

很多人把 Deno 看作 Node 的替代品,但更准确地说,它是同一生态位上的不同设计选择:

  • 权限模型:Node 默认拥有文件系统和网络权限,Deno 默认全部关闭,按需开启。
  • 模块解析:Deno 使用 URL 导入,支持 https:// 直接引用远程模块,不依赖 node_modules 和中心化的包管理器。README 里的示例直接用一个本地文件就能启动服务,没有任何依赖安装环节。
  • 原生 TypeScript:Node 需要额外配置 ts-node 或编译步骤,Deno 开箱即用。
  • 底层技术:V8 + Rust + Tokio,Tokio 是异步运行时,这决定了它的并发处理模型。Deno 的 Deno.serve API 是内建的高层 HTTP 服务接口,比 Node 的 http.createServer 更简洁。

如果你已经有 Node 项目,迁移不是零成本的,尤其是涉及 npm 包和 Node 专有 API 的代码。但如果你从零开始一个新服务,Deno 的默认安全约束和 TS 支持可能省掉不少配置工作。

需要注意的事项

  • 权限是双刃剑--allow-net 实际是白名单机制。生产环境需要仔细设计权限粒度,而不是直接给 --allow-all,否则安全模型形同虚设。
  • 生态仍在演进:Deno 兼容部分 Node API,但不是全部。大量 npm 包可以通过 npm: 前缀导入,但原生模块或依赖 Node 内置特性的包可能不工作。可以用,但要有替换心理准备。
  • 许可与治理:Deno 由 denoland 维护,MIT 许可。它背后有商业公司 Deno 提供 Deploy 等云服务,但运行时本身是开源的。如果你想深度参与,README 提供了贡献指南,要求阅读 .github/CONTRIBUTING.md 中的构建指令。
  • 版本稳定性:Deno 的 API 仍在快速演进,升级主版本时关注变更日志,尤其是 Deno.serve 这类高层 API 的行为变化。

如果你要快速启动一个小型 HTTP 服务,或者想体验”默认安全 + 原生 TS”的开发流,Deno 值得一试。运行 deno run --allow-net server.ts 这一条命令,你就已经接触到它和其他运行时最大的不同。

这篇文章对你有帮助吗?

发表回复