Deno 概述与快速上手
零基础第一课:理解 Deno 的安全模型与内置工具链,用两分钟运行第一个 TypeScript 脚本。
0. 两分钟运行第一个脚本(先读这里)
学习目标:安装 Deno 并运行一个 TypeScript 脚本,感受”无需配置文件”的开发体验。
# Windows(PowerShell)
irm https://deno.land/install.ps1 | iex
# 或通过包管理器
winget install DenoLand.Deno
// hello.ts
const name = Deno.args[0] ?? "世界"
console.log(`你好,${name}!`)
deno run hello.ts 小明
讲解:
Deno.args是命令行参数数组,?? "世界"在未传参时给默认值。- 不需要
package.json、不需要tsconfig.json、不需要先编译——deno run直接执行 TypeScript。 - 输出
你好,小明!,第一个 Deno 程序完成。 - 运行不带参数的
deno会进入交互式 REPL(读取-求值-打印循环),适合随手验证一行 API;deno repl是它的显式写法。
1. Deno 是什么
Deno 是 Node.js 创始人 Ryan Dahl 于 2020 年发布 1.0 的 JavaScript/TypeScript 运行时,由 Rust 编写,基于 V8 引擎与 Tokio 异步运行时。它的起源很有戏剧性:2018 年 Ryan 在 JSConf 演讲《我对 Node.js 感到后悔的十件事》中复盘了 Node 的历史包袱(安全模型缺失、模块系统混乱、package.json 泛滥),Deno 就是这份”后悔清单”的正面回应。
它的设计目标可以浓缩为四条:
- 默认安全:脚本不能随意读文件、访问网络,必须显式授权(详见权限模型与安全实践);
- 原生 TypeScript:编译器内置,不需要 ts-node、tsx、webpack 之类的胶水;
- 现代模块:直接用 URL 导入,或使用 JSR/npm 包;Deno 2 起兼容
package.json与node_modules,Node 项目迁移成本大幅降低; - 内置工具链:格式化、测试、基准、代码检查、打包、编译单文件可执行程序,全部一条命令。
把运行时类比成”机场安检”更容易理解 Node 与 Deno 的差异:Node 是”乘客(代码)落地即放行,想去哪去哪”;Deno 是”默认全部拦下,你要去登机口、去免税店,必须逐项出示通行证(权限参数)“。安检多花几秒,换来的是劫机(恶意依赖)几乎无从下手。
1.1 版本现状(2026-09)
- Deno 2.9 为当前稳定版(2026-06-25 发布,引入
deno desktop、CSS 模块导入、快照测试与参数化测试、Node.js 26 兼容)。 - 2.x 关键节点:2.0(2024-10)开启 npm 与
package.json兼容时代;2.4(2025-07)恢复deno bundle并稳定内置 OpenTelemetry;2.5(2025-09)支持在配置文件里管理权限集;2.6(2025-12)推出dx(跑包二进制的新入口,口号”dx is the new npx”)与deno audit供应链审计;2.7(2026-02)稳定 Temporal 日期 API、支持 Windows ARM;2.8(2026-05)支持import defer并新增deno transpile、deno ci等子命令。 - 配套平台:Deno Deploy 提供边缘部署、KV 存储与 Cron 定时任务(见Web 开发与云端部署)。
| 版本 | 发布 | 与初学者最相关的能力 |
|---|---|---|
| 2.0 | 2024-10 | 兼容 npm 包与 Node 项目,node: 前缀导入 |
| 2.5 | 2025-09 | 权限写进 deno.json(权限集),不用每次敲一长串 |
| 2.6 | 2025-12 | deno audit 依赖漏洞扫描、dx 快速运行包命令 |
| 2.7 | 2026-02 | Temporal 日期 API 稳定,替代 Date 的现代方案 |
| 2.9 | 2026-06 | 当前稳定版;Node 26 兼容、快照测试 |
学习本模块不需要追新特性:2.x 各版本对基础语法(导入、权限、测试)完全向后兼容,先用起来,再按需关注新版公告。
2. 内置工具链
deno fmt # 格式化代码(含 Markdown、JSON、YAML)
deno lint # 代码检查,默认启用推荐规则集
deno test # 运行测试,自动发现 *_test.ts / *.test.ts
deno bench # 运行基准测试
deno check main.ts # 对文件做类型检查
deno compile hello.ts # 编译成单个可执行文件
deno info # 查看依赖树与缓存位置
讲解:
deno fmt与deno lint对标 Prettier/ESLint,零配置即用;fmt --check在 CI 里只校验不落盘。deno test自动发现*_test.ts文件并运行,内置断言库@std/assert,不需要安装 Jest。deno compile把脚本连同运行时打包成单文件可执行程序,适合分发 CLI 工具——收到的同事不需要装 Deno 也能跑。- 这些子命令全部开箱即用:一个二进制文件覆盖了 Node 生态里 prettier、eslint、jest、ts-node、pkg 五个工具的职责。
3. 与 Node.js 的对比
| 维度 | Node.js | Deno |
|---|---|---|
| 类型支持 | 需 tsx/ts-node | 原生 TypeScript |
| 模块 | npm + CommonJS/ESM | URL/JSR/npm,标准 ESM |
| 权限 | 默认全开 | 默认全关,按需授权 |
| 配置 | package.json + 一堆工具 | 零配置起步,deno.json 按需引入 |
| 生态 | 全球最大 | 兼容 npm,原生生态(JSR)快速增长 |
| 工具链 | 各工具自行组装 | fmt/lint/test/compile 全内置 |
什么时候选 Deno:
- 新写的脚本、CLI 工具、小型 API 服务——零配置与类型内置让起步成本接近零;
- 对供应链安全敏感的项目——权限模型 + 锁文件 +
deno audit的默认防线比 Node 的约定更硬; - 边缘场景(Deno Deploy)——代码与云端 API 一致,部署就是一条命令。
什么时候暂不选:团队重度依赖只支持 Node 的原生插件、或存量 Node 项目已稳定运行时,Deno 2 的兼容层虽好,也不必为迁移而迁移——先用 Deno 写新脚本是阻力最小的切入方式。
4. 常见陷阱与调试
- 权限报错误以为程序有 bug:
PermissionDenied: Requires read access to "secret.txt"是安全模型在起作用,不是异常。看报错第一行的 “Requires xxx access”,在运行命令补上对应--allow-xxx即可(详见权限模型与安全实践)。 --watch模式下权限被”遗忘”:deno run --watch重启的是脚本进程,不会改权限;改了权限参数要手动重新运行命令。- Windows 路径分隔符:拼路径一律用
@std/path的join,手工拼assets/cover.png在 Linux 部署环境可能翻车。 - 缓存”灵异现象”:改了远程依赖的版本但行为没变,多半是全局缓存没刷新——
DENO_DIR环境变量控制缓存目录(Windows 默认%LOCALAPPDATA%\deno),删除对应缓存或运行deno cache强制重取。 - 类型报错但代码能跑:
deno run默认不做全量类型检查(快速启动优先);上线前用deno check显式验证,把错误挡在 CI。
5. 动手试试
- 修改
hello.ts,用Deno.readTextFile读取同目录的一个 txt 文件,运行后观察权限提示。 - 运行
deno fmt hello.ts看看格式化效果,再试deno lint。 - 用
deno compile hello.ts生成可执行文件并运行它,对比deno run与双击 exe 的启动速度。 - 进入 REPL(直接运行
deno),输入Deno.version查看当前版本号。
6. 本篇小结
初学者要点:
- Deno = 原生 TypeScript + 默认安全的现代运行时;一个命令跑脚本,一条权限规则保护系统。
- 装好就能写:无 package.json、无 tsconfig、无编译步骤;
deno run与deno test是最高频的两条命令。 - 报错分两类:权限类报错补
--allow-xxx,语法/类型类报错改代码。
进阶注意:
- Deno 2 已兼容 npm 与 Node 项目结构,但”零配置”与”权限最小化”仍是它区别于 Node 的核心价值,迁移时别把这两样也丢掉。
- 2.x 迭代很快(约每季度一个 minor),生产项目用
deno-version固定 CI 版本,关注 release notes 而不是盲目升级。