学径XUEJING · 个人学习平台通知设置

课程库 技术雷达 工程与 DX › 第 1

DX 工具链 —— 红波浪线、自动格式化背后都是谁在干活

工具课35 分钟

本课导读

DX = Developer Experience(开发者体验),对标 UX:UX 衡量产品好不好用,DX 衡量"开发这件事"顺不顺手——报错清不清楚、保存到看到效果要几秒、犯低级错误时有没有东西拦你。而"DX 工具"就是把这些体验做出来的一整条流水线。你的项目根目录躺着的 eslint.config.mjs、VS Code 里的红波浪线、保存时代码自动排版——全是这条流水线的成员,本课把整张地图摊开,你会发现前四课的知识点在这里全部汇合。预计 35 分钟。

一张地图:代码从写下到上线,每一步谁在服务你

按一行代码的旅程排列,DX 工具链有六层:

干什么代表工具你项目里的对应物
① 编辑器智能边写边提示错误、自动补全tsserver(LSP)红波浪线
② Linter揪出"能跑但危险"的写法ESLint、Biomeeslint.config.mjs
③ Formatter统一代码排版Prettier保存自动格式化
④ 编译/打包把 TS/JSX 变成浏览器能跑的 JStsc、esbuild、SWC、Turbopacknext dev / next build
⑤ 包管理装依赖、锁版本npm、pnpm、bunpackage.json + node_modules
⑥ 测试自动验证代码没坏Vitest、Playwright(你还没有,早晚会有)

逐层拆开:

① 编辑器智能(LSP)——你敲代码时 VS Code 并不自己懂 TypeScript:后台跑着一个叫 tsserver 的独立进程,编辑器每敲一个字就通过 LSP 协议(上一课刚学的:本质是 JSON-RPC)问它"这行有没有问题、光标处能补全什么"。红波浪线不是编辑器画的,是语言服务器"遥控"画的。这个设计的天才之处:任何编辑器接上 LSP 就获得任何语言的智能,不用每个编辑器为每门语言各写一遍支持(N×M 变 N+M)。

② Linter(代码警察)——管的不是"错不错"而是"能跑但危险/不规范":写了没用的变量、== 该写 ===、React 的 hooks 顺序不对。每条规则可配置,团队用它统一"什么写法不许出现"。

③ Formatter(排版工)——只管长相:缩进、引号、换行。Prettier 的哲学很激进:几乎不给配置项,"别吵了,全按我的排"——它终结了程序员史上最无聊的战争(tab vs 空格),把审美问题变成了自动化问题。

提示

Linter 和 Formatter 的分工一句话记牢:Formatter 管好不好看,Linter 管危不危险。前者改的是空格换行(永远安全),后者提示的可能是真 bug。两者常被混淆,因为 ESLint 历史上也管过排版——现代分工是排版全交 Prettier,ESLint 专心抓隐患。

④ 编译/打包——TS 要变 JS、JSX 要变函数调用、几百个文件要合并压缩,这是每次保存都要跑的重活。⑤ 包管理你天天在用。⑥ 测试是你迟早补上的一层。

感受一下 ②③ 的日常

一段"能跑但一身毛病"的代码,工具链各自会抓什么:

TypeScript
// ── 交给工具链之前 ──
const  price=299;let qty="2"
const unused = "我从没被用过"
if (qty == 2) { console.log("买了俩")  }

// Formatter(Prettier)会修:乱七八糟的空格、缺分号、引号风格 → 统一排版
// Linter(ESLint)会警告:
//   - unused 定义了从没用(no-unused-vars)
//   - qty 用 let 但从没改过,该用 const(prefer-const)
//   - == 有隐式转换陷阱,该用 ===(eqeqeq)
// TypeScript(tsserver)会直接报错:
//   - qty 是 string,和数字比较类型不合

// ── 三层各司其职:排版问题 / 危险写法 / 类型错误 ──

注意三层是递进的安全网:Formatter 连"错误"都算不上只管美观,Linter 抓"合法但可疑",类型检查抓"根本不该编译通过"。你项目每次 npm run build 前跑的检查,就是这套网在兜底。

雷达收束:为什么这条工具链正在被集体重写

近两年 DX 圈最大的叙事,就是整条工具链在被 Rust(和 Go)重写——现在你能完整看懂原因了:

  • 编译打包:Babel/webpack(JS 写的)→ SWC、Turbopack(Rust)、esbuild(Go)——你的 Next.js 已经在用
  • Lint + 格式化:ESLint + Prettier → Biome(Rust,一个工具顶两个)
  • 包管理:npm → bun install(Zig)、pnpm
  • Python 圈同款剧情:pip/flake8 → uv、ruff(Rust)

逻辑链条把前四课串起来了:工具要一遍遍处理百万行代码(第 5 课),用 JS 写跑在运行时上有引擎和 GC 开销(第 2 课),换成编译成机器码、无 GC 的 Rust(第 1 课)快 10~100 倍;工具之间用 JSON-RPC/LSP 对话(第 4 课);而它们的用户界面几乎全是 CLI(第 3 课)。 一条新闻里的七个名词,现在互为注脚。

说明

这也是这个 Track 的方法论:别背工具名(明年就换一批),记住每一层「解决什么问题」。层是稳定的,明星是流动的——十年前这张表里写的还是 grunt 和 bower,问题一个没变。

够用判断线

一句话总结:DX 工具链 = 编辑器智能(LSP)→ Linter(抓危险)→ Formatter(管排版)→ 编译打包 → 包管理 → 测试,六层流水线服务「代码从写下到上线」,当前正被 Rust 系集体重写提速。 值得动手的信号(这个是工具课,动手门槛很低):给 VS Code 配上"保存时自动 Prettier + 修复 ESLint",一次配置终身受益——这大概是所有 DX 投资里回报率最高的十分钟。

随堂测验

随堂测验0 / 4 题正确

1. VS Code 里的红波浪线是怎么来的?

2. Linter 和 Formatter 的分工,正确的是?

3. 「整条 JS 工具链正在被 Rust 重写」,背后的完整逻辑是?

4. 这个 Track 主张「别背工具名,记住每一层解决什么问题」,原因是?

划选正文任意文字可高亮、批注或加入复习卡

讨论

载入中…