当前位置: 首页 > news >正文

typescript 支持与本地调试

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-typescriptserverlessPluginTypescript: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-offlinecustom:
# 修改配置项serverless-offline:noPrependStageInUrl: truenoAuth: 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 给我

相关文章:

typescript 支持与本地调试

typescript 支持与本地调试 typescript 支持与本地调试 前言支持 typescript函数的本地调试 启用 node-terminal 调试invoke localserverless-offline Next Chapter完整示例及文章仓库地址 前言 在上一章节&#xff0c;我们创建了一个 hello world 函数&#xff0c;并把它顺…...

后端面试话术集锦第 十八 篇:JVM面试话术

这是后端面试集锦第十八篇博文——JVM面试话术❗❗❗ 1. 介绍下JVM JVM主要包括:类加载器(class loader)、执行引擎(exection engine)、本地接口(native interface)、运行时数据区(Runtimedata area) 类加载器:加载类文件到内存。Class loader只管加载,只要符合文件…...

“历久弥新 | 用AI修复亚运珍贵史料”活动震撼来袭!

时隔近半个世纪&#xff0c;新中国第一次参与亚运会的影像资料将首次对外披露。只是年代久远&#xff0c;老照片老视频都有了岁月痕迹&#xff0c;画面不再清晰&#xff0c;这些珍贵史料急需你的帮助&#xff01; 一、活动介绍 2023年&#xff0c;正值亚运110周年&#xff0c…...

uni-app 之 scroll-view和swiper

uni-app 之 scroll-view和swiper <!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--> <template><view><navigator url"/pages/home/home"><button style"background: #ff00f…...

Harmony网络请求工具类

