VSCode 本地调试 Serverless 必须同时满足插件(Debugger for Chrome + Serverless IDE)、CLI 参数(sls offline --debug/--inspect)和 launch.json(type: "node", request: "attach", port: 9229)三者对齐;最常见失败原因是 serverless.yml 中 functions.*.handler 路径错误或未启用调试参数。

直接上结论:VSCode 本身不支持 Serverless 本地调试,必须靠插件 + CLI 参数 + launch.json 三者对齐,缺一不可;最常失败的环节不是 VSCode 设置,而是 serverless.yml 中的 functions.*.handler 路径写错,或 sls offline 没启用 --debug(或 --inspect)。
装哪几个插件才真正有用
只装两个核心插件,其他全禁用:
-
Debugger for Chrome(或Debugger for Edge):用于 attach 到 Node.js 进程,不是调浏览器——它通过--inspect协议连sls offline启动的函数进程 -
Serverless IDE:实时校验serverless.yml里functions.hello.handler是否指向真实存在的文件,避免Cannot find module './handler'这类报错拖到sls deploy才暴露 - 禁用
Serverless Framework Extension:这个插件已过时,v3 不兼容,还会干扰slsCLI 的 PATH 查找
launch.json 必须配成 attach,不能选 launch
sls offline 是一个长期运行的服务进程,不是执行完就退出的脚本,所以 VSCode 调试器必须用 attach 模式,等函数被 HTTP 请求触发后才接入上下文。
- 配置
type: "node"、request: "attach"、port: 9229(sls offline默认端口) -
localRoot设为"${workspaceFolder}",remoteRoot填"/var/task"(Lambda 容器内路径,保持一致才能映射断点) - 如果用
serverless-offline@10+,默认禁用--inspect,得显式加参数,否则 VSCode 连不上
sls offline 启动命令必须带 --debug 或 --inspect
不加调试参数,sls offline 就只是个普通 HTTP 服务,不会暴露 V8 inspector 接口,VSCode 根本连不到。
- Node.js 函数推荐:
sls offline --debug --noAuth --port 3000 - 如果用了新版
serverless-offline(v10+),必须显式加--inspect:sls offline --inspect --noAuth --port 3000 - 断点只在函数实际执行时生效——得先发个请求(比如
curl http://localhost:3000/dev/hello),VSCode 才会捕获到调试会话
serverless.yml 里 handler 路径错一个字符就白配
本地调试失败,八成问题出在这儿,而不是 launch.json 或插件。VSCode 不会自动修正拼写,Serverless IDE 插件能高亮但不强制阻止你保存错误路径。
- 检查
functions.hello.handler值是否严格匹配文件系统路径,比如写成src/handlers/hello.handler,但实际文件是src/functions/hello.js,就会报Cannot find module - 确保
handler字段不带扩展名(如hello.js错,应为hello.handler),且导出的函数名与字段最后一段一致(hello.handler→module.exports.handler = ...) - Python 用户注意:
handler格式是index.handler(index.py里的handler函数),不是index.py::handler
最容易被忽略的一点:所有调试都依赖 sls offline 正确加载项目结构。如果你改了目录、加了 monorepo 子包、或用了自定义打包插件(如 serverless-webpack),handler 路径和 sls offline 实际加载的入口可能已经脱节——这时得看 sls offline 启动日志里打印的 “Loading function from …” 路径,再反推修正 serverless.yml。











