remote.ssh.syncignore 必须配 **/node_modules,因其在sftp请求封装前就过滤同步事件,避免上万小文件堵塞ssh通道;双星号确保匹配所有嵌套层级,且该配置仅对remote-ssh生效,不能被files.watcherexclude替代。

为什么 remote.ssh.syncIgnore 必须配 **/node_modules
远程开发时,VSCode 默认会把本地 node_modules 目录下的每个文件变更都通过 SSH 同步到远程——哪怕你从不编辑它。一个中等规模项目里,node_modules 动辄上万个小文件,每次保存触发的同步事件会卡住整个通道,表现为终端响应延迟、热重载失灵、甚至 SSH 连接超时。
关键点在于:remote.ssh.syncIgnore 是在 VSCode 的远程代理层生效的过滤规则,它在文件变更被封装进 SFTP 请求前就丢弃掉,比 search.exclude 或 files.watcherExclude 更早介入,也更彻底。
-
**/node_modules必须带双星号前缀,否则只匹配顶层目录,子目录(如node_modules/.bin)仍会被同步 - 不能写成
node_modules/或node_modules/**—— 前者路径不匹配,后者在部分 VSCode 版本中被忽略 - 该配置只对 Remote-SSH 有效;Remote-WSL 和 Remote-Containers 需分别用
remote.WSL.syncIgnore和remote.containers.syncIgnore
remote.ssh.syncIgnore 和 files.watcherExclude 能否互相替代
不能。两者作用域完全不同:files.watcherExclude 控制的是本地 VSCode 主进程的 inotify 监听范围,影响搜索、Git 状态刷新、IntelliSense 索引;而 remote.ssh.syncIgnore 控制的是远程同步行为,只影响文件传输本身。
典型错误是只配了 files.watcherExclude,以为“本地不监听 = 不同步”,结果发现改完 package.json 后 node_modules 还是被推过去——因为 npm install 生成的新文件会触发本地保存事件,VSCode 仍会按默认策略上传所有变更文件。
- 必须同时配置两者:本地监听排除 + 远程同步排除
-
files.watcherExclude中的"**/node_modules/**": true防止 CPU 被 inotify 事件打满 -
remote.ssh.syncIgnore中的"**/node_modules"防止 SSH 通道被无效数据塞满 - Windows 用户若用 WSL2,还需额外禁用
files.useExperimentalFileWatcher,否则跨系统监听易丢事件
同步被跳过,但 npm install 后远程环境没更新怎么办
这是常见误解:remote.ssh.syncIgnore 只跳过「文件变更同步」,不跳过「命令执行」。你本地运行 npm install,VSCode 并不会把命令转发到远程执行——它只是把生成的 node_modules 文件夹一股脑传过去(除非你明确关掉上传)。
真正该做的是:把构建依赖的操作移到远程执行。
- 不要在本地跑
npm install,改用远程终端执行:npm install --no-save(避免污染本地node_modules) - 或在
.vscode/settings.json中设"terminal.integrated.profiles.linux": { "bash": { "path": "/usr/bin/bash" } },确保终端默认连远程 shell - 如果必须本地安装,可在
remote.ssh.syncIgnore中补充"**/package-lock.json"和"**/yarn.lock",避免锁文件频繁同步引发冲突 - 注意:
syncIgnore不影响uploadOnSave对源码文件的同步,只过滤指定路径
配置生效后仍看到 node_modules 在同步进度条里滚动
大概率是配置没落在正确位置,或没重启工作区。VSCode 的远程同步配置只读取当前工作区根目录下的 .vscode/settings.json,用户级设置(settings.json 全局)对 remote 扩展无效。
另一个隐蔽原因是:某些插件(比如 Docker、ESLint)会主动读取 node_modules 下的配置文件,触发 VSCode 隐式打开这些文件,进而绕过 syncIgnore 规则。
- 检查配置是否在
.vscode/settings.json里,而不是用户设置中 - 修改后必须关闭并重新打开整个工作区(不是仅重启窗口),否则 remote agent 不加载新配置
- 打开命令面板(
Ctrl+Shift+P),运行Remote-SSH: Show Log (Remote Server),搜索syncIgnore关键字确认是否被加载 - 临时禁用 ESLint、Prettier 等依赖
node_modules的扩展,观察同步行为是否改善
node_modules 从同步链路里真正“摘出来”,而不是仅仅藏在 UI 里。很多团队卡顿问题根源不在网络或硬件,而在默认行为没被显式切断。











