Chapter 09

工具链全景

fmt、lint、check、doc、compile——Deno 内置的完整开发工具集

Deno 工具链总览

Deno 将开发者最常用的工具全部内置,无需安装 Prettier、ESLint、TypeDoc 等独立工具:

命令功能替代工具
deno fmt代码格式化Prettier
deno lint静态代码检查ESLint
deno checkTypeScript 类型检查tsc --noEmit
deno docAPI 文档生成TypeDoc
deno compile打包为独立可执行文件pkg / nexe
deno test运行测试Jest / Vitest
deno bench性能基准benchmark.js
deno task运行脚本任务npm run / Makefile
deno repl交互式 REPLnode
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 规则

deno check:类型检查

# 类型检查(不运行代码)
deno check main.ts

# 检查所有文件
deno check **/*.ts

# 包含远程模块的类型检查
deno check --all main.ts

deno run vs deno checkdeno 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 即可使用所有工具。