Deno 工具链总览
Deno 将开发者最常用的工具全部内置,无需安装 Prettier、ESLint、TypeDoc 等独立工具:
| 命令 | 功能 | 替代工具 |
|---|---|---|
deno fmt | 代码格式化 | Prettier |
deno lint | 静态代码检查 | ESLint |
deno check | TypeScript 类型检查 | tsc --noEmit |
deno doc | API 文档生成 | TypeDoc |
deno compile | 打包为独立可执行文件 | pkg / nexe |
deno test | 运行测试 | Jest / Vitest |
deno bench | 性能基准 | benchmark.js |
deno task | 运行脚本任务 | npm run / Makefile |
deno repl | 交互式 REPL | node |
deno info | 依赖图分析 | madge |
deno fmt:代码格式化
Deno 内置的格式化工具基于 dprint,支持 TypeScript、JavaScript、JSON、Markdown、HTML 等格式,与 Prettier 高度兼容:
# 格式化所有文件(原地修改)
deno fmt
# 仅检查,不修改(CI 使用)
deno fmt --check
# 格式化指定文件
deno fmt src/main.ts
# 排除某些文件
deno fmt --ignore=dist,node_modules
// deno.json — fmt 配置
{
"fmt": {
"useTabs": false,
"lineWidth": 100,
"indentWidth": 2,
"singleQuote": false,
"proseWrap": "preserve",
"semiColons": true,
"exclude": ["dist/", "*.gen.ts"]
}
}
deno lint:静态代码检查
内置 lint 工具包含 50+ 条规则,覆盖常见代码问题,规则基于 ESLint 和 TypeScript ESLint 的最佳实践:
# 检查所有文件
deno lint
# 检查特定目录
deno lint src/
# JSON 格式输出(CI/IDE 集成)
deno lint --json
// deno.json — lint 配置
{
"lint": {
"rules": {
"include": ["ban-untagged-todo", "no-console"],
"exclude": ["no-explicit-any"]
},
"exclude": ["dist/", "*.min.js"]
}
}
// 行内禁用规则(类似 ESLint 注释)
// deno-lint-ignore no-explicit-any
function process(data: any) {
// ...
}
// 禁用整个文件
// deno-lint-ignore-file no-console
常见 lint 规则
no-unused-vars:未使用的变量no-explicit-any:显式使用 any 类型no-inferrable-types:可推断的类型注解(冗余)no-unreachable:不可达代码eqeqeq:应使用 === 而非 ==no-console:禁止 console.log(可配置)ban-ts-comment:禁止 @ts-ignore 等注释
deno check:类型检查
# 类型检查(不运行代码)
deno check main.ts
# 检查所有文件
deno check **/*.ts
# 包含远程模块的类型检查
deno check --all main.ts
deno run vs deno check:deno run 运行时会做类型擦除但不检查类型错误。deno check 只做类型检查,不运行代码。在 CI/CD 流水线中,两者都应该运行:先 deno check 确保类型正确,再 deno test 确保逻辑正确。
deno doc:文档生成
# 查看模块文档(终端输出)
deno doc mod.ts
# 生成 HTML 文档站点
deno doc --html --output=docs/ mod.ts
# 查看内置 API 文档
deno doc --builtin
# 查看特定符号
deno doc mod.ts MyClass
// 文档注释格式(JSDoc 子集)
/**
* 计算两个数的最大公约数
*
* @param a 第一个正整数
* @param b 第二个正整数
* @returns 最大公约数
* @example
* ```ts
* gcd(12, 8); // 4
* gcd(100, 75); // 25
* ```
*/
export function gcd(a: number, b: number): number {
while (b !== 0) {
[a, b] = [b, a % b];
}
return a;
}
deno compile:打包为可执行文件
将 Deno 脚本打包为独立可执行文件,目标机器无需安装 Deno:
# 编译为当前平台可执行文件
deno compile --allow-net --allow-read main.ts
# 指定输出文件名
deno compile -o myapp --allow-net main.ts
# 交叉编译(在 macOS 上编译 Linux 可执行文件)
deno compile --target x86_64-unknown-linux-gnu -o myapp-linux main.ts
# 支持的编译目标:
# x86_64-unknown-linux-gnu (Linux x64)
# x86_64-pc-windows-msvc (Windows x64)
# x86_64-apple-darwin (macOS x64)
# aarch64-apple-darwin (macOS Apple Silicon)
# 包含静态资源(嵌入文件)
deno compile --include ./static --allow-read main.ts
编译产物:deno compile 生成的可执行文件包含了 V8 引擎和所有依赖,通常体积在 60-90MB。对于命令行工具(CLI)、小型服务器工具,这是非常方便的分发方式——用户无需安装 Deno 或 Node.js 即可运行。
deno bundle 的替代方案
Deno 2 已弃用 deno bundle(只生成 JS 文件的打包命令),推荐以下替代方案:
# 替代1:esbuild(通过 npm: 使用)
deno run -A npm:esbuild --bundle --format=esm src/main.ts --outfile=dist/main.js
# 替代2:deno_emit(Deno 官方库)
# jsr:@deno/emit
# 替代3:Vite(通过 npm:)
deno run -A npm:vite build
VS Code Deno 插件
安装官方 Deno VS Code 插件(denoland.vscode-deno),享受完整的 IDE 支持:
// .vscode/settings.json — 启用 Deno 工作区
{
"deno.enable": true,
"deno.lint": true,
"deno.unstable": [],
"editor.formatOnSave": true,
"editor.defaultFormatter": "denoland.vscode-deno",
"[typescript]": {
"editor.defaultFormatter": "denoland.vscode-deno"
}
}
Deno vs Node 模式冲突:VS Code 的 TypeScript 插件默认按 Node.js 模式解析模块。安装 Deno 插件后,你需要在 .vscode/settings.json 中明确设置 "deno.enable": true,否则 IDE 会对 jsr:、npm: 前缀报错。对于 monorepo 中部分目录使用 Deno 的情况,可以在子目录的 .vscode/settings.json 中单独配置。
推荐的 CI/CD 工作流
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: denoland/setup-deno@v2
with:
deno-version: v2.x
- name: 类型检查
run: deno check main.ts
- name: 代码格式检查
run: deno fmt --check
- name: Lint
run: deno lint
- name: 运行测试
run: deno test --allow-read --allow-net --coverage=coverage/
- name: 覆盖率报告
run: deno coverage coverage/ --lcov --output=coverage.lcov
本章小结:Deno 的工具链一体化是其核心竞争优势——fmt/lint/check/doc/compile 全部内置,零配置即用。对比 Node.js 生态需要分别安装 Prettier + ESLint + TypeDoc + pkg,Deno 的"一个工具解决所有问题"设计大幅降低了项目维护成本。VS Code 官方插件提供完整 IDE 支持,CI/CD 流水线只需一行 setup 即可使用所有工具。