Todo Tree是当前最稳、最可配、最不吃性能的TODO管理方案,尤其适合Vue/TSX项目或含大量生成文件的工程;它默认仅扫描打开文件与白名单路径,支持大小写混用、多格式注释及正则优化,10万行项目秒出结果。

别装一堆插件再逐个试——Todo Tree 是当前最稳、最可配、最不吃性能的 TODO 管理方案,尤其适合 Vue/TSX 项目或含大量生成文件(如 .d.ts、dist/)的工程。
为什么 Todo Tree 比 Todo+ 和 TODO Highlight 更值得优先选
Todo+ 功能强但扫描逻辑重,大型项目打开后 CPU 占用高、侧边栏响应慢;TODO Highlight 只做高亮,不提供树形视图和跳转导航,漏掉上下文。而 Todo Tree 默认只扫描打开的文件 + gitignored 白名单路径,配合正则优化后,10 万行项目里也能秒出结果。
常见错误现象:todo-tree.tree.showTags 默认为 false,装完插件侧边栏空着,以为没生效;todo-tree.general.tags 默认只认大写 ["TODO", "FIXME", "BUG"],导致 // todo:、// FIXME(john):、/* NOTE: */ 全部被忽略。
- Vue/TSX 文件里常混用大小写和括号注释,必须扩展
todo-tree.general.tags列表 - 默认正则
todo-tree.regex.regex不捕获冒号后内容,// TODO: 加认证跳转时只定位到:前,光标停在空白处 - 若项目含
node_modules或dist/,不设todo-tree.filtering.excludeGlobs,首次扫描卡死 20 秒以上
三项必改配置,5 分钟让 Todo Tree 真正可用
打开 settings.json(快捷键 Ctrl+Shift+P → 输入 Preferences: Open Settings (JSON)),粘贴以下三段(顺序无关,但缺一不可):
"todo-tree.tree.showTags": true, "todo-tree.general.tags": ["TODO", "todo", "FIXME", "fixme", "NOTE", "note", "HACK", "hack", "REVIEW", "review", "OPTIMIZE", "optimize"], "todo-tree.regex.regex": "((//|#|/\*|\*/|<!--|;|^)\s*($TAGS)(?=:|\s|$)|^\s*- \[ \])"
说明:$TAGS 是 Todo Tree 内置变量,会自动展开为你在 general.tags 里写的全部字符串;正则末尾的 (?=:|\s|$) 确保匹配到冒号或空格即停,避免跨行误抓。
容易踩的坑:
- 复制时多了一个逗号或少了一个引号,VSCode 会静默忽略整段配置
-
todo-tree.regex.regexCaseSensitive默认为true,但你写了todo和TODO就得设成false,否则小写全失效 - 如果用了中文注释如
// 待办:,这个正则不支持,得换更宽松的版本,比如把($TAGS)改成(TODO|todo|FIXME|fixme|待办|修复)
自定义高亮颜色和图标,让 REVIEW 和 HACK 一眼可辨
仅靠文字颜色不够,加图标 + 背景色才能形成视觉锚点。用 todo-tree.customHighlight 控制每类标签样式,注意 key 必须是纯字符串(不能带 // 或空格):
"todo-tree.customHighlight": {
"REVIEW": {
"icon": "eye",
"color": "#FFA500",
"background": "#fff8e1",
"rulerColour": "#FFA500"
},
"HACK": {
"icon": "zap",
"color": "#d32f2f",
"background": "#ffebee",
"rulerColour": "#d32f2f"
}
}
说明:icon 值必须是 VSCode 内置 codicon 名称(eye、zap、bug、checklist 等),拼错不会报错,但图标不显示;background 设为浅色比纯色更护眼,尤其在暗色主题下。
使用场景:
- 团队约定
// REVIEW:表示需交叉检查,// HACK:表示临时绕过,上线前必须删——靠颜色就能快速扫出风险密度 - 图标出现在侧边栏和行首,但不会影响代码折叠或格式化,比 TODO Highlight 的背景块更轻量
- 若某类标签(如
OPTIMIZE)只用于性能专项,可不加customHighlight,它仍会出现在树中,只是无样式
排除干扰路径,防止扫描卡死或结果爆炸
默认 Todo Tree 会遍历整个工作区,遇到 node_modules、dist/、.git 或生成的 .d.ts 文件,要么卡住,要么塞满无关 TODO。必须显式排除:
"todo-tree.filtering.excludeGlobs": [ "**/node_modules/**", "**/dist/**", "**/build/**", "**/.git/**", "**/*.d.ts", "**/coverage/**" ]
性能影响:未排除 node_modules 时,首次扫描耗时从 300ms 拉长到 12s;排除后稳定在 400ms 内,且后续增量扫描几乎无感。
容易被忽略的地方:
-
excludeGlobs是数组,不是字符串,写成"**/node_modules/**"会直接失效 - 若用 pnpm,还需加
"**/.pnpm/**";若用 Turborepo,加"**/.turbo/**" -
**/*.d.ts必须加,否则 TypeScript 自动生成的声明文件里一堆// TODO: infer return type会刷屏
复杂点在于:不同项目结构差异大,没有通用 exclude 列表,得根据 ls -R | head -20 实际看一眼顶层目录再定;生成文件路径一旦写漏,第二天就可能被同事的 PR 带进新干扰项。


















