EdgeOne CDN边缘函数本地调试开发工具
# 前言
因为EdgeOne并没有提供CDN产品边缘函数的本地调试工具,为了能更好的开发腾讯云EdgeOne CDN边缘函数,方便开发调试,于是我写了 一个基于Node.js开发的本地模拟器,可在本地直接模拟EdgeOne的CDN边缘函数环境测试边缘函数代码
# Github仓库

# 详情
EdgeJS 是一个用于本地开发和测试 EdgeOne CDN 边缘函数的模拟器。它模拟了 EdgeOne 边缘函数的运行时环境,让你可以在本地轻松 开发和调试边缘函数代码。
## 特性
- 完整的边缘函数 API 模拟
- `addEventListener('fetch', ...)` 事件监听
- `Request` / `Response` 对象
- `caches` 缓存 API
- `env` 环境变量支持
- 图片处理支持
- 基于 `sharp` 库
- 支持格式转换 (WebP, JPEG, PNG, AVIF)
- 支持图片缩放
- 响应压缩
- 自动 Gzip / Brotli 压缩
- 可配置压缩阈值和类型
- 错误回源
- 边缘函数异常时自动回退到源站
- 支持超时处理和重定向控制
- 增强的控制台
- 带时间戳和日志级别
- 支持 `console.time` / `timeEnd` / `count` / `group` 等
## 系统要求
- Node.js >= 16.0.0
- npm 或 yarn
## 安装
```bash
git clone <repository-url>
cd edgejs
npm install
```
## 快速开始
1. 启动模拟器:
```bash
npm start
```
2. 按照提示输入:
- 边缘函数 JS 文件路径(如 `example.js`)
- 回源地址(可选)
- 监听端口(默认 8080)
3. 访问 `http://localhost:8080` 测试你的边缘函数
### 开发模式(自动重启)
```bash
npm run dev
```
## 示例边缘函数
```javascript
// example.js
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
// 返回 JSON 响应
if (url.pathname === '/api') {
return new Response(JSON.stringify({
message: 'Hello from Edge!',
timestamp: new Date().toISOString()
}), {
headers: { 'Content-Type': 'application/json' }
});
}
// 图片处理示例
if (url.pathname === '/image') {
const imageUrl = url.searchParams.get('url');
const format = url.searchParams.get('format') || 'webp';
const width = url.searchParams.get('width');
const height = url.searchParams.get('height');
return fetch(imageUrl, {
eo: {
image: { format, width, height }
}
});
}
// 使用缓存
if (url.pathname === '/cached') {
const cache = caches.default;
const cachedResponse = await cache.match(request);
if (cachedResponse) {
return cachedResponse;
}
const response = await fetch('https://api.example.com/data');
await cache.put(request, response.clone());
return response;
}
// 环境变量
if (url.pathname === '/env') {
return new Response(`API_KEY: ${env.API_KEY || 'not set'}`);
}
return new Response('Hello from Edge Function!');
}
```
## 测试示例
项目包含一个示例文件 `example.js`,提供了以下测试端点:
| 端点 | 说明 |
|------|------|
| /manual-redirect | 手动处理重定向 |
| /error-redirect | 重定向报错测试 |
| /large-text | 响应压缩测试 |
启动后访问 `http://localhost:8080/manual-redirect` 即可测试。
## 配置
### 环境变量
在项目根目录创建 `.env` 文件:
```env
API_KEY=your-api-key
DEBUG=true
MAX_RETRIES=3
```
### 模拟器配置
在 `main.js` 中的 `CONFIG` 对象可以调整:
```javascript
const CONFIG = {
fetchTimeout: 15000, // fetch 超时时间 (ms)
showStack: true, // 是否显示错误堆栈
consolePrefix: true, // 控制台前缀
maxRedirects: 12, // 最大重定向次数
compressMinSize: 256, // 压缩最小大小 (bytes)
compressibleTypes: [ // 可压缩的 MIME 类型
'text/',
'application/json',
// ...
],
};
```
## 架构
```
+-----------------------------------------------------+
| HTTP Server |
| (Node.js http) |
+-----------------+-----------------------------------+
|
v
+-----------------------------------------------------+
| Edge Function Runtime |
| +---------+ +---------+ +---------------------+ |
| | caches | | env | | fetch (enhanced) | |
| +---------+ +---------+ +---------------------+ |
| +---------+ +---------+ +---------------------+ |
| | console | | sharp | | compression | |
| +---------+ +---------+ +---------------------+ |
+-----------------------------------------------------+
```
## 依赖
- [sharp](https://sharp.pixelplumbing.com/) - 高性能图片处理
## 贡献
欢迎提交 Issue 和 Pull Request。
## 许可证
ISC
## 注意事项
1. 此模拟器用于本地开发测试,生产环境请使用 EdgeOne 官方服务
2. 部分边缘函数 API 可能与真实环境存在差异
3. 图片处理需要系统支持 libvips(sharp 依赖)
评论 (0)