typescript 支持与本地调试

news2024/12/23 13:35:05

Image

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 给我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/974618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用「渣男」心态去面试,爽翻!

转载自博学谷公众号&#xff01; 面试是一场“销售”自己的考试&#xff0c;很多程序员掌握的技术、知识都非常过关&#xff0c;但在面试中却不能完全展现出来&#xff0c;屡屡发挥失常。 同样是天选打工人 别人的offer&#xff0c;像猴子摘苞谷&#xff0c;应接不暇 而你的of…

双亲委派机制的作用

文章目录 类加载过程一、java有哪些类加载器&#xff1f;二、双亲委派机制自定义String类 总结 类加载过程 先简单说一下java的类加载器 类加载器&#xff0c;顾名思义就是一个可以将Java字节码加载为java.lang.Class实例的工具。这个过程包括&#xff0c;读取字节数组、验证…

喜讯!Cancer Res(IF:11.2)发表胃癌PICH的转录调控机制

2023年8月30日&#xff0c;兰州大学第二医院焦作义教授团队在肿瘤学Top期刊Cancer Research&#xff08;IF:11.2&#xff09;发表“PICH activates Cyclin A1 transcription to drive S-phase progression and chemoresistance in gastric cancer”的研究论文。该研究鉴定了SNF…

框架分析(9)-Hibernate

框架分析&#xff08;9&#xff09;-Hibernate 专栏介绍Hibernate特性对象关系映射&#xff08;ORM&#xff09;数据库连接和事务管理查询语言&#xff08;HQL&#xff09;缓存机制透明的持久化操作对象的延迟加载事务管理 优缺点优点简化数据库操作跨数据库平台高度可定制性缓…

设置 Hue Server 与 Hue Web 界面之间的会话超时时间

设置 Hue Server 与 Hue Web 界面之间的会话超时时间 在 CDH 的 Hue 中&#xff0c;Auto Logout Timeout 参数表示用户在不活动一段时间后将自动注销&#xff08;登出&#xff09;的超时时间。当用户在 Hue 中处于不活动状态超过该设定时间时&#xff0c;系统将自动注销用户&am…

深度学习入门教学——代价敏感学习

1、背景 常用于分类器性能评估的指标为&#xff1a;准确率或错误率&#xff0c;也就是代价不敏感学习。【注】代价&#xff1a;一个类别被错误分类到其他类别的惩罚&#xff08;也称为权重&#xff09;。代价不敏感学习的前提是&#xff1a; 不同类的误分类代价相同。用于学习…

【力扣周赛】第 112 场双周赛

文章目录 竞赛链接Q1&#xff1a;7021. 判断通过操作能否让字符串相等 IQ2&#xff1a;7005. 判断通过操作能否让字符串相等 II&#xff08;贪心&#xff09;Q3&#xff1a;2841. 几乎唯一子数组的最大和竞赛时代码——滑动窗口 Q4&#xff1a;8050. 统计一个字符串的 k 子序列…

小白学go基础05-变量声明形式

和Python、Ruby等动态脚本语言不同&#xff0c;Go语言沿袭了静态编译型语言的传统&#xff1a;使用变量之前需要先进行变量的声明。 变量声明形式使用决策流程图 这里大致列一下Go语言常见的变量声明形式&#xff1a; var a int32 var s string "hello" var i 13 …

C# void 关键字学习

C#中void关键字是System.Void的别名&#xff1b; 可以将 void 用作方法&#xff08;或本地函数&#xff09;的返回类型来指定该方法不返回值&#xff1b; 如果C&#xff03;方法中没有参数&#xff0c;则不能将void用作参数&#xff1b;这是与C语言不同的&#xff0c;C语言有…

附录2-将三国演义按章节存储为不同的txt(bs4)

地址 《三国演义》全集在线阅读_史书典籍_诗词名句网 目录 1 项目分析 2 代码 1 项目分析 我们可以在首页中找到所有的章节 每一个章节是一个a标签&#xff0c;a标签连接到该章节的内容 但这个网站他有bug&#xff0c;章节都是乱套的&#xff0c;我们无视这种错误&#…

Python通过Socket操作RFID设备-盘点功能

项目介绍&#xff1a;根据这么多年的IT经验&#xff0c;需求通过与用户沟通发现的&#xff0c;机会也是这样出来的。仓库的小伙子跟我倒苦水&#xff0c;动不动实物盘点&#xff0c;几千颗物料&#xff0c;都忙疯了&#xff0c;而且&#xff0c;新的物料一入库&#xff0c;作为…

基于Matlab分析的电力系统可视化研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

什么是专线网络?互联网专线为什么贵

宽带主要分为专线和家庭宽带。一般来说&#xff0c;企业服务器和云服务提供商通常使用专线宽带&#xff0c;普通家庭接入家庭宽带。 什么是专线网络&#xff1f; 专线是指依托国内骨干网络和宽带城市网络资源&#xff0c;为企业集团客户提供专线接入方式互联网城市互联网&…

WebDAV之π-Disk派盘 + 无忧日记

无忧日记,生活无忧无虑。 给用户专业的手机记录工具,用户可以很轻松地通过软件进行每天发生事情的记录,可以为用户提供优质的工具与帮助,用户还可以通过软件来将地理位置,天气都记录在日记上,用户也可以通过软件来进行图片的导入,创建长图日记, 心情报表:用户写日记…

企业架构LNMP学习笔记14

默认官方模块&#xff1a; Gzip压缩&#xff1a; 压缩文件&#xff0c;使文件变小了&#xff0c;传输更快了&#xff0c;目前大部分市场浏览器都支持Gzip。 传输的时候省流量。 目的是为了提高用户的加载速度。 #开启gzip压缩 gzip on; #http协议版本 gzip_http_version 1.0…

css之层叠上下文

之前调元素的显示优先级时&#xff0c;只会默默的调z-index以达到效果&#xff0c;但有时不生效&#xff0c;又不知道根因。刚好详细了解到层叠上下文&#xff0c;可以解释此类问题。 什么是层叠上下文&#xff1f; 在CSS2.1规范中&#xff0c;每个盒模型的位置是三维的&…

智能电网时代:数字孪生的崭露头角

随着科技的不断进步&#xff0c;数字孪生已经开始在电力行业崭露头角&#xff0c;为这个关键的行业带来了前所未有的机遇和潜力。本文就带大家了解一下数字孪生在哪些方面为电力行业做出改变&#xff0c;以及未来的创新应用。 首先&#xff0c;数字孪生可以提高电力系统运营效率…

Mysql事务及锁

一、MVCC原理 1.1 版本链 trx_id &#xff1a;每次一个事务对某条聚簇索引记录进行改动时&#xff0c;都会把该事务的 事务id 赋值给 trx_id 隐藏列。 roll_pointer &#xff1a;每次对某条聚簇索引记录进行改动时&#xff0c;都会把旧的版本写入到 undo日志 中&#xff0…

木棒切割问题

题目很简单&#xff0c;就是我们在写二分的时候&#xff0c;会遇到这样的情况&#xff1a; mid left (right-left)/2; if (nums k)return mid;if (nums>k)left mid;if (nums<k)right mid-1; 若我们debug会发现其可能会一致卡在left mid&#xff0c;例如&#xff08…

ceph Monitor原理和代码流程介绍

Monitor介绍 Monitor在Ceph集群中扮演管理者的角色&#xff0c;维护了整个集群的状态&#xff0c;集群的状态被抽象成几个Map对象&#xff0c;包括monmap、osdmap、mdsmap、authmap、logmap等&#xff0c;保证集群的相关组件在同一时刻能够达成一致&#xff0c;相当于领导层。…