用途
Knip 是一款面向 JavaScript 与 TypeScript 项目的死代码检测工具,用于发现未使用的代码、依赖和导出,帮助维护干净的代码库,并在死代码累积前将其捕获。其官方文档地址为 https://knip.dev。
主要能力
根据资料,Knip 的核心能力包括:检测未使用的文件、依赖(npm 与工作区包)、导出、类型以及枚举成员;检测未被使用的再导出;识别未使用的类成员;支持 monorepo 与工作区;对大型代码库可在数秒内完成分析;提供带文件位置的清晰报告;并支持通过退出码在构建中失败,适用于 CI。
插件系统方面,Knip 内置对 80 多个框架与工具的插件支持,并可自动检测与配置。框架插件示例包括 Next.js、Vite、Remix、Astro、SvelteKit、Nuxt;测试运行器插件示例包括 Vitest、Jest、Playwright、Cypress;构建工具插件示例包括 TypeScript、ESLint、PostCSS、Tailwind。每个插件对应不同的入口点,例如 Next.js 对应 pages/、app/、middleware.ts,Vite 对应 index.html 与配置插件等。
使用方式
安装与基础用法
安装命令(资料示例使用 npx,等效命令也适用于 bun/bunx 或 yarn/yarn dlx):
npm install --save-dev knip
npx knip --version
基础命令:
npx knip
npx knip --dependencies
npx knip --exports
npx knip --files
npx knip --production
npx knip --exclude-exports-used-in-file
npx knip --reporter json
npx knip --debug
配置
Knip 支持零配置自动检测:自动检测入口点(package.json 的 main、exports、bin)、框架、测试运行器与构建工具,标准项目无需配置。也可通过 knip.json 进行显式配置,示例:
{
"$schema": "https://unpkg.com/knip@latest/schema.json",
"entry": ["src/index.ts", "src/cli.ts"],
"project": ["src/**/*.ts"],
"ignore": ["**/*.test.ts", "scripts/**"],
"ignoreDependencies": ["@types/*"],
"ignoreBinaries": ["npm-check-updates"]
}
也可使用 TypeScript 配置 knip.ts,通过 import type { KnipConfig } from 'knip'; 定义配置对象并默认导出,支持 entry、project、ignore、ignoreDependencies、ignoreBinaries、ignoreExportsUsedInFile、ignoreWorkspaces、workspaces 等字段。
插件配置覆盖
可在配置中禁用特定插件(如 eslint: false、prettier: false),或覆盖插件配置,例如为 vitest 指定 entry 与 config,为 next 指定 entry 列表。
忽略问题
支持 ignore 模式、ignoreDependencies、ignoreExportsUsedInFile、ignoreWorkspaces 等配置;也支持内联注释忽略,例如 // @knip-ignore-export,以及在 package.json 依赖后使用 // @knip-ignore-dependency。
CI/CD 集成
资料提供了 GitHub Actions、GitLab CI 与 pre-commit hook 的示例。GitHub Actions 示例中执行 npx knip --production 和 npx knip --max-issues 0;GitLab CI 在 test 阶段执行 npm ci 与 npx knip --production;pre-commit hook 中 entry 为 npx knip,pass_filenames 为 false。
常见模式
- 仅检查未使用依赖:
npx knip --dependencies,配合--max-issues 0在 CI 中强制依赖卫生。 - 仅检查导出(库开发):
npx knip --exports,或npx knip --exports --exclude-exports-used-in-file。 - 生产与开发依赖:
npx knip --production仅检查生产代码,npx knip检查全部。 - Monorepo:通过 workspaces 配置各工作区,使用
npx knip检查全部,或npx knip --workspace packages/web检查特定工作区。
结果解读
示例输出会列出未使用文件、依赖与导出的数量及具体位置(文件与行号)。问题类型与对应处理包括:未使用文件(删除或加入入口点)、未使用依赖(从依赖中移除)、未使用导出(移除导出或改为私有)、未使用类型(移除或改为内部)、未使用枚举成员(移除该成员)、重复导出(合并导出)。
故障排查
资料列出若干常见问题处理:误报(通过副作用使用的导出)可通过 ignoreExportsUsedInFile 或加入入口点解决;找不到入口点可运行 npx knip --debug 或手动指定 --entry;性能问题可排除 node_modules、使用 .gitignore 模式、提高内存限制(NODE_OPTIONS=--max-old-space-size=4096);插件未检测可强制启用插件;脚本中的未使用依赖若未检测到可加入 ignoreDependencies。
高级用法
包括自定义报告器(json、compact,custom 标注为 coming soon)、增量检查(npx knip --changed,可配合 --base main)、类型检查集成(includeTypeImports、types 配置)。
适用场景
Knip 适用于 TypeScript/JavaScript 代码库的清理工作、依赖治理、库公共 API 维护、monorepo 管理,以及 CI/CD 中的死代码检测与依赖卫生检查。资料建议最佳实践为:先从依赖检查开始,再到导出,最后检查文件;逐步采用(先限定关键路径,再扩展覆盖范围);在 CI 中检查依赖与导出;并制定了维护计划(每周完整扫描、PR 审查新未使用导出、发布前使用 --production 完整扫描、重构前后运行 Knip)。
限制
资料中未提供关于 Knip 具体收费模式、价格、平台支持范围(除 Node 生态外)及性能基准数据的说明,相关内容暂未提供。