使用的网络请求框架是axios 1、安装axios ohpm install @ohos/axios2、封装 import axios, { FormData } from "@ohos/axios" import fs from @ohos.file.fs import ArrayList from @ohos.util.ArrayList/*** 网络请求工具类*/ class HttpManager {baseUrl:string…...

【Python 自动化】自媒体剪辑第一版·思路简述与技术方案

大家都知道我主业是个运维开发&#xff08;或者算法工程师&#xff09;&#xff0c;每天时间不多&#xff0c;但我又想做自媒体。然后呢&#xff0c;我就想了个方案&#xff0c;每天起来之后写个短视频的脚本&#xff0c;包含一系列图片和文字&#xff0c;然后上班的时候给它提…...

【前端】webpack打包去除console.log

0 问题 需要在打包的时候&#xff0c;自动地去除掉所有console.log 1 方法 // vue.config.js //... module.exports {//...config.optimization.minimizer[0].iptions.terserOptions.compress.drop_console true//... } //...也可以用if(process.env.NODE_ENV production…...

docker使用(二)提交到dockerhub springboot制作镜像

docker使用&#xff08;二&#xff09; dockerhub创建账号创建存储库成功&#xff01;开始推送获取image名 提交成功SpringBoot项目制作Dockerfile镜像部署打jar包 dockerhub创建账号 &#xff08;自认为可以理解为github一类的东西&#xff09; 单击创建存储库按钮。 设定存…...

antd中Popover 气泡卡片样式修改

最近在开发react项目的一个新需求时&#xff0c;遇到气泡卡片Popover组件样式调整的问题&#xff0c;发现不管是在标签中设置className属性&#xff0c;还是在<Popover>标签中直接设置style属性&#xff0c;都不起作用。 最后搜索查阅发现要使用overlayClassName index…...

3月面试华为被刷,准备半年,9月二战华为终于上岸,要个27K不过分吧?

终于二战上岸了&#xff0c;二战华为也并不是说非华为不可&#xff0c;只是觉得心里憋着一口气&#xff0c;这就导致我当时有其他比较好的offer&#xff0c;我也没有去&#xff0c;就是想上岸华为来证明自己,现在也算是如愿了&#xff0c;来跟大伙们分享一下~ 个人情况 我本人…...

Kali之BurpSuite_pro安装配置

文章目录 配置jdk环境安装BurpSuitePro设置快捷方式启动方式 BurpSuite2021专业版本地址&#xff1a; 下载链接&#xff1a;https://pan.baidu.com/s/1PjzcukRDoc_ZFjrNxI8UjA 提取码&#xff1a;nwm7 我的安装工具都在/home/kali/tools/ 解压后我放在burpsuite_pro目录下 把j…...

双指针算法总结

双指针 常见的双指针有两种形式&#xff1a;对撞指针&#xff0c;左右指针。 对撞指针&#xff1a; 对撞指针一般用于顺序结构中&#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。以个指针从最左端开始&#xff0c;另⼀个从最右端开始&#xff0c;然后逐渐往中间逼…...

开源照片管理服务LibrePhotos

本文是为了解决网友 赵云遇到的问题&#xff0c;顺便折腾的。虽然软件跑起来了&#xff0c;但是他遇到的问题&#xff0c;超出了老苏的认知。当然最终问题还是得到了解决&#xff0c;不过与 LibrePhotos 无关&#xff1b; 什么是 LibrePhotos ? LibrePhotos 是一个自托管的开源…...

Linux指令

1 Linux 系统目录结构 /bin 存放系统指令&#xff08;可执行文件&#xff09; /boot 存放linux系统开机引导程序 /dev 存放设备文件的地方 /etc 存放系统配置文件的地方 /home 存放用户家目录的地方。 /lib和/lib64 存放系统动态链接库的地方。 /lostfound linux文件系统下特有…...

如何在Mac电脑上安装WeasyPrint:简单易懂的步骤

1. 安装homebrew 首先需要确保安装了homebrew&#xff0c;通过homebrew安装weasyprint可以将需要的库都安装好&#xff0c;比pip安装更简单快捷。 安装方法如下&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)&qu…...

手机电脑scoket通信 手机软件 APP inventor 服务端程序python

python scoket 通信 再帮助同学坐课题的时候接触到了scoket通信&#xff0c;了解到这应该是基层网络通信的原理&#xff0c;于是就导出搜索了一下相关的资料&#xff0c;简单来说scoket通信就是&#xff0c;可以让不同设备在同一个网络环境的条件下&#xff0c;可以实现相互通…...

软考高级之系统架构师之系统安全性和保密性设计

今天是2023年08月31日&#xff0c;距离软考高级只有65天&#xff0c;加油&#xff01; 备注&#xff1a;资料搜集自网络。 基础 信息必须依赖于存储、传输、处理及应用的载体&#xff08;媒介&#xff09;而存在。信息系统安全可以划分设备安全、数据安全、内容安全和行为安…...

FPGA实现电机转速PID控制

通过纯RTL实现电机转速PID控制&#xff0c;包括电机编码器值读取&#xff0c;电机速度、正反转控制&#xff0c;PID算法&#xff0c;卡尔曼滤波&#xff0c;最终实现对电机速度进行控制&#xff0c;使其能够渐近设定的编码器目标值。 一、设计思路 前面通过SOPC之NIOS Ⅱ实现电…...

C++中的volatile

volatile的本意是“易变的”&#xff0c;是一种类型修饰符&#xff0c;用它声明的类型变量表示可以被某些编译器未知的因素更改&#xff0c;比如操作系统、硬件或者其它线程等。遇到这个关键字声明的变量&#xff0c;编译器对访问该变量的代码就不再进行优化&#xff0c;从而可…...

数学建模--一维插值法的多种插值方式的Python实现

目录 1.算法流程步骤 2.算法核心代码 3.算法效果展示 1.算法流程步骤 #算法的核心就是利用scipy中的interpolate来完成工作 #一共是5种一维插值算法形式: #插值方法&#xff1a;1.阶梯插值 2.线性插值 3.2阶样条插值 4.3阶样条插值 #"nearest"阶梯插值 #"zero&…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...