在本篇unicloud开发教程中, 我们不会过多的介绍如何去开发api, 因为这已经在sword基础教程中都提到过, 在本篇入门文章中, 我们可以理解sfu的原理, 从而让我们窥探sword本质, 让我们开发unicloud如鱼得水 !
首先, unicloud是serverless环境, 整个函数的运行状态是stateless的, 我们不可以像server一样, 去在内存中持久化一个数据, 在unicloud (serverless) 环境中, sfu做的仅仅是触发api就可以了, 然后为了提升开发体验我们脱离了hbuilderx, 我们可以使用自己熟悉的编辑器搭配sword编译器, 可以把代码通过软链接到hbuilderx中的cloudfuntion中, 这样即可以在hbuilderx中调试, 又可以使用sword的语法开发程序, 这一模式借鉴了tsrpc框架的前后端共享代码的想法.

指定目标云函数目录

我们可以在工程下新建 sword.config.ts 配置文件, 用来配置unicloud环境下的link属性

  1. import type { Config } from "@swordjs/sword-framework-cli"
  2. const config: Config = {
  3. unicloud: {
  4. link: "/Users/seho/Documents/HBuilderProjects/sword-unicloud-faas/uniCloud-aliyun/cloudfunctions/test"
  5. }
  6. }
  7. export default config;

link指定的则是我们开发环境中, hbuilderx中的云函数路径 (此处是macos的路径)

启动开发服务器

  1. npm run dev:unicloud

启动之后你会发现终端有这样几个日志:

  1. [shim:process]创建shim成功
  2. 正在监听工程中的src/api文件夹...
  3. Proto加载成功
  4. [shim:unicloud]创建shim成功
  5. [unicloud:link]🔗软链接成功
  6. [unicloud:link]在hbuilderx中,无法在项目管理中显示通过软链接创建的文件夹,你可以打开文件目录查看详情
  7. [unicloud:dev]📦 编译成功

当我们首次通过dev开启一个服务器的时候, 脚手架会自动地将我们编译过后的产物软链接到hbuilderx中了
image.png

ps: 在hbuilderx中的项目管理器中不会显示[软链接], 在系统的文件管理中可以看到我们的“替身”

让sfu接管你的unicloud程序

我们需要在hbuilderx中云函数的根目录index.js中, 将原有的代码替换为:

  1. exports.main = require("./sword/src/index.js");

此时此刻, 请不要着急本地运行这个云函数, 因为你本地运行会遇到这个错误:

  1. [本地运行:阿里云:sword-framework-test]本地运行云函数【test】(已携带test.param.json参数)...
  2. [本地运行:阿里云:sword-framework-test]运行日志:
  3. [本地运行]"[云函数:test],执行结果:" {"statusCode":400,"statusMessage":"event is not valid (unicloud)"}
  4. [本地运行:阿里云:sword-framework-test]运行状态:成功

当前运行云函数, 没有任何的参数, sfu并不知道, 你想要调用哪个api, 传递哪些参数, 这个event的类型是这样的:

  1. export type HttpInstructMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'OPTIONS' | 'TRACE';
  2. export type UnicloudEvent = {
  3. route: string;
  4. method: HttpInstructMethod;
  5. query: Record<string, unknown>;
  6. params: Record<string, unknown>;
  7. };

所以我们需要携带这样的对象给云函数, 然后再本地运行:

  1. {
  2. "route": "/api/hello?id=1&nickname=1",
  3. "method": "POST",
  4. "query": {},
  5. "params": {}
  6. }

此时此刻你就已经完成了你的第一个unicloud云函数:

  1. [本地运行:阿里云:sword-framework-test]本地运行云函数【test】(已携带test.param.json参数)...
  2. [本地运行:阿里云:sword-framework-test]运行日志:
  3. [本地运行]"[请求URL]: /api/hellowoqu"
  4. [本地运行]"[请求参数-query]: {\"id\":\"1\",\"nickname\":\"1\"}"
  5. [本地运行]"[请求参数-params]: {}"
  6. [本地运行]"[返回结果]: {\"message\":\"hello\"}"
  7. [本地运行]"[云函数:test],执行结果:" {"message":"hello"}
  8. [本地运行:阿里云:sword-framework-test]运行状态:成功

我们熟悉的日志又回来了, 这和server端的日志是一样的, 这就证明了, sfu已经成功地接管了你的unicloud应用了 !

编译生产版本

sfu和sword的生产编译同出一辙, 都是使用esbuild构建, 而且在编译器中完成了对unicloud的适配

  1. npm run build:unicloud
  1. [shim:process]创建shim成功 17:41:49
  2. [shim:unicloud]创建shim成功 17:41:49
  3. Proto加载成功 17:41:49
  4. [unicloud]📦 打包成功, 请移动到hbuilderx中执行上传云函数命令

细心的你可能发现了, 我们的云函数目录, 从之前的软链接变成了独立的文件夹, 是因为我们此时的宿主环境不再是本地系统了, 而是unicloud云端, 所以我们就把产物复制了一份放到了云函数目录里, 此时此刻, 你现在可以上传你的云函数到云端啦 !