我没有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 代码
这样就差不多了
如果你想知道详细的实现,可以看这个仓库
我得说,Edge Computing还是一个很小众的东西
相应,能用的资源很少
Vercel是这样的,其他托管商估计也差不多
不管怎么说,Edge Computing是对分布式计算的一次探索,值得关注和支持
我还得说,NodeJS真的乱。大家赶快都去用Deno去
留下你的评论,我是不会读的。
写得不咋样?你可以帮助改进这篇文章。
此网站受reCAPTCHA保护,因而Google的隐私权政策和服务条款生效。
Copyright zhufucdev 2024