关于serverless:typescript-支持与本地调试

41次阅读

共计 3399 个字符,预计需要花费 9 分钟才能阅读完成。

typescript 反对与本地调试

  • typescript 反对与本地调试

    • 前言
    • 反对 typescript
    • 函数的本地调试

      • 启用 node-terminal 调试
      • invoke local
      • serverless-offline
    • Next Chapter
    • 残缺示例及文章仓库地址

前言

在上一章节,咱们创立了一个 hello world 函数,并把它顺利的部署到了 AWS 云上。然而真正上生产的函数我的项目必定不会这么简略。

对于一个古代的 nodejs 我的项目来说,咱们还有许多的需要:

比方咱们也更想应用 typescript 来进行开发,还有咱们也须要在本地搭建一套残缺的模仿环境,来对咱们编写的代码进行调试和测试。

比方咱们要增加对应的单元测试和 CI/CD

又或者是咱们的函数外面,各种第三方的依赖项的解决,js 相干的还好,然而其余那些和平台绑定的 二进制文件,又或者是内置的 .xdb 等等一些数据文件,应该如何解决呢?请听我娓娓道来.

反对 typescript

咱们想要用 ts 来编写函数进行调试和部署,侥幸的是 serverless 为咱们提供了开箱即用的插件:

  1. serverless-plugin-typescript, 这是由 serverless 官网保护的 ts 反对计划,举荐应用
  2. 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 代码,而后打入将被上传的压缩包里。

打包后,你能够在你配置的 tsconfigoutDir 目录下,找到编译生成的后果,并进行校验。

函数的本地调试

咱们本地环境,去调试编写的云函数,比拟不便的做法,次要有 2 种:

  1. 一种为执行 sls invoke local -f <function name> -d/-p ... 进行间接调试
  2. 另外一种为通过 serverless-offline 插件,在本地构建出模仿的 lambdaapi 网关环境 进行调试,显然这种调试形式非常适合 web 服务。

留神,因为整个我的项目是 typescript 编写的,而理论运行却是 js 文件,所以你编译时,必须关上 sourcemap 选项能力命中到 ts源码里的断点,不然只能把断点命中到 .build/.esbuildjs 产物的代码。

启用 node-terminal 调试

这个形式很简略,因为 node-terminal 开箱即用的,

  1. 一种办法,咱们间接在 vscode 下方的终端窗口,点击加号旁边的下拉 icon,增加 JavaScript 调试终端,而后再cd 到目标目录中,执行对应的调试 npm script 即可。
  2. 另外一种办法是利用 .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 localserverless-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 插件是在本地模拟出一个 lambdaAPI 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 给我

正文完
 0