前言

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

函数计算(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. 通过插件将项目代码部署到云端

项目示例图

实践

1. 前期准备 (可选)

  • 根据 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 插件,那么可以尝试下插件的智能提示,效果如图:

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

4. 本地调试与部署

  • 本地调试

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

  • 部署函数

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

  • 远端调用函数

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

总结

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

优点

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

不足

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

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

本文作者:泽尘

原文链接

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

Serverless 实战 —— 函数计算 + Typescript 实践的更多相关文章

  1. Serverless 解惑——函数计算如何安装字体

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...

  2. 从零入门 Serverless | 函数计算如何粘合云服务,提供端到端解决方案

    作者 | 西流 阿里云技术专家 导读:阿里云 Serverless 产品函数计算可以作为粘合剂,串联其他云服务提供端到端解决方案,从而简化编程模型,快速实现最上层的业务目标. 传统单体应用的拆解 首先 ...

  3. Serverless 在大规模数据处理的实践

    作者 | 西流 阿里云技术专家 前言 当您第一次接触 Serverless 的时候,有一个不那么明显的新使用方式:与传统的基于服务器的方法相比,Serverless 服务平台可以使您的应用快速水平扩展 ...

  4. 阿里云函数计算上部署.NET Core 3.1

    使用阿里云ECS或者其他常见的VPS服务部署应用的时候,需要手动配置环境,并且监测ECS的行为,做补丁之类的,搞得有点复杂.好在很多云厂商(阿里云.Azure等)提供了Serverless服务,借助于 ...

  5. 在腾讯云云函数计算上部署.NET Core 3.1

    云厂商(腾讯云.Azure等)提供了Serverless服务,借助于Serverless,开发人员可以更加专注于代码的开发,减少运维的成本.腾讯云的函数计算提供了很多运行库,对.NET的支持需要通过c ...

  6. 从函数计算架构看 Serverless 的演进与思考

    作者 | 杨皓然  阿里巴巴高级技术专家 导读:云计算之所以能够成为 DT 时代颠覆性力量,是因为其本质是打破传统架构模式.降低成本并简化体系结构,用全新的思维更好的满足了用户需求.而无服务器计算(S ...

  7. 一元建站-基于函数计算 + wordpress 构建 serverless 网站

    前言 本文旨在通过 快速部署一个 wordpress 网站到阿里云函数计算平台 这个示例来展示 serverless web 新的开发模式, 包括 FUN 工具一键初始化 NAS, 同步网站到 NAS ...

  8. 函数计算: 让小程序开发进入 Serverless 时代

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 吴天龙(木吴 ...

  9. 函数计算自动化运维实战 2 -- 事件触发 eip 自动转移

    函数计算 阿里云函数计算是一个事件驱动的全托管计算服务.通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传.函数计算会为您准备好计算资源,以弹性.可靠的方式运行您的代码,并提供日志查询,性能 ...

随机推荐

  1. Delphi中TQuery.Filter用法

    今天维护一个老项目是用delphi5 + BDE写的.为了更方便查询数据,就增加一个查询功能.由于数据量查询出来后就比较少,于是就想到Filter like 但 BDE并不支持 Filter = 'n ...

  2. visualSVN提交强制添加注释

    Visual SVN Server下 右键项目  “所有任务”>“Manage Hooks” >选中Pre-commit hook然后edit编辑,添加如下代码 @echo off set ...

  3. Linux mysql ERROR 1045 解决

    Linux mysql 5.6: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) ...

  4. CSS3—— 2D转换 3D转换 过渡 动画

    2D转换 对元素进行移动.缩放.转动.拉长或拉伸 ————>  ————>   移动 顺时针旋转 扩大/缩小 倾斜 2D变换合并  3D转换 绕x轴 绕y轴 过渡 从一种样式逐渐改变为另一 ...

  5. LeetCode算法题-Positions of Large Groups(Java实现)

    这是悦乐书的第323次更新,第346篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第193题(顺位题号是830).在由小写字母组成的字符串S中,那些相同的连续字符会组成集 ...

  6. vue中的$EventBus.$emit、$on的应用

    今天在项目中遇到的一个需求: 在一个选项卡功能的页面,出现的问题是,当点击选项卡的某个选项时,会同时加载整个选项卡的数据,本身产品就很大,数据很多,所以这个问题无法忽略: 仔细研究下发现,当刚进入页面 ...

  7. 【VS开发】使用WinPcap编程(1)——获取网络设备信息

    pcap_if_t是一个interface数据结构,表明网络接口的信息.网络接口就是interface,就是我们用来上网的设备,一般为网卡,还有一些虚拟网卡也算作这样的接口.它的结构如下: struc ...

  8. kafka学习(五)

    kafka可靠的数据传递   kafka可靠性保证 ACID 是关系型数据库保证数据的规范,指的是原子性,一致性,隔离性和持久性,这是数据库给出的可靠性保证.   kafka给出的保证是什么? 1.k ...

  9. DOM练习(邓邓版)

    先来图片: 今天直接粘代码: 下面是html: <h4>01.图片切换</h4> <img width = "100" src = "../ ...

  10. promise和async/await的用法

    promise和async都是做异步处理的, 使异步转为同步 1.promise 它和Promise诞生的目的都是为了解决“回调地狱”, promise使用方法: <button @click= ...