禁用(工作区)后插件仍在内存运行是因vscode激活机制:插件一旦响应activationevent(如打开.py文件)即常驻extension host,直至窗口完全关闭;仅禁用或重载无效,必须彻底关窗重开才能清理。

为什么禁用(工作区)后插件还在内存里跑
点了 Disable (Workspace),插件图标变灰、设置里也显示已禁用,但 code --status 查 Extension Host 进程,ps -p [pid] -o args= 仍能看到 gitlens 或 pyright 的路径——这不是 UI 欺骗你,是 VSCode 插件激活机制的固有行为:一旦插件响应了某个 activationEvent(比如打开 .py 文件触发 Python 扩展),它就会在 Extension Host 进程中常驻,直到整个窗口关闭。
仅靠点击禁用或重载窗口(Developer: Reload Window)无法清理该进程。必须彻底关闭当前窗口(macOS 还要退出菜单栏图标),再用 code . 重新打开该文件夹,才能让 Extension Host 以干净状态启动。
- 验证是否生效:先记下
code --status输出的 Extension Host PID,关窗重开后再比对ps -p [pid] -o args=输出,目标插件名不应出现 -
Disable (Global)和Disable (Workspace)是两种完全不同的操作,前者写入用户级设置,后者才写入.vscode/settings.json,别选错 - 某些插件(如 GitLens)会监听全局文件系统事件,即使被禁用,也可能因早期激活残留行为;最稳方案仍是配合 Profile 使用
用 Profile 实现真隔离:VSCode 1.84+ 唯一可靠方案
Profile 不是“增强版工作区”,而是独立实例:每个 Profile 拥有自己的一套已安装扩展列表、设置、快捷键、代码片段,互不共享、互不干扰。这才是解决“前端项目用 Prettier + ESLint,后端项目用 Black + Ruff”的正解。
创建和绑定流程极简:
- 命令面板输入
Profile: Create Profile,命名如frontend-react或backend-go - 打开目标项目文件夹 → 左下角点击 Profile 名 →
Apply Profile to Folder - 下次直接双击该文件夹,VSCode 自动加载对应 Profile,无需手动切换
注意:Profile 不同步已安装扩展状态。首次应用时,需手动启用该 Profile 下所需的插件(例如 esbenp.prettier-vscode),否则即使插件已装,也不会出现在当前 Profile 的扩展列表中。
settings.json 中 extensions.disabled 怎么写才有效
.vscode/settings.json 里的 extensions.disabled 是目前最常用的工作区级禁用方式,但它只控制“是否加载”,不控制“是否安装”。只要插件已装,且没被明确禁用,就可能在打开文件时被激活。
正确写法示例:
{
"extensions.disabled": [
"bradlc.vscode-tailwindcss",
"redhat.vscode-yaml",
"ms-azuretools.vscode-docker"
]
}
- 扩展 ID 必须写全称,可在扩展详情页 URL 或
Extensions: Show Installed Extensions命令中复制,如esbenp.prettier-vscode - 不要用
extensions.enabled: false—— 这会禁用所有扩展,包括你真正需要的 -
extensions.experimental.affinity字段虽能设为1表示“仅在此工作区启用”,但属内部机制,未公开支持,VSCode 版本一更新就可能失效 - 多根工作区(
.code-workspace)同样支持extensions.disabled,且设置优先级高于单文件夹工作区
.vscode/extensions.json 只能推荐,不能禁用
很多人误以为 .vscode/extensions.json 能强制禁用插件,其实它只是个“提示清单”:团队成员打开项目时,VSCode 会弹出推荐安装列表,也会隐藏 unwantedRecommendations 里的插件推荐,但对已安装插件零约束力。
比如你本地装了 50 个插件,项目 extensions.json 只写了 3 个 recommendations,那其余 47 个照常尝试激活——尤其像 eamodio.gitlens 这类监听 fs 事件的插件,一打开文件夹就拉起进程,根本不管推荐列表。
- 它适合新人引导和团队规范统一,不适合解决运行时冲突
- 若想靠它“隔离”,结果往往是:推荐没起作用,冲突照旧发生
- 真正要隔离,必须回到
Disable (Workspace)+ 关窗重开,或直接上Profile
Profile 创建后不会自动继承你现有的插件安装,得一个个手动启用;而 Disable (Workspace) 看似简单,但漏掉关窗这一步,就等于白设。这两个点,最容易被跳过。











