Serverless 实战 —— 函数计算 + Typescript 实践

Stella981
• 阅读 663

前言

首先介绍下在本文出现的几个比较重要的概念:

函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。函数计算更多信息参考。
Aliyun Serverless VSCode Extension: 是阿里云 Serverless 产品 函数计算 Function Compute 的 VSCode 插件,该插件结合了函数计算 Funcraft:Funcraft 工具以及函数计算 SDK ,是一款 VSCode 图形化开发调试函数计算以及操作函数计算资源的工具。
Funcraft:Funcraft 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API 网关、日志服务等资源。它通过一个资源配置文件(template.yml),协助您进行开发、构建、部署操作。Fun 的更多文档参考。

目标

本文打算以一个简单的 Serverless 函数计算项目为例,尝试使用 typescript + nodejs 进行开发,搭建一个简单的工程项目,实现如下小目标:

  1. 使用 typescript 编写业务代码
  2. 可以通过 Serverless VSCode 插件本地调试 typescript 代码
  3. 通过插件将项目代码部署到云端

项目示例图

Serverless 实战 —— 函数计算 + Typescript 实践

实践

1. 前期准备 (可选)

Serverless 实战 —— 函数计算 + Typescript 实践

  • 根据 aliyun/fun 中的教程安装并配置 Docker。

前期准备的目的是为了方便开发和调试,目前阿里云 Function Compute 提供了命令行工具 Funcraft 以及图形化 VSCode 插件。安装 Docker 是为了在本地模拟线上环境进行调试,如果想快速浏览下 nodejs + typescript 工程项目的搭建,可以跳过。

2. 环境搭建

  • 配置 tsconfig.json

    • 执行 tsc --init,将会在项目根目录生成 tsconfig.json

    • 配置 tsconfig.json 内容为:

      { "compilerOptions": { "target": "es5", "module": "commonjs", "noImplicitAny": true, "outDir": "./dist/", "sourceMap": true }, "include": [ "./src" ] }

  • 配置 package.json

    • 执行 npm init,将会在项目根目录生成 package.json

    • 配置 package.json 内容为:

      { "name": "fc-ts", "version": "1.0.0", "description": "Function Compute + Typescript", "main": "index.js", "scripts": { "compile": "tsc -p ./" } }

  • 编写业务代码

    • 新建 src/index.ts 文件,编写内容如下:

      export const handler = ( event: any, context: any, callback: (err: any, data: any) => void, ) => { console.log(new String(event)); callback(null, 'hello world'); }

  • 将 ts 代码编译为 js 代码

    • 在 Terminal 中输入 npm run compile
    • 完成后在项目根目录会有 dist 文件夹以及 dist/index.jsdist/index.js.map 文件

至此,我们搭建了一个常规的 typescript 项目,有 tsconfig.jsonpackage.jsonsrc 源码目录dist 结果目录。其中,src/index.ts 文件中定义了一个 handler 方法,该方法符合函数计算中函数入口方法的定义。

3. 结合函数计算

  1. 在项目根目录新建 index.js 文件,文件内容如下:

    const { handler } = require('./dist/index');
    
    module.exports.handler = (event, context, callback) => {
      handler(event, context, callback);
    }
    

    这里又定义了一个 handler 方法,该方法中调用了编译后 js 文件中的 handler 方法。

  2. 在项目根目录新建 template.yml 文件,文件内容如下:

    ROSTemplateFormatVersion: '2015-09-01'
    Transform: 'Aliyun::Serverless-2018-04-03'
    Resources:
      demo: # service name
        Type: 'Aliyun::Serverless::Service'
        Properties:
          Description: This is FC service
        func01: # function name
          Type: 'Aliyun::Serverless::Function'
          Properties:
            Handler: index.handler
            Runtime: nodejs8
            CodeUri: ./
            MemorySize: 1024
            Timeout: 15
    

    该文件中对我们的资源(即函数计算中的服务以及函数)进行了定义,具体内容可以参考:Fun 规范文档
    如果安装了 Serverless VSCode 插件,那么可以尝试下插件的智能提示,效果如图:

    Serverless 实战 —— 函数计算 + Typescript 实践

至此,我们就成功的将 typescript 项目结合到了函数计算中。我们的做法是:将 typescript 源码文件放置在 src 目录,将编译后的 js 文件放置在 dist 目录,最后在项目根目录中编写了 index.js 文件,文件中的 handler 处理函数调用了编译后 index 文件的入口函数。

4. 本地调试与部署

  • 本地调试

    • 在 index.js 以及 src/index.ts 文件中插入一些断点。
    • 点击 VSCode 左侧栏目中的函数计算图标,展开本地资源树
    • 点击函数名右侧的调试按钮,即可调试 ts 源代码。

Serverless 实战 —— 函数计算 + Typescript 实践

  • 部署函数

    • 点击 VSCode 左侧栏目中的函数计算图标
    • 右键本地资源树中的函数名,点击部署按钮

Serverless 实战 —— 函数计算 + Typescript 实践

  • 远端调用函数

    • 点击远端资源树中函数名右侧的调用按钮

Serverless 实战 —— 函数计算 + Typescript 实践

总结

目前阿里云 Function Compute 没有原生支持 Typescript,但是通过本文的方式可以做到在本地开发调试时使用 Typescript。接下来总结下这种实践方法的优点和不足:

优点

  1. 使用 Typescript 进行开发
  2. 支持本地调试 Typescript 代码
  3. 项目部署到云端后,可以在云端查看 Typescript 源码

不足

  1. 本地调试时需要在项目根目录的 index.js 文件中插入一个断点。
  2. 更新代码后,在调试以及部署前需要手工进行一次 Typescript 代码到 js 代码的编译。

本文中介绍的实践方式只是一种思路,欢迎大家提供其他的思路。

原文链接

本文为阿里云内容,未经允许不得转载。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这