在Vercel Edge Runtime使用Github API

2023年5月13日

这不是一个教程

我没有Edge开发的资质。有些时候,我也不知道自己在干什么。但这就是互联网。

背景

我知道Edge Computing也是近一年的事情。说实话,除非真的要用,没人想去做web前端

Edge Computing大概就是,把你的代码放在CDN运行

这种运行总得有优点吧

我觉得它挺酷的,但从来没试过。最近为了做一些事情,想来试试

思路

我想做一些统一接口,方便我的软件自检查更新(很多人都直接把Github API hardcode在软件里面,我觉得不够优雅)

Vercel提供了一些Edge Functions,免费容量是五十万次请求,差不多够了

尝试

首先呢,Vercel这个Edge运行时是V8写的,所以我们要准备一些JavaScript。

mkdir api.zhufucdev && cd api.zhufucdev
npm install octokit query-string

那个query-string是随便找的

根据Vercel的文档,可以不用自家的Next.js,但脚本都要放在/api目录里

我根据另一些Vercel的文档,用vercel.json重定向了网站的URL

cat vercel.json

{
  "rewrites": [
    {
      "source": "/:match*",
      "destination": "/api/:match*"
    },
    {
      "source": "/",
      "destination": "/api/index"
    }
  ]
}

在/api/index.ts,首先得导出一个config,声明自己是要在edge运行

export const config = {
  runtime: "edge",
};

要真的做一些事情,导出一个默认项函数,

export default (_: Request) => {
  return new Response(
    `Welcome to Steve's API. If you have no idea what are you doing, just let go.`,
  );
};

image-1

整个Edge Function都是基于ES Module的;如果想导入一些不是或不标准的ES Module:

import querystring from "query-string";
import { Octokit } from "octokit";
[09:22:40.656] Error: The Edge Function "api/release" is referencing unsupported modules:
[09:22:40.656] 	- api/release.js: querystring
[09:22:40.656] 	- @octokit: @octokit/auth-app
[09:22:41.547] Deployment completed
[09:22:41.497] NOW_SANDBOX_WORKER_EDGE_FUNCTION_UNSUPPORTED_MODULES: The Edge Function "api/release" is referencing unsupported modules:
	- api/release.js: querystring
	- @octokit: @octokit/auth-app

文档是这么写的

node_modules can be used, as long as they implement ES Modules and do not use native Node.js APIs

octokit和query-string这两个module都可以跑在浏览器上,但因为没有标自己可以跑在浏览器上,aka不是标准的ES Module,部署失败了

咋办呢,我自己实现Github API的parser

- const latest = await octokit.rest.repos.getLatestRelease({
-     owner: 'zhufucdev',
-     repo: alias[this.product],
- });
+ const response =
+  await fetch(
+      `https://api.github.com/repos/zhufucdev/${alias[this.product]}/releases/latest`,
+      {
+          headers: {
+              'Accept': 'application/vnd.github+json',
+              'Authorization': `Bearer ${ghToken}`,
+              'X-GitHub-Api-Version': '2022-11-28'
+          }
+      }
+  )
+ if (!response.ok) return undefined
+ const latest = await response.json() as ReleaseMeta

再用一些标准库parse query

const query = new URLSearchParams(/.*\?(.*)/g.exec(req.url)![1]);

这样就差不多了

如果你想知道详细的实现,可以看这个仓库

zhufucdev/api.zhufucdev

通过GitHub

讨论

我得说,Edge Computing还是一个很小众的东西

相应,能用的资源很少

Vercel是这样的,其他托管商估计也差不多

不管怎么说,Edge Computing是对分布式计算的一次探索,值得关注和支持

我还得说,NodeJS真的乱。大家赶快都去用Deno去