vscode 保存时自动删除未使用 import 需启用 editor.codeactionsonsave 并设 "source.organizeimports": true;该功能非格式化或 typescript 自动行为,而是原生 code action,依赖语言服务正常工作及正确配置(如 tsconfig.json/jsconfig.json)。

VSCode 保存时自动删除未使用 import 的核心配置项
必须启用 editor.codeActionsOnSave 并显式开启 source.organizeImports,仅靠格式化或 ESLint 插件默认不会删 import。
关键点在于:这个动作不是“格式化”的一部分,也不是 TypeScript 自动行为,而是 VSCode 原生支持的代码操作(Code Action),需手动打开。
常见错误是只配了 editor.formatOnSave,结果保存后缩进变了、分号加了,但 import React from 'react' 这种没用的依然纹丝不动。
- 在 VSCode 设置中搜索
codeActionsOnSave,点击「Edit in settings.json」 - 添加如下配置(注意是对象,不是布尔值):
"editor.codeActionsOnSave": { "source.organizeImports": true } - 如果同时想删未使用变量,可额外加
"source.removeUnusedVariables": true,但该功能仅对 TypeScript/JavaScript 文件有效,且依赖语言服务稳定性
不同语言文件的行为差异
source.organizeImports 在 .ts/.tsx 文件中由 TypeScript 语言服务驱动,效果稳定;在 .js/.jsx 中依赖 JS 语言服务 + JSDoc 或类型注解,可能漏删或误删。
比如纯 import { foo } from './utils' 但 foo 全局没被调用,在 .js 文件里大概率不触发删除;换成 import { foo } from './utils'; console.log(foo); 就能正常识别并保留。
- TypeScript 文件:基于类型检查,删得准
- JavaScript 文件:依赖 AST 分析,无类型信息时保守处理,常跳过删除
- Vue 单文件组件(
.vue):需安装Volar插件并确保启用了typescripts.suggest.autoImports相关设置,否则<script setup></script>中的 import 不会被组织
和 ESLint / Prettier 冲突导致不生效
如果装了 ESLint 插件并开启了 eslint.enable,且配置了 editor.codeActionsOnSave 同时包含 source.fixAll.eslint,那么 VSCode 可能按顺序执行多个操作——而 ESLint 的 fix 阶段若先跑,会覆盖 organizeImports 的结果。
典型现象:保存后 import 排序了,但没删;或者删了一半又加回来。
- 优先级建议:只留
"source.organizeImports": true,暂时关掉"source.fixAll.eslint" - 如必须共存,把 ESLint 配置里的
unused-imports/no-unused-imports规则设为error,再配合eslint.run: onType实时提示,比保存时强删更可控 - 确认 ESLint 插件版本 ≥ 2.4.0,旧版不兼容 VSCode 1.8x 后的 Code Action 执行机制
为什么改了配置还是不删?检查这三处
配置写对了,但 import 就是岿然不动,八成卡在这几个实际运行条件上。
- 当前文件没被语言服务正确识别:看右下角状态栏,确认显示的是
TypeScript或JavaScript,而不是Plain Text或JSON - 文件有语法错误(哪怕只是少个括号):TS/JS 语言服务会停摆,
organizeImports直接跳过 - 项目根目录缺少
tsconfig.json(TS)或jsconfig.json(JS):没有配置文件,语言服务无法解析模块路径,import 组织逻辑失效
尤其容易被忽略的是 jsconfig.json 的缺失——哪怕你只写 JS,也建议建一个最简配置:
{ "compilerOptions": { "module": "esnext" }, "include": ["**/*.js"] },不然连相对路径的 import 都可能被当成外部包处理。











