vscode 保存时自动删除无用 import 依赖 language server 的 source.organizeimports 或 source.removeunusedimports,需正确配置 editor.codeactionsonsave 为对象形式,如 { "source.organizeimports": true },仅开 formatonsave 或 ui 开关无效;不同语言支持差异大:ts/jsx 稳定,js 需 jsdoc 辅助,vue sfc 需 volar,python 原生不支持;与 eslint 共存易冲突,建议优先禁用 source.fixall.eslint;验证方式为手动删用 import 后触发灯泡提示;框架隐式依赖(如 defineprops、react)不可删,全局扩展需注释绕过。

VSCode 保存时自动删无用 import,靠的是原生 source.organizeImports 或 source.removeUnusedImports,不是格式化、也不是 ESLint 默认行为——配错地方就完全不生效。
必须写对 editor.codeActionsOnSave 的结构
这个配置必须是对象,不能是布尔值;只开 editor.formatOnSave 或只勾 UI 里的“Organize imports on save”开关,大概率无效。
-
"editor.codeActionsOnSave": { "source.organizeImports": true }—— 同时排序 + 删除未使用项(TS/JSX 稳定,.js 文件需 JSDoc 辅助) -
"editor.codeActionsOnSave": { "source.removeUnusedImports": true }—— 只删不用的,不改顺序(适合讨厌 import 被重排的团队) - 如果同时要删未用变量,可加
"source.removeUnusedVariables": true,但仅限 TS/JS,且 .js 中识别率低
source.organizeImports 在不同语言里效果差很多
它不是通用功能,背后依赖语言服务,各语言支持程度差异大:
-
.ts/.tsx:由 TypeScript 语言服务驱动,删得准、排得稳,import { ref } from 'vue'没调用就直接删 -
.js/.jsx:没类型信息时保守处理,纯import { foo } from './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,只留source.organizeImports;真要共存,得确认 ESLint 规则里没开启import/no-unresolved或import/named的自动修复 - 验证是否生效:在已保存的
.ts文件中手动删一个正在用的 import,再输一遍,看右下角是否出现灯泡 → 按Ctrl+.是否弹出 “Organize imports” 选项
Vue SFC 和 React 中的隐藏坑
某些 import 看似没调用,其实是框架隐式依赖,删了会破功能:
-
<script setup></script>里import { defineProps } from 'vue'没显式调用?别删——Volar 会识别为编译期必需 - React 中
import React from 'react'在.jsx文件里即使没写React.createElement,也不能删,否则 JSX 编译失败 -
import '@testing-library/jest-dom'这类全局扩展,VSCode 语言服务无法判断用途,source.removeUnusedImports会误删,建议加// eslint-disable-next-line import/no-unassigned-import注释绕过
真正起作用的永远是语言服务本身,不是 VSCode 界面里的某个开关;配完记得重启编辑器,且优先在 .ts 文件里验证逻辑是否通,再推广到其他类型。











