Chapter 01

Deno 2 简介与核心理念

从 Node.js 的历史遗憾到 Deno 的诞生——一个更安全、更现代的 JavaScript 运行时

Node.js 的十个遗憾

2018 年柏林 JSConf EU,Ryan Dahl 站上讲台,发表了让整个 JavaScript 社区震惊的演讲:《我对 Node.js 感到遗憾的 10 件事》。作为 Node.js 的亲手创建者,他列举了自己认为当年犯下的设计错误:

演讲结尾,他宣布:"我正在开发 Deno。"

🦕

Deno 的名字:Deno 是 Node 的字母重新排列("De-no")。恐龙(Dino)是 Deno 的吉祥物,代表着"上个时代的 Node"。官方 logo 是一只可爱的恐龙,完整体现了这个致敬与超越的精神。

Deno 1.x → 2.0 重大变化

Deno 1.0 于 2020 年发布,虽然理念先进,但缺乏 npm 生态兼容性,被很多人认为"不实用"。2024 年发布的 Deno 2 彻底改变了这一局面:

特性Deno 1.xDeno 2.0
npm 包兼容实验性,不稳定完整支持,绝大多数 npm 包可用
node: 协议部分支持完整支持import fs from 'node:fs'
Workspace不支持支持,多包 monorepo 管理
package.json不支持支持读取,与 npm 项目互操作
JSR 包注册表官方支持,jsr: 前缀导入
标准库URL 直接导入@std/* 命名空间,稳定版本化
Deno KV实验性稳定,生产可用
V8 版本旧版持续跟进最新 V8
💡

Deno 2 的战略意义:通过完整的 npm 兼容性,Deno 2 终于能够使用 npm 生态的数百万个包,同时保持自己安全沙盒、原生 TypeScript 的核心优势。这是 Deno 从"理想主义实验品"到"生产级可选项"的关键跨越。

与 Node.js / Bun 三方对比

维度Node.js 22Bun 1.xDeno 2
JS 引擎V8JavaScriptCoreV8
原生 TypeScript实验性(--strip-types)内置(类型擦除)内置(类型擦除)
安全沙盒默认沙盒,需显式授权
Web API 兼容部分部分最完整(最接近浏览器)
npm 兼容完整完整完整(npm: 前缀)
内置工具链最少多(fmt/test/bundle)最完整(fmt/lint/test/doc/compile)
包注册表npmnpmJSR + npm
HTTP 性能~65k req/s~120k req/s~78k req/s
内置 KV 存储Deno KV(SQLite+云)
边缘部署平台无官方无官方Deno Deploy(官方)

安装 Deno

macOS / Linux

# 官方安装脚本
curl -fsSL https://deno.land/install.sh | sh

# macOS 用 Homebrew
brew install deno

# 验证安装
deno --version
# deno 2.x.x (stable, release, x86_64-apple-darwin)
# v8 12.x.xxx
# typescript 5.x.x

Windows

# PowerShell(推荐)
irm https://deno.land/install.ps1 | iex

# winget
winget install DenoLand.Deno

# Scoop
scoop install deno

版本管理

# 升级到最新版
deno upgrade

# 升级到指定版本
deno upgrade --version 2.0.0

# 查看版本
deno --version

第一个 Deno 程序

无需 npm init,无需 package.json,直接创建 TypeScript 文件运行:

// hello.ts
const name: string = "Deno 2";
console.log(`你好,${name}!`);

// 使用 Web API fetch(无需安装任何库)
const res = await fetch("https://api.github.com/repos/denoland/deno");
const data = await res.json();
console.log(`Deno GitHub stars: ${data.stargazers_count}`);
# 运行(需要 --allow-net 权限访问网络)
deno run --allow-net hello.ts

注意权限:如果你忘记加 --allow-net 直接运行,Deno 会拒绝网络请求并报错:PermissionDenied: Requires net access to "api.github.com"。这正是 Deno 安全模型的体现——默认什么都不能做。

REPL 交互模式

# 启动 REPL
deno

# REPL 中支持顶层 await、TypeScript、Tab 补全
Deno 2.x.x
exit using ctrl+d, or close()
> const x: number = 42;
> x * 2
84
> await fetch("https://example.com").then(r => r.status)
200

名词解释:Deno 核心概念

deno.json 配置文件快速上手

// deno.json — 项目根目录
{
  "name": "my-deno-app",
  "version": "1.0.0",
  "tasks": {
    "dev":   "deno run --allow-net --allow-read --watch main.ts",
    "start": "deno run --allow-net --allow-read main.ts",
    "test":  "deno test --allow-read"
  },
  "imports": {
    "@std/assert": "jsr:@std/assert@^1.0.0",
    "hono": "npm:hono@^4.0.0"
  },
  "compilerOptions": {
    "strict": true,
    "lib": ["deno.window"]
  }
}
# 运行任务(类似 npm run dev)
deno task dev

# 运行测试
deno task test

本章小结:Deno 2 是 Node.js 原作者 Ryan Dahl 对自己设计失误的修正。核心哲学三板斧:安全默认(沙盒权限系统)、Web 标准(最接近浏览器的 API)、TypeScript 原生(零配置运行 .ts 文件)。Deno 2 新增完整 npm 兼容、JSR 包注册表和 workspace 支持,终于具备了生产环境竞争力。