ctrl+alt+o(win/linux)或cmd+option+o(macos)仅删除静态分析确认未被引用的import,包括普通命名/默认导入、重复路径导入;但保留import type、jsdoc类型引用、动态import及间接类型使用。

Ctrl+Alt+O 能删掉哪些 import?
Ctrl+Alt+O(Windows/Linux)或 Cmd+Option+O(macOS)触发的是 Optimize Imports,它只删「静态可达性分析确认未被引用」的导入。不是所有灰色 import 都会被清掉——WebStorm 不运行代码,只看 AST。
它能准确删掉的情况包括:
- 普通命名导入、默认导入,且在 JS/TS 文件中完全没出现(包括类型位置、字符串字面量、JSDoc 以外的任何地方)
- 重复的相同路径导入(如两个
import { foo } from 'lib') - 仅用于已被删除变量的导入(比如删了
const x = bar(),对应import { bar } from 'lib'就可能被顺带清理)
但它不会动这些:
-
import type—— 即使没用,只要tsconfig.json里设了"importsNotUsedAsValues": "error",就保留 - JSDoc 中的类型引用,例如
/** @type {MyType} */用到的import { MyType } from './types' - 动态 import 路径含变量,如
import(`./pages/${page}.tsx`)—— 静态分析无法推断page值 - 命名导入被间接用于泛型或类型参数,比如
import { Options } from 'lib'; const x: Array<options> = [];</options>
Alt+Enter 为什么比 Ctrl+Alt+O 更精准?
悬停在灰色变量或导入上按 Alt+Enter,选 Remove unused declaration,是逐项确认式清理,不依赖全局索引状态,也不受 JSDoc 或类型间接使用干扰。
适合这种场景:
- 只想删某一个 import,而不是整文件重排
- 刚改完代码,IDE 还没刷新符号索引(此时
Ctrl+Alt+O可能漏删或误删) - 怀疑某个 import 被“误判为已使用”,比如它只出现在注释或未激活的条件分支里
注意:批量删当前文件所有未用变量,可把光标放在任意灰色变量上,按 Alt+Enter → 方向键选 Fix all 'Unused local variable' problems in file;但别直接点顶部的“Fix all”按钮——它可能跳过被模板字符串或 eval 动态引用的变量。
批量清理整个项目时,为什么先要 Invalidate Caches?
如果 Ctrl+Alt+O 行为异常(该删的不删、不该删的删了),大概率不是功能 bug,而是 IDE 的符号索引滞后或损坏。
必须做的前置动作:
- 执行
File | Invalidate Caches and Restart… - 勾选
Clear file system cache and Local History和Clear VCS Log caches and indexes - 重启后等 WebStorm 完成重新索引(右下角状态栏显示 “Indexing…” 消失)再操作
否则,即使你手动删了 import,IDE 可能仍把它标记为“已使用”,因为旧索引里还存着过期的引用关系。尤其在切换 Git 分支、升级依赖或重装 node_modules 后,这步不能跳过。
真正扫光所有 unused import,得靠 Run Inspection
Ctrl+Alt+O 是编辑时的轻量清理,而全量扫描必须用 Analyze | Run Inspection by Name。
操作路径:
- 按
Ctrl+Shift+Alt+I(或菜单Analyze → Run Inspection by Name) - 输入
unused import,回车 - 选择范围为
Whole project,点 OK
这个检查会穿透 JSDoc、类型位置、泛型参数,甚至部分动态路径逻辑(比如识别 import('./foo') 中的字面量),比 Optimize Imports 更彻底。但代价是慢——大项目可能卡几秒,且结果需人工核对(比如某些 import 是为将来预留,或被测试框架反射调用)。
最后提醒:没有一键清空的银弹。最稳的流程是 —— 先 Invalidate Caches,再 Ctrl+Alt+O 快速过一遍,最后用 Run Inspection 查漏补缺。漏掉的往往不是功能缺陷,而是你没意识到的引用方式。











