需结合TypeScript语义高亮与ESLint配置:启用typescript.preferences.unusedVariables、安装@typescript-eslint/eslint-plugin并配置no-unused-vars规则,同时确保tsconfig.json有效且Volar已Take Over;纯defineProps运行时写法无法被静态分析。

Vue 项目里怎么发现未使用的变量和死代码
Vue 单文件组件中,defineProps、defineEmits、ref、computed 声明了但没被引用,VSCode 默认不标灰、也不报错——这不是 VSCode 的问题,而是语言服务没把“未使用”纳入检查范围。真正起作用的是 TypeScript + ESLint 的组合,Volar 只负责类型推导,不负责“用没用”。
- 必须启用
typescript.preferences.unusedVariables(仅限 TS 文件,对<script setup>中的顶层声明有效) -
defineProps<{}>()的泛型字段若未在模板或脚本中访问,ESLint 的@typescript-eslint/no-unused-vars才会捕获(需正确配置 parser 和插件) -
<template>中绑定的{{ unusedRef }}或v-if="unusedComputed",靠的是 Volar 的模板语义分析,但只在开启"volar.template.strict": true时才触发警告 - 纯 JS 的 Vue 2 项目(无 TS),
no-unused-vars规则默认不检查data()返回对象里的属性,得手动加/* eslint no-unused-vars: ["error", { "argsIgnorePattern": "^_" }] */注释绕过
为什么 ESLint 没标出 defineProps 里没用的字段
常见现象:写了 defineProps<{ a: string; b: number }>(),但模板里只用了 a,b 却不标灰、也不报错。根本原因是 ESLint 默认把 defineProps 当作普通函数调用,不解析其泛型参数语义。
- 必须安装并启用
@typescript-eslint/eslint-plugin,且在.eslintrc.cjs中启用@typescript-eslint/no-unused-vars - 确保
parserOptions.project指向有效的tsconfig.json,否则泛型无法被解析 -
defineProps的参数如果是运行时对象写法(如defineProps({ a: String })),ESLint 完全无法分析——这种写法天生逃逸静态检查 - Volar 的
vue/no-unused-properties规则只针对 Options API 的props选项,对defineProps无效
如何让未使用 ref/computed 在编辑器里变灰
VSCode 本身不提供“未使用变量灰显”能力,这个功能来自 TypeScript 语言服务的 semantic highlighting,但前提是它得知道哪些是“未使用”。而 Vue 的响应式声明(ref、computed)需要 Volar 和 TS 协同标注。
使用 `@ainative/vue-sdk` 为 Vue 3 应用添加 AI 聊天功能。适用于以下场景:(1) 安装 `@ainative/vue-sdk`,(2) 在 Vue 组件中使用 `useChat` 组合式函数,(3) 提供……
- 确认已启用
"editor.semanticHighlighting.enabled": true(默认开启) - 确保
tsconfig.json中没有"skipLibCheck": true,否则@vue/reactivity类型定义被跳过,ref返回值类型丢失,TS 就无法判断是否被读取 -
const foo = ref(1)后只写了foo.value = 2,但没读取foo.value,TypeScript 不认为这是“未使用”——因为赋值本身就算一次使用 - 真正能标灰的是纯声明+无任何读写操作的变量,比如
const bar = 123然后整文件再没出现bar;但ref和computed因为有副作用(响应式追踪),TS 默认放宽判定
别指望 Prettier 或 Volar 自动删死代码
Prettier 是格式化工具,不分析语义;Volar 是语言服务器,不执行代码清理。所谓“自动删除未使用导入”或“一键移除死代码”,目前 VSCode 生态里不存在安全可靠的实现方式。
立即学习“前端免费学习笔记(深入)”;
- ESLint 的
--fix可以自动删掉未使用的import,但对defineProps字段、ref声明完全无能为力 - 有些插件(如
unused-imports)声称支持 Vue,实际只处理import行,对<script setup>内部声明无效 - 手动删之前务必确认:该变量是否被
v-for、onMounted回调、或跨组件通信(如provide/inject)间接使用——这些路径 ESLint 和 TS 都难以覆盖 - 最稳妥的做法仍是结合
git grep全局搜索变量名,再人工判断上下文
真正容易被忽略的点是:即使所有配置都对,首次打开大型 Vue 项目时,Volar + TS 服务可能需要 5–10 秒完成初始化,期间“未使用”提示不会出现。别急着关窗口,等右下角状态栏显示 Volar (Take Over) 且 CPU 占用回落再观察。

















