必须用 node-terminal 启动调试,因 vite 开发服务器不提供 chrome 调试协议入口,pwa-chrome 仅支持客户端 js,无法调试服务端逻辑且易因 sourcemap 错位导致断点失效。

必须用 node-terminal 启动调试,不能直接连 Chrome;否则断点进不了 <script></script> 块,也抓不到服务端逻辑。
为什么 type: "pwa-chrome" 在 SvelteKit 里基本失效
这不是配置写错了,而是 Vite 开发服务器本身不提供可直连的 Chrome 调试协议入口。SvelteKit 的客户端代码走的是 Vite 的 HMR + sourcemap 链路,服务端(如 +server.ts)跑在 Node 进程里——两者根本不在同一个调试上下文里。pwa-chrome 只能看浏览器侧 JS,对服务端完全无感,且容易因跨域、file:// 协议或 sourcemap 路径错位导致断点漂移或静默失效。
-
url字段即使填了"http://localhost:5173",pwa-chrome也拿不到服务端源码映射 - Vite 默认不启用
devtools的远程调试开关,pwa-chrome连不上底层 Node 实例 - 如果你看到断点停在空白行、或 F5 后控制台没反应,八成是误用了这个 type
type: "node-terminal" 怎么配才真正生效
这是目前最稳的方案:让 VSCode 启一个带调试能力的终端,把 npm run dev 放进去跑,所有源码(客户端 .svelte、服务端 +server.ts)都能设断点命中。
- 确保
launch.json中"type": "node-terminal",不是"pwa-node"或旧版"node" -
"command": "npm run dev"必须完整,不能简写为"dev"—— VSCode 不会自动读取package.json的 script 别名 - 不要加
"runtimeExecutable",它会绕过 npm 的环境变量注入,导致NODE_OPTIONS失效 - 如果项目用了
@sveltejs/adapter-node并启了服务端渲染,这个配置同样适用,断点会自然落到handle或load函数里
断点进不去 <script></script>?检查这三处 sourcemap 映射
VSCode 能否“看见”你写的那行 $: doubled = count * 2,取决于 sourcemap 是否被正确解析并映射回 src/ 下的真实文件。Vite 默认生成的 sourcemap 路径前缀仍是 webpack:///src/,但实际路径是 src/ —— 不手动对齐,调试器就只能猜。
-
"sourceMapPathOverrides": {"webpack:///src/*": "${webRoot}/src/*"}是基础项,漏掉就找不到源码 -
"resolveSourceMapLocations": ["${workspaceFolder}/**", "!**/node_modules/**"]是 Svelte 5+ 必填项,不加则.svelte文件里的 JS 区域永远无法命中 -
"webRoot": "${workspaceFolder}/src"必须显式指定,它是所有路径映射的根,不是可选默认值
调试前必须确认的三个状态
少一个,F5 就白按:
- 右下角语言模式显示的是
Svelte,不是HTML或Plain Text;点它 → 选Svelte→ 齿轮图标 → 勾选 “Always use Svelte for '.svelte' files” - 项目根目录存在
svelte.config.js(哪怕只写export const config = {}),否则语言服务不激活,$:和export let全部无提示,调试信息残缺 - 执行过
Cmd+Shift+P→Svelte: Restart Language Server;仅 Reload Window 不够,TS 缓存会卡住旧配置
最容易被忽略的是 resolveSourceMapLocations —— 它不像 sourceMapPathOverrides 那样常被复制粘贴,但在 Svelte 5+ 的调试链路里,它才是决定 VSCode 能不能“看见”你写的那行响应式声明的关键开关。











