zhufucdev

在Vercel Edge Runtime使用Github API

由Steve Reed发布于昨年5月13日 03:22,语言 中文(中国)
这不是一个教程

我没有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

shell 代码

那个query-string是随便找的

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

文档

First, create a new project and add an /api directory and a hello.ts file inside it. This is where the code that will be deployed as an Edge Function will live. The file extension can be .ts or .js. Alternatively, you can add an Edge Function to your existing project by adding a new file within the /api directory. The important part to note here is that while the file itself can be named anything, it should be located inside the /api directory.

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

cat vercel.json { "rewrites": [ { "source": "/:match*", "destination": "/api/:match*" }, { "source": "/", "destination": "/api/index" } ] }

shell 代码

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

export const config = { runtime: 'edge' }

typescript 代码

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

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

typescript 代码

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

import querystring from "query-string" import { Octokit } from "octokit"

typescript 代码

[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

log 代码

文档是这么写的

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

diff 代码

再用一些标准库parse query

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

typescript 代码

这样就差不多了

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

zhufucdev/api.zhufucdev

讨论

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

  • 这是一个新兴概念,没有得到市场的充分检验
  • 网上能找到的资料不多

相应,能用的资源很少

  • 128MB内存
  • 50ms超时
  • 950次fetch每次运行
  • 限制的接口

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

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

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

你的观点

留下你的评论,我是不会读的。

拉取请求

写得不咋样?你可以帮助改进这篇文章。

此网站受reCAPTCHA保护,因而Google的隐私权政策服务条款生效。

Copyright zhufucdev 2024