5月31日 17:42

Deno 内置工具怎么用?哪些场景能少装依赖?

Deno 的一个明显特点是把格式化、检查、测试、文档、性能测试和编译都放进了 CLI。对小团队来说,这意味着项目刚创建时不用先决定 ESLint、Prettier、Jest、ts-node、打包器分别怎么配。它不是要替代所有前端工程工具,而是把 TypeScript 服务端、脚本和库开发中最常见的流程先收拢起来。

追问

deno fmt 和 deno lint 能替代 Prettier、ESLint 吗?

在纯 Deno 项目里,大多数情况下可以直接用 deno fmtdeno lint,它们开箱即用,团队不用争论缩进、引号和基础规则。取舍是规则可配置空间没有 ESLint 那么大,如果项目有大量自定义 lint 规则、React 特定规则或历史代码风格,迁移时会有摩擦。边界也很清楚:Deno 工具更适合统一风格和抓常见问题,不适合承载复杂业务规范。常见坑是把 deno fmt 直接作用到整个仓库,结果格式化了不该改的生成文件,所以要在 deno.json 里排除目录。

json
{ "fmt": { "exclude": ["dist", "coverage"] }, "lint": { "exclude": ["dist", "vendor"] } }
bash
deno fmt --check deno lint

deno test 适合测哪些代码?

deno test 适合测试工具函数、HTTP handler、Deno 服务端模块和不依赖浏览器 DOM 的逻辑。它支持权限参数,所以测试里如果要读文件或访问本地端口,需要显式声明,这能逼你看清测试到底碰了哪些资源。取舍是它不像 Jest 那样自带庞大的生态和快照习惯,迁移 React 组件测试时未必划算。踩坑点是异步测试忘记 await 或测试权限没写全,表现可能像代码错了,其实是运行命令不完整。

ts
import { assertEquals } from "https://deno.land/std@0.224.0/assert/mod.ts"; Deno.test("sum works", () => { assertEquals(1 + 2, 3); });
bash
deno test --allow-read=./fixtures

deno task 有什么实际价值?

deno task 类似 npm scripts,用来把常用命令写进 deno.json,让本地和 CI 使用同一套入口。它的价值不是功能多,而是减少“你本地怎么跑”的沟通成本。取舍是跨运行时项目仍然可能需要 pnpm、make 或 turborepo,Deno task 更适合 Deno 子项目内部统一命令。常见坑是把权限参数散落在文档里,最后 CI 忘加权限,最好统一写到 task 中。

json
{ "tasks": { "dev": "deno run --watch --allow-net --allow-read src/main.ts", "check": "deno fmt --check && deno lint && deno test --allow-read" } }
bash
deno task check

deno compile 什么时候有用?

deno compile 可以把脚本打成单个可执行文件,适合内部 CLI、运维工具和发给非前端同事使用的小程序。好处是对方不需要先安装 Deno,也不用理解依赖缓存。边界是产物体积通常不小,且动态读取文件、远程导入和运行时权限需要提前想清楚。踩坑最多的是编译时没有把所需权限和目标平台写进去,结果本地能跑,换机器后访问网络或文件失败。

bash
deno compile --allow-read --allow-net --output bin/tool src/cli.ts

deno doc 和 deno bench 值得放进日常流程吗?

如果你在写共享库或内部 SDK,deno doc 很值得用,因为它能从类型和 JSDoc 直接生成 API 文档,减少文档和代码不一致。deno bench 适合比较关键函数的性能变化,但不应该拿一次本机结果做绝对结论。取舍是文档和基准测试都会增加维护成本,只有公共 API、核心算法或性能敏感路径才值得固定下来。踩坑是 benchmark 受机器负载影响很大,最好比较同一环境下的相对变化,而不是追求漂亮数字。

小结

Deno 内置工具最适合解决“项目启动阶段工具太多”的问题。先用 fmt + lint + test + task 建立基本质量线,需要分发 CLI 时再考虑 compile,需要维护库时再补 docbench,这样既能少装依赖,也不会把工具链用过头。

标签:Deno