关于 knip
knip 是一项仓库指导技能,帮助配置 Knip 检测未使用的文件、导出和依赖,同时减少误报。它面向需要审查 Knip 结果并避免大范围关闭检查的开发者。
主要功能
- 01指导配置 knip.jsonc
- 02保留导出检查的规则
- 03处理生成的 shadcn/ui 文件
- 04管理 CSS 导入的依赖
- 05按序减少检测噪声
适用场景
- 01在仓库中配置 Knip
- 02审查并处理 Knip 检测结果
- 03检查忽略项与排除规则
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ liaoann/ skills --skill knip安装后在 Claude Code 中输入/knip确认已加载。
详细介绍
Knip
配置 Knip(用于检测未使用文件、导出和依赖的工具),让它持续发现真正的死代码,同时避免产生大量误报。
适用范围
当改动涉及 Knip 配置或需要处理 Knip 的输出时使用。本指南提供建议,不是操作流程。
规则
配置文件使用 knip.jsonc
不要使用 knip.json、knip.ts 或 package.json 中的配置项。JSONC 支持注释,而且每个忽略项旁都需要写明原因——如果 ignoreDependencies 中只有一个裸包名,一个月后就无法审核它为何被忽略。
{
"$schema": "https://unpkg.com/knip@6/schema-jsonc.json",
"entry": ["src/index.ts"],
"project": ["src/**/*.{ts,tsx}"]
}
只有当配置需要用到无法通过数据表达的 compilers 函数时,才使用 knip.ts。
绝不设置 ignoreExportsUsedInFile
如果导出的 type / interface 只有本文件中的函数会用到,那么它只是一个多写了 export 关键字的本地类型。Knip 默认值(false)会报告这一问题——这正是你想要的检查结果。将其设为 true,或细化设置为 { "interface": true, "type": true },都会取消这项检查。通过排除 types 问题类型来让 CI 变绿也是如此。
解决此类问题的方法是移除 export 关键字。如果某个导出确实必须保持公开,就为该符号添加标记(/** @public */,并设置 "tags": ["-public"]),而不是放宽全局选项。
shadcn/ui:忽略生成目录
{
// Generated by shadcn/ui — not hand-authored, do not prune.
"ignore": ["src/components/ui/**"]
}
这些文件是随项目提供的生成文件,包含未使用的变体;清理它们只会让你下次运行 shadcn add 时丢失这些文件。路径应与项目的 components.json 别名匹配。
结果是:ignore 会将这些文件从依赖图中移除,因此仅在这些文件中使用的包(radix、class-variance-authority、clsx、tailwind-merge、lucide-react 等)现在会被报告为未使用——将项目实际用到的包加入 ignoreDependencies。如果列表太长,可以改用 "entry": ["src/components/ui/**"]:这样不会报告导出,但导入仍会计入。
CSS 导入的包应加入 ignoreDependencies
Tailwind v4 通过 CSS(@import "tailwindcss")接入,Knip 不会扫描 CSS,因此会产生误报。
{
"ignoreDependencies": [
// Imported from CSS, invisible to the module graph.
"tailwindcss",
"tw-animate-css"
]
}
删除 Knip 标记的任何依赖前,先对样式表执行 grep。
按以下顺序消除噪声
entry / project glob → 插件配置 → 针对性忽略(ignoreDependencies、ignoreFiles、标签)→ 最后才用 ignore。绝不要通过扩大顶层 exclude 来消除某个发现;这会为了隐藏一个实例而禁用整个仓库的检查。
完成标准
- 配置文件为
knip.jsonc,并使用schema-jsonc.json$schema(除非compilers要求使用knip.ts)。 - 未设置
ignoreExportsUsedInFile,且未排除types。 - 每个
ignore/ignoreFiles/ignoreDependencies条目旁都有注释说明原因。 - 已忽略 shadcn 的
components/ui/**,或将其设为entry;若选择忽略,则列出仅在其中使用的依赖。 - CSS 导入的包已加入
ignoreDependencies,而非从package.json中移除。 knip运行无误,且没有在整个仓库范围内禁用任何检查。