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.`,
);
};

整个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]);
这样就差不多了
如果你想知道详细的实现,可以看这个仓库
讨论
我得说,Edge Computing还是一个很小众的东西
- 这是一个新兴概念,没有得到市场的充分检验
- 网上能找到的资料不多
相应,能用的资源很少
- 128MB内存
- 50ms超时
- 950次fetch每次运行
- 限制的接口
Vercel是这样的,其他托管商估计也差不多
不管怎么说,Edge Computing是对分布式计算的一次探索,值得关注和支持
我还得说,NodeJS真的乱。大家赶快都去用Deno去