Serverless Framework 本地调试需装 Debugger for Chrome(用于 attach 调试 sls offline)和 Serverless IDE(校验 handler 路径与环境变量);禁用过时的 Serverless Framework Extension。

Serverless Framework 本地调试需要哪些 VSCode 插件
VSCode 本身不内置 Serverless 调试能力,必须靠插件补足断点、启动、日志联动等环节。核心就两个:Debugger for Chrome(或 Debugger for Edge)用于前端/Node.js 函数调试,Serverless IDE 提供 YAML 补全和部署校验——后者不是必须,但漏掉它,serverless.yml 里写错 handler 路径或环境变量名,直到 sls deploy 才报错,浪费时间。
常见错误现象:sls invoke local -f hello 报 Cannot find module './handler',其实是因为 VSCode 没提示路径拼写错误(比如写成 src/handlers/hello.js 但实际是 src/functions/hello.js)。
- 装
Serverless IDE后,serverless.yml中的functions.hello.handler值会实时校验是否存在对应文件 -
Debugger for Chrome不是用来调浏览器的,而是通过 Node.js 的--inspect协议连本地运行的函数进程;如果你用的是sls offline,它默认已开启调试端口 - 别装
Serverless Framework Extension—— 这个插件长期未更新,不兼容 v3,还会干扰slsCLI 的 PATH 查找
怎么让 sls offline 支持 VSCode 断点调试
sls offline 默认不启用 Node.js 调试模式,直接按 F5 调试会失败。必须手动加参数,并在 .vscode/launch.json 里对齐配置。
使用场景:你改了 hello.js,想在请求 http://localhost:3000/dev/hello 时,在 handler 函数第一行打个断点,看 event 结构或 process.env 是否加载正确。
- 启动命令改成:
sls offline --noAuth --skipCacheInvalidation --port 3000 --host 0.0.0.0 --debug(--debug是关键,它让底层的lambda-local启用--inspect) -
.vscode/launch.json必须配type: "node"+request: "attach",不能选launch;端口填9229(sls offline默认用这个) - 如果用的是
serverless-offline@10+,注意它默认禁用--inspect,得显式加--inspect参数,否则 VSCode 连不上 - 断点只在函数执行时生效,不是服务一启就停住——得先发个 HTTP 请求触发函数,VSCode 才会捕获到调试上下文
serverless.yml 里哪些配置影响本地调试成败
本地调试失败,八成问题出在 serverless.yml 配置和实际项目结构不匹配,而不是 VSCode 设置。重点盯三个字段:
-
functions.*.handler:必须指向可 require 的文件路径,且后缀明确(handler.js不能省略,handler会找不到) -
functions.*.environment:本地不会自动加载.env或 AWS SSM 参数,所有环境变量得硬编码进 YAML 或用${file(./env.yml):dev}引入——否则断点里看到的process.env.MY_API_KEY是undefined -
package.include和exclude:如果误 exclude 了node_modules里的依赖(比如axios),sls offline启动时不会报错,但函数一执行就Cannot find module 'axios'
性能影响:package.individually: true 在本地调试时几乎没好处,反而会让每次 sls offline 启动变慢(要为每个函数单独打包),开发阶段关掉它。
为什么 sls invoke local 无法进断点
因为 sls invoke local 是一次性执行,进程秒起秒灭,VSCode 来不及 attach。它适合快速验证返回值,不适合调试逻辑流。
容易踩的坑:sls invoke local -f hello --path event.json 看似方便,但如果你在 handler 里写了 console.log('start'),输出可能被 sls 自己的日志淹没,或者因 stdout 缓存根本看不到。
- 想用
invoke local调试?只能加--debug参数,再配合node --inspect-brk启动子进程,但 VSCode 不支持这种嵌套 attach,实操基本不可行 - 真正能断点的只有两种方式:一是
sls offline+ attach 模式,二是把函数抽成普通 Node.js 脚本,用node --inspect-brk index.js直接跑(适合单元测试前单步验证 handler 逻辑) - 别信网上“改
sls源码加--inspect”的方案——v3 的 CLI 是编译后的二进制,改不动
复杂点在于:离线调试和真实云环境的行为差异。比如 context.getRemainingTimeInMillis() 在 offline 下永远返回固定值,event.headers 的大小写在本地可能是小写,上云却是大写首字母——这些细节不会报错,但会让你上线后踩坑。










