vscode 保存时自动删除未使用 import 需配置 editor.codeactionsonsave 对象,如 "source.removeunusedimports": true 或 "source.organizeimports": true;仅开启格式化或 ui 开关无效,且依赖语言服务支持(ts/jsx 稳定,js/vue/py 差异大),需确保文件有正确语言模式和插件。

VSCode 保存时自动删未用 import 不是默认行为,必须显式配置 editor.codeActionsOnSave 并启用对应 action,否则无论装多少插件、开多少格式化开关,import { foo } from './utils' 都会原封不动留在文件里。
必须写对 editor.codeActionsOnSave 的结构
这个配置必须是对象,不能是布尔值或字符串;只勾 UI 里的“Organize imports on save”或只开 editor.formatOnSave 都无效。
-
"editor.codeActionsOnSave": { "source.organizeImports": true }—— 同时排序 + 删除未使用项(TS/JSX 稳定) -
"editor.codeActionsOnSave": { "source.removeUnusedImports": true }—— 只删不用的,不改顺序(适合讨厌 import 被重排的团队) - 两者可共存:
"source.organizeImports": false, "source.removeUnusedImports": true,避免顺序扰动 - 别写成
"editor.codeActionsOnSave": true或"editor.codeActionsOnSave": "always",这些写法完全不生效
不同语言支持程度差异极大
背后依赖语言服务,不是 VSCode 通用功能。同一配置在不同后缀下表现可能天差地别:
-
.ts/.tsx:由 TypeScript 服务驱动,识别准、删得稳,import { ref } from 'vue'没调用就直接删 -
.js:import { foo } from './utils'若没类型信息或 JSDoc 注解,大概率跳过删除;加一句/** @type {typeof import('./utils').foo} */才可能触发 -
.vue(SFC):必须装 Volar 插件,且确保typescript.suggest.autoImports开启,否则<script setup></script>中的 import 不响应 -
.py:VSCode 原生不支持source.organizeImports;Pylance 只灰显提示,不触发删除;得靠isort+autopep8脚本化处理
和 ESLint / Prettier 共存时容易互相覆盖
典型现象:保存后 import 被删了一半又加回来,或排序了但没删——本质是多个 code action 执行顺序冲突。
- 如果同时开了
"source.fixAll.eslint": true和"source.organizeImports": true,ESLint 的修复可能在 organize 之后跑,把刚删掉的 import 又加回来(尤其用了eslint-plugin-import的 auto-import 规则时) - 建议优先禁用
source.fixAll.eslint,或把 ESLint 的no-unused-imports设为error,配合eslint.run: onType实时提示,比强删更可控 - 验证是否生效:手动删掉一个已使用的 import,再输入它,看是否出现灯泡图标 → 按
Ctrl+.是否弹出 “Organize imports” 选项
最容易被忽略的是语言服务状态:右下角状态栏显示 “Plain Text” 而非 “JavaScript” 或 “TypeScript”,或者编辑的是未保存的 untitled-1 文件,都会导致 source.organizeImports 完全不触发。











