Node v18.15+、官方脚手架初始化、svelte.config.js与tsconfig.json配对三者缺一不可,否则VSCode无法正确识别Svelte文件类型、提示和断点调试。

装对 Node、用 npm create svelte@latest 初始化项目、配好 svelte.config.js 和 tsconfig.json,三者齐备才能让 VSCode 正确识别 Svelte 文件——缺一个,$: 就没提示,export let 就没类型,$lib 就标红。
Node 版本和 npm 镜像必须先搞定
VSCode 本身不管理 Node,它依赖系统已安装的 Node 环境。SvelteKit(尤其是 Vite 构建层)在 Node v18.15+ 上最稳,v20+ 也可用,但别用 v16 或更低版本——npm create svelte@latest 可能直接报错或生成残缺配置。
- 终端运行
node -v和npm -v确认版本;若未安装,推荐用nvm管理,避免全局污染 - 国内用户务必设淘宝镜像:
npm config set registry https://registry.npmmirror.com - 执行
npm config ls查看registry是否已生效,否则后续create命令可能卡住或拉取失败
必须用官方脚手架初始化,不能手动建 .svelte 文件
手动新建 App.svelte 并写几行代码,VSCode 会把它当 HTML 处理——右下角状态栏显示 “HTML” 就是铁证。这不是插件没装,而是项目缺乏启动语言服务的锚点。
- 在空目录执行:
npm create svelte@latest my-app,按提示选 TypeScript、Eslint、Prettier 等(选“否”也行,但至少确保生成svelte.config.js) - 进项目:
cd my-app && npm install,此时根目录已有svelte.config.js(哪怕内容是空对象export const config = {}) - 打开该文件夹为 VSCode 工作区,不要只打开单个 .svelte 文件
svelte.config.js 和 tsconfig.json 必须同时存在且配对
VSCode 的 Svelte 插件靠 svelte.config.js 激活语言服务;TypeScript 服务靠 tsconfig.json 加载 svelte 类型定义。两者脱节,$state、$derived、$lib 全部失效。
-
svelte.config.js中若用 TypeScript,必须启用预处理器:preprocess: vitePreprocess()(SvelteKit 项目)或sveltePreprocess({ typescript: true })(纯 Svelte + Vite) -
tsconfig.json的compilerOptions至少含:"types": ["svelte"]、"baseUrl": "."、"paths": { "$lib/*": ["src/lib/*"] } -
include字段必须覆盖.svelte文件:"include": ["src/**/*"],不能只写["src/**/*.ts"] - 改完任一配置后,必须执行
Cmd+Shift+P → Svelte: Restart Language Server,仅 Reload Window 不够
调试断点进不了 <script> 块?不是代码问题,是 sourcemap 映射断了
断点停在空白行、或根本不停,90% 是 VSCode 找不到源码位置。Vite 输出的 sourcemap 路径是 webpack:///src/App.svelte 这种格式,而实际文件在 src/App.svelte ——中间差了一层映射。
- 确保
launch.json中有这两项:"sourceMapPathOverrides": {"webpack:///src/*": "${webRoot}/src/*"}和"resolveSourceMapLocations": ["${workspaceFolder}/**", "!**/node_modules/**"] -
"webRoot"设为"${workspaceFolder}/src","url"必须是"http://localhost:5173"(Vite 默认端口) - 必须先运行
npm run dev,再按 F5 启动调试;浏览器地址栏必须是http://localhost:5173,file://协议下 sourcemap 完全无效 - 别用 Live Server 插件跑 Svelte 应用——它绕过 Vite 构建,没有 sourcemap,断点必然失效
最容易被忽略的是 resolveSourceMapLocations 字段,它不像 sourceMapPathOverrides 那样常被复制粘贴,但在 Svelte 5+ 环境中,漏掉它,VSCode 就“看不见”你写的那行 $: doubled = count * 2。


















