typescript 反对与本地调试
-
typescript 反对与本地调试
- 前言
- 反对
typescript
-
函数的本地调试
- 启用 node-terminal 调试
- invoke local
- serverless-offline
- Next Chapter
- 残缺示例及文章仓库地址
前言
在上一章节,咱们创立了一个 hello world
函数,并把它顺利的部署到了 AWS
云上。然而真正上生产的函数我的项目必定不会这么简略。
对于一个古代的 nodejs
我的项目来说,咱们还有许多的需要:
比方咱们也更想应用 typescript
来进行开发,还有咱们也须要在本地搭建一套残缺的模仿环境,来对咱们编写的代码进行调试和测试。
比方咱们要增加对应的单元测试和 CI/CD
又或者是咱们的函数外面,各种第三方的依赖项的解决,js
相干的还好,然而其余那些和平台绑定的 二进制文件
,又或者是内置的 .xdb
等等一些数据文件,应该如何解决呢?请听我娓娓道来.
反对 typescript
咱们想要用 ts
来编写函数进行调试和部署,侥幸的是 serverless
为咱们提供了开箱即用的插件:
serverless-plugin-typescript
, 这是由serverless
官网保护的ts
反对计划,举荐应用serverless-esbuild
,这是第三方编写的,应用esbuild
去编译ts
代码的计划
当然,除了插件计划之外,当然也有非
serverless
插件的传统打包计划,即间接应用tsc
或者webpack/rollup/esbuild
又或者进一步封装的tsup/unbuild
等等这些工具,间接构建出dist
产物,而后sls deploy
间接部署dist
里代码文件的计划。这个传统打包计划,咱们下一篇文章《serverless nodejs 我的项目打包最佳实际》会具体介绍。
这些插件的用法非常简单,咱们只须要在装置它们之后,再把它们注册进你的 serverless.yml
文件中就能够了。
比方 serverless-plugin-typescript
, 咱们先装置 npm i -D serverless-plugin-typescript
而后在 serverless.yml
中注册:
# 注册插件,传入一个数组
plugins:
- serverless-plugin-typescript
# 插件传入的 options 都在这个字段下
custom:
# 能够不传值,不传默认值见 https://www.npmjs.com/package/serverless-plugin-typescript
serverlessPluginTypescript:
tsConfigFileLocation: "./tsconfig.build.json"
接下来执行 sls packge
命令 (sls deploy
的前置打包成压缩包步骤),插件就会本人去找当前目录下的 tsconfig.build.json
(下面 tsConfigFileLocation
指定的门路)配置,去编译 ts
代码,而后打入将被上传的压缩包里。
打包后,你能够在你配置的 tsconfig
里 outDir
目录下,找到编译生成的后果,并进行校验。
函数的本地调试
咱们本地环境,去调试编写的云函数,比拟不便的做法,次要有 2
种:
- 一种为执行
sls invoke local -f <function name> -d/-p ...
进行间接调试 - 另外一种为通过
serverless-offline
插件,在本地构建出模仿的lambda
和api 网关环境
进行调试,显然这种调试形式非常适合web
服务。
留神,因为整个我的项目是
typescript
编写的,而理论运行却是js
文件,所以你编译时,必须关上sourcemap
选项能力命中到ts
源码里的断点,不然只能把断点命中到.build/.esbuild
里js
产物的代码。
启用 node-terminal 调试
这个形式很简略,因为 node-terminal
开箱即用的,
- 一种办法,咱们间接在
vscode
下方的终端窗口,点击加号旁边的下拉icon
,增加JavaScript 调试终端
,而后再cd
到目标目录中,执行对应的调试npm script
即可。 - 另外一种办法是利用
.vscode/launch.json
去保护咱们的调试脚本,同时在vscode debug
界面进行调试。
配置相似于下方:
{
"version": "0.2.0",
"configurations": [
{
"command": "npm run invoke:local",
"name": "[hello-world] invoke local",
"request": "launch",
"type": "node-terminal",
"cwd": "${workspaceFolder}/apps/hello-world"
},
{
"command": "npm run offline",
"name": "[hello-world] offline",
"request": "launch",
"type": "node-terminal",
"cwd": "${workspaceFolder}/apps/hello-world"
}
]
}
下方章节的 invoke local
和 serverless-offline
都间接应用上述的 vscode
配置示例进行调试。
invoke local
sls invoke local -f <function name> -d/-p ...
这个命令是间接调用本地函数进行调试.
其中 function name
是函数名,也就是咱们在 serverless.yml
中注册的名字。
前面加的 -d/-p
用来管制传入的 event
对象。
-d
是 --data
的缩写,代表间接把跟在前面的字符串作为 json
传入函数进行调用。
而 -p
(--path
的缩写)其实性能相似,不过 -p
是传入一个 json
文件的门路作为参数,读取之后传入函数进行调用,所以我更举荐应用 -p
。
serverless-offline
serverless-offline
插件是在本地模拟出一个 lambda
和 API Gateway
的环境进行部署,再起一个 http server
监听端口,这样来进行调试。
这种调试办法,其实和咱们调试 express/koa
我的项目是十分相似的。不同的是,咱们的路由不在咱们的代码里进行注册,而在于 serverless.yml
里函数对应网关的配置。
serverless-offline
插件注册也十分的简略:
# 注册插件
plugins:
- serverless-offline
custom:
# 批改配置项
serverless-offline:
noPrependStageInUrl: true
noAuth: true
注册实现之后,应用 sls offline
命令,即可启动,看到:
Offline [http for lambda] listening on http://localhost:3000
Function names exposed for local invocation by aws-sdk:
* hello: aws-http-api-ts-dev-hello
┌─────────────────────────────────────────────────────────────────────────┐
│ │
│ GET | http://localhost:3000/ │
│ POST | http://localhost:3000/2015-03-31/functions/hello/invocations │
│ │
└─────────────────────────────────────────────────────────────────────────┘
Server ready: http://localhost:3000 🚀
呈现上述后果,代表曾经启动实现,此时它的调试也只须要像咱们调试 express/koa/nest
那样,间接在 vscode
里打断点,即可命中。
Next Chapter
当初你曾经学会了如何在本地调试代码和用 typescript
来编写函数了。
下一篇,《依赖项的解决与层的创立与注册》中,将会具体解释依赖项的解决,欢送浏览。
残缺示例及文章仓库地址
https://github.com/sonofmagic/serverless-aws-cn-guide
如果你遇到什么问题,或者发现什么勘误,欢送提 issue
给我