一、优势
分布式部署
EdgeOne 拥有 3200+ 边缘节点,边缘函数以分布式部署的方式运行在边缘节点。
超低延迟
客户端请求将自动被调度至靠近你用户最近的边缘节点上,命中触发规则触发边缘函数对请求进行处理并响应结果给客户端,可显著降低客户端的访问时延。
弹性扩容
边缘函数可以根据客户端请求数的突增,由近及远地将请求调度至有充足计算资源的边缘节点处理,你无需担忧突发场景。
Serverless 架构
你无需再关心和维护底层服务器的内存、CPU、网络和其他基础设施资源,可以抽出精力更专注于业务代码的开发。
二、快速开始
在项目的 ./edge-functions/api 目录下新建 hello.js,使用以下示例代码创建你的第一个 Edge Function:
// ./edge-functions/api/hello.jsexport default function onRequest(context) { return new Response('Hello from Edge Functions!');}
三、路由
Edge Functions 基于 /edge-functions 目录结构生成访问路由。你可在项目仓库 /edge-functions 目录下创建任意层级的子目录,参考下述示例。
…edge-functions├── index.js├── hello-pages.js├── helloworld.js├── api ├── users ├── list.js ├── geo.js ├── [id].js ├── visit ├── index.js ├── [[default]].js…
上述目录文件结构,经 EdgeOne Makers 平台构建后将生成以下路由。这些路由将 Makers URL 映射到 /edge-functions 文件,当客户端访问 URL 时将触发对应的文件代码运行:
| 文件路径 | 路由 |
| /edge-functions/index.js | example.com/ |
| /edge-functions/hello-pages.js | example.com/hello-pages |
| /edge-functions/helloworld.js | example.com/helloworld |
| /edge-functions/api/users/list.js | example.com/api/users/list |
| /edge-functions/api/users/geo.js | example.com/api/users/geo |
| /edge-functions/api/users/[id].js | example.com/api/users/1024 |
| /edge-functions/api/visit/index.js | example.com/api/visit |
| /edge-functions/api/[[default]].js | example.com/api/books/listexample.com/api/books/1024example.com/api/… |
注意:说明:
动态路由
Edge Functions 支持动态路由,上述示例中一级动态路径 /edge-functions/api/users/[id].js,多级动态路径 /edge-functions/api/[[default]].js。参考下述用法:
| 文件路径 | 路由 | 匹配 |
| /edge-functions/api/users/[id].js | example.com/api/users/1024 | 是 |
| | example.com/api/users/vip/1024 | 否 |
| | example.com/api/vip/1024 | 否 |
| /edge-functions/api/[[default]].js | example.com/api/books/list | 是 |
| | example.com/api/1024 | 是 |
| | example.com/v2/vip/1024 | 否 |
四、Function Handlers
使用 Function Handlers 可为 Makers 创建自定义请求处理程序,以及定义 RESTful API 实现全栈应用。支持下述 Handlers 方法:
| Handlers 方法 | 描述 |
| onRequest(context: EventContext): Response | Promise<Response> | 匹配 HTTP Methods (GET, POST, PATCH, PUT, DELETE, HEAD, OPTIONS) |
| onRequestGet(context: EventContext): Response | Promise<Response> | 匹配 HTTP Methods (GET) |
| onRequestPost(context: EventContext): Response | Promise<Response> | 匹配 HTTP Methods (POST) |
| onRequestPatch(context: EventContext): Response | Promise<Response> | 匹配 HTTP Methods (PATCH) |
| onRequestPut(context: EventContext): Response | Promise<Response> | 匹配 HTTP Methods (PUT) |
| onRequestDelete(context: EventContext): Response | Promise<Response> | 匹配 HTTP Methods (DELETE) |
| onRequestHead(context: EventContext): Response | Promise<Response> | 匹配 HTTP Methods (HEAD) |
| onRequestOptions(context: EventContext): Response | Promise<Response> | 匹配 HTTP Methods (OPTIONS) |
EventContext 对象描述
context 是传递给 Function Handlers 方法的对象,包含下述属性:
·request:客户端请求对象 Request。
·params:动态路由 /edge-functions/api/users/[id].js 参数值。
export function onRequestGet(context) { return new Response(`User id is ${context.params.id}`);}
·env:Makers 环境变量。
·waitUntil:(task: Promise<any>): void; 用于通知边缘函数等待 Promise 完成,可延长事件处理的生命周期。
五、Runtime APIs
Edge Functions 基于 边缘函数 实现,提供了 EdgeOne 边缘节点的 Serverless 代码执行环境。支持 ES6 语法和标准的 Web Service Worker API。其中大部分 Runtime APIs 可参考 边缘函数 用法,参考下述描述:
| API | 描述 |
| Cache | Cache 基于 Web APIs 标准 Cache API 进行设计。Functions 运行时会在全局注入 caches 对象,该对象提供了一组缓存操作接口。 |
| Cookies | Cookies 提供了一组 cookie 操作接口。 |
| Encoding | 基于 Web APIs 标准 TextEncoder、TextDecoder 进行设计,实现了编码器与解码器。 |
| Fetch | 基于 Web APIs 标准 Fetch API 进行设计。边缘函数运行时可使用 fetch 发起异步请求,获取远程资源。 |
| Headers | Headers 基于 Web APIs 标准 Headers 进行设计。可用于 HTTP request 和 response 的头部操作。 |
| Request | Request 代表 HTTP 请求对象,基于 Web APIs 标准 Request 进行设计。 |
| Response | Response 代表 HTTP 响应,基于 Web APIs 标准 Response 进行设计。 |
| Streams | ReadableStream 可读流,也称为可读端,基于 Web APIs 标准 ReadableStream 进行设计。 |
| Web Crypto | Web Crypto API 基于 Web APIs 标准 Web Crypto API 进行设计。提供了一组常见的加密操作接口,相比纯 JavaScript 实现的加密接口,Web Crypto API 的性能更高。 |
| Web Standards | 边缘函数基于 V8 JavaScript 引擎设计实现的 Serverless 代码执行环境,提供了以下标准化的 Web APIs。 |
注意:说明:
六、使用限制
| 内容 | 限制 | 说明 |
| 代码包大小 | 5 MB | 单个函数代码包大小最多支持 5 MB。 |
| 请求 body 大小 | 1 MB | 客户端请求携带 body 最多支持 1 MB。 |
| CPU 时间 | 200 ms | 函数单次执行分配的 CPU 时间片,不包含 I/O 等待时间。 |
| 开发语言 | JavaScript | 目前仅支持 JavaScript,ES2023+。 |
七、示例模板
获取用户访问地理位置:
预览地址
源码地址
使用 KV 记录页面访问数:
预览地址
源码地址
有关如何使用 KV 存储的详细信息,请参阅 KV 存储。
连接 Supabase 第三方数据库:
预览地址
源码地址