要点
给”已经会 Node、想评估或上手 Deno”的人一张路线图。写法刻意偏迁移者视角:Deno 跑的是同一门 JavaScript/TypeScript,难点从来不在语法,而在”工具链换了一整套、进程能力默认上锁”这两个心智转换。基线是 Deno 2.5.x(2025-09-10 发布的 LTS 线);运行时的定位、与 Node/Bun 的三方对比已在开山篇(Deno 2 入门)讲清,本篇不重复选型论证,直接解决”怎么学、按什么顺序、每步做出什么”。时长按每天 1-2 小时业余学习口径。
这张路线适合谁
前置说死:会 JavaScript 基础语法、在 Node 里装过包、跑起过一个 HTTP 服务,就够了。语言层面 Deno 没有私有扩展,JS 基础直接复用;如果 Node 环境与模块机制还没摸过,先读站内Node.js 环境搭建与工具链和Node.js 模块与 ESM再回来——Deno 的 import 写法与 Node 的 ESM 完全一致,那边学的不白费。
总览
| 阶段 | 目标 | 阶段产出 | 预估时长 |
|---|---|---|---|
| 0. 安装与心智转换 | 把”单文件直接跑 TS”变成肌肉记忆 | REPL 与第一个无依赖脚本跑通 | 1 天 |
| 1. 权限模型 | 会授权、会看 NotCapable、会把权限写进配置 | 一个按最小权限跑通的读写+联网脚本 | 2-3 天 |
| 2. 工具链与测试 | fmt/lint/test/task 形成日常闭环 | 带测试的小模块与一条 task ci 命令 | 1 周 |
| 3. 依赖与工程化 | 玩转 npm:/node:/jsr: 与双配置文件共存 | 接入 npm 包重写一个旧小工具 | 1 周 |
| 4. 实战项目 | 把权限、cron、部署串成完整交付 | 一个上线的定时抓取任务 | 1 周 |
| 5. 进阶分流 | 按用途选方向做深 | Web 服务 / CLI / 数据三选一的小成品 | 2-4 周 |
阶段 0:安装与心智转换(1 天)
学什么:安装(命令不钉版本,升级走 deno upgrade)、deno –version、REPL 里直接写 TS、单文件脚本的”没有 package.json 也能跑”。核心转换只有一句:Deno 里 TS 是源码不是产物,ts-node、tsconfig、构建脚本这一层整个消失。
资源:开山篇Deno 2 入门的安装与上手节;官方 docs.deno.com 的入门示例。
产出与验收:REPL 里跑通一行泛型或枚举的 TS;写一个 20 行内、不联网不读文件的脚本用 deno run 跑起来。
常见卡点:找不到 npm init 的对应物——deno.json 是可选的,单文件起步什么都不用建,阶段 2 再回来写它。
阶段 1:权限模型(2-3 天)
学什么:–allow-read/write/net/env/run 的作用域写法、-A 与它的代价、Deno.errors.NotCapable、Deno.permissions 运行时协商、deno.json 的 permission sets(2.5 起)。这是 Deno 唯一”Node 里没有对应物”的大块知识,值得慢学。
资源:系列篇Deno 权限模型详解(标志速查表 + 反模式清单就是本阶段的练习题)。
产出与验收:写一个”读本地配置、调一个公开 API、把结果写进文件”的脚本——先裸跑触发 NotCapable 读懂报错,再把最小权限集写进 deno.json 任务;最后故意读一个未授权的环境变量,确认它真的抛错。
常见卡点:测试跑不起来——测试进程的权限与 run 独立,deno test 也要授权(2.5 起可用 -P 引用集合)。
阶段 2:工具链与测试(1 周)
学什么:deno fmt/lint/test/task 四件套、Deno.test 与 @std/assert、2.5 新增的 beforeAll/beforeEach 生命周期钩子、deno.json 的 tasks/imports/fmt/lint 键。目标不是”知道有这些命令”,而是把它们焊进日常:写完即 fmt,提交前 task ci。
资源:系列篇Deno 开发参考字典的 CLI 组与配置键组。
{
"tasks": {
"ci": "deno fmt --check && deno lint && deno test -P"
}
}
产出与验收:给一个手写的小模块(比如一个参数解析函数)配齐用例,deno task ci 一条命令串起 fmt –check、lint、test 三步全绿。
常见卡点:从 Prettier 项目复制来的代码被 fmt 大改——风格差异是真实的,全仓统一执行一次、之后别混用两套格式化器。
阶段 3:依赖与工程化(1 周)
学什么:npm:/node:/jsr: 三种前缀、deno add 与 deno install 的分野、有 package.json 时的登记规则(写它而不是 imports)、lockfile 与 CI 里的 –frozen。这一阶段结束时,”Deno 能不能用 npm 生态”对你不再是传闻,而是亲手验证过的边界。
产出与验收:挑一个你在 Node 里用过的小库(日期处理、命令行参数解析这类),用 deno add 接进一个脚本重写旧工具;再把同一脚本放进一个已有 package.json 的项目跑一遍,确认依赖登记位置符合预期。
常见卡点:个别 npm 包跑不动——原生扩展(node-gyp 一类)与依赖 Node 内部 API 的包是已知短板,动手前查官方兼容性文档,别拿核心业务当试验田。
阶段 4:实战项目(1 周)
学什么:把前三个阶段的能力串成一次完整交付——权限收口、抓取重试、SQLite 幂等落库、crontab 与 Deploy 两种部署形态。
资源:系列篇用 Deno 写一个定时抓取脚本,跟着做完并自己改造:换数据源、换通知渠道。
产出与验收:一台机器上真实跑起来的定时任务,带审计日志,故意断网能按退避重试,重复执行不产生脏数据。
阶段 5:进阶分流(2-4 周)
按用途选一个方向做透,不要三个都要:
Web 服务方向:Deno.serve 起步,框架看 Hono(jsr 生态、轻量贴标准);路由、中间件、错误处理的骨架与 Node 侧同构,站内Node.js HTTP 与路由和Fastify 入门讲的概念直接平移。产出:一个带健康检查与两个业务路由的 JSON API。CLI 方向:文件处理加 deno compile 单文件分发,重点吃透权限与产物的关系。数据方向:Deno.KV 的键值语义或 PG 客户端,做出一个带持久层的小服务。
Node 习惯到 Deno 的对照表
| 你在 Node 的习惯 | Deno 的对应 | 差异要点 |
|---|---|---|
| node server.js | deno run server.ts | TS 直接跑;权限要显式授 |
| npm i pkg | deno add npm:pkg | 登记进 deno.json 或 package.json |
| npm install | deno install | 按配置装齐;带 -g 才是全局装工具 |
| npm run dev | deno task dev | 任务里权限不会自动继承 |
| npx vite dev | deno run -A npm:vite dev | 一次性用包;-A 只给一次性工具 |
| tsc –noEmit | 内置类型检查(deno check) | 零配置,无需 tsconfig |
| jest / vitest | deno test + @std/assert | 测试权限独立配置 |
| eslint + prettier | deno lint + deno fmt | 内置;风格与 Prettier 不完全一致 |
| process.env.X | Deno.env.get(“X”) | 受 –allow-env 管辖 |
| __dirname | import.meta.dirname | 纯 ESM 世界,没有 require |
| require(“fs”) | import from “node:fs” | node: 前缀必写;或用 Deno 原生 API |
| http.createServer | Deno.serve | 默认端口 8000;请求响应即 Web 标准 |
避坑清单
不要把 -A 写进肌肉记忆。省下的是几秒钟敲标志,关掉的是 Deno 唯一的差异化能力;养成”先最小权限、报错再补”的习惯,权限声明才会变成你的能力清单而不是负担。
不要拿存量大型 Node 项目做迁移实验。Deno 2 的兼容换来的是”能跑”,全面迁移的回归验证成本远大于权限模型与内置工具链的收益——开山篇的结论在这里依然成立。想试,从边缘脚本和内部小工具开始。
不要用 CommonJS 思维写 Deno。借助 Node 兼容层确实能让 require 跑起来,但你失去的是 ESM 静态分析带来的类型检查与 tree-shaking 全部收益;新代码一律 import。
不要忽略 lockfile。依赖解析不锁版本,半年后 CI 悄悄拉到新版本,构建漂移会以最不巧的时间出现;deno.json 保留 lock,CI 里配 –frozen。
不要默认 Deno.cron 在进程退出后还会触发。它是长驻进程的进程内调度,脚本跑完即停的形态下”看似部署了定时、实际什么都没跑”——自托管交给 crontab,见实战篇的方案对比。
学完之后
本系列四篇按序读完,配合阶段产出动手,路线就走完了:开山篇Deno 2 入门定坐标,权限模型详解立心智,开发参考字典当日用速查,定时抓取脚本实战做闭环。之后的方向题——”Deno 值不值得进生产、和 Bun 怎么比”——建议回到开山篇的选型表自己作答:它已经是一个能干活的运行时,收益要用”它多给了我什么”来算。
版本核实(以官方文档为准):基线 Deno 2.5.x(2025-09-10 发布,LTS 线);deno.json permission sets 与 Deno.test 生命周期钩子为 2.5 新增;Deno.cron 截至 2.5 为实验 API;TS 直接运行为 Deno 长期特性(内置 TypeScript 5.9.2);node:sqlite 兼容自 2.2;原生扩展(node-gyp 类)兼容短板为官方文档明确说明的现状。外部资源仅推荐 docs.deno.com 官方文档与 deno.com 官方博客,安装命令不钉版本号。