Xget 部署到 EdgeOne Pages 指南
背景
Xget 原生支持 Cloudflare Pages,但 EdgeOne Pages 在目录结构和路由语法上存在差异。本文档记录了将 Xget 成功部署到 EdgeOne Pages 的完整方案。
EdgeOne Pages 与 Cloudflare Pages 的差异
| 特性 | Cloudflare Pages | EdgeOne Pages |
|---|---|---|
| 函数目录 | functions/ |
functions/ |
| Catch-all 路由 | [[path]].js |
[[default]].js |
| 根路径处理 | [[path]].js 可匹配 |
需要单独的 index.js |
| 地理信息 | request.cf |
request.eo |
| 函数导出 | export async function onRequest |
同左 |
部署配置
控制台设置
| 配置项 | 值 |
|---|---|
| 分支 | main 或你的目标分支 |
| 根目录 | adapters/pages |
| 输出目录 | . |
| 构建命令 | echo $B|base64 -d|sh |
环境变量
创建环境变量 B,值为下方 Base64 编码的构建脚本。
基础版本(跳转到原项目首页):
Y3AgLXIgLi4vLi4vc3JjIC4mJnNlZCAtaSAiL15leHBvcnQgZGVmYXVsdC9pIGV4cG9ydHtoYW5kbGVSZXF1ZXN0fTsiIHNyYy9pbmRleC5qcyYmY3AgImZ1bmN0aW9ucy9bW3BhdGhdXS5qcyIgImZ1bmN0aW9ucy9pbmRleC5qcyImJm12ICJmdW5jdGlvbnMvW1twYXRoXV0uanMiICJmdW5jdGlvbnMvW1tkZWZhdWx0XV0uanMi
自定义首页版本(以 qq.com 为例):
Y3AgLXIgLi4vLi4vc3JjIC4mJnNlZCAtaSAiL15leHBvcnQgZGVmYXVsdC9pIGV4cG9ydHtoYW5kbGVSZXF1ZXN0fTsiIHNyYy9pbmRleC5qcyYmc2VkIC1pICJzfGh0dHBzOi8vZ2l0aHViLmNvbS94aXh1LW1lL1hnZXR8aHR0cHM6Ly9xcS5jb218ZyIgc3JjL2luZGV4LmpzJiZjcCAiZnVuY3Rpb25zL1tbcGF0aF1dLmpzIiAiZnVuY3Rpb25zL2luZGV4LmpzIiYmbXYgImZ1bmN0aW9ucy9bW3BhdGhdXS5qcyIgImZ1bmN0aW9ucy9bW2RlZmF1bHRdXS5qcyI=
如需修改跳转地址,将上方 Base64 解码后替换 https://qq.com 为你的目标地址,再重新编码。
构建脚本解析
Base64 解码后的构建脚本:
cp -r ../../src . \\
&& sed -i "/^export default/i export{handleRequest};" src/index.js \\
&& sed -i "s|https://github.com/xixu-me/Xget|https://qq.com|g" src/index.js \\
&& cp "functions/[[path]].js" "functions/index.js" \\
&& mv "functions/[[path]].js" "functions/[[default]].js"
步骤说明:
- 复制源码: 将
src目录复制到构建根目录 - 添加命名导出: 在
export default前插入export { handleRequest } - 替换首页地址: 修改 HOME_PAGE_URL(可选)
- 创建根路由: 复制函数文件为
index.js处理根路径/ - 重命名 catch-all: 将
[[path]].js改为 EdgeOne 支持的[[default]].js
为什么需要这些步骤
1. 添加命名导出
原始 src/index.js 只有默认导出:
export default { fetch(request, env, ctx) { return handleRequest(...) } }
而 functions/[[path]].js 需要命名导入:
import { handleRequest } from '../src/index.js';
构建时通过 sed 在 export default 前添加 export { handleRequest }; 解决导入问题。
2. 路由文件重命名
EdgeOne Pages 使用 [[default]].js 作为 catch-all 路由语法,且该文件只匹配子路径。根路径 / 需要单独的 index.js 处理。
验证部署
部署成功后,测试以下路径:
| 路径 | 预期结果 |
|---|---|
/ |
跳转到配置的首页地址 |
/gh/user/repo/raw/main/file |
代理 GitHub 文件 |
/npm/package-name |
代理 NPM 包信息 |
/pypi/package-name |
代理 PyPI 包信息 |
常见问题
构建成功但访问 404
检查构建日志是否包含 [cli]✨ Compiled edge functions successfully。如果没有,说明函数未被正确编译。确保:
- 根目录设置为
adapters/pages - 环境变量
B的 Base64 内容完整无误
预览环境 401 鉴权错误
EdgeOne 预览环境需要 eo_token 参数。发布到生产环境后此限制会解除。
Git Clone 在预览环境失败
预览环境的 token 鉴权与 Git 协议不兼容。发布到生产环境后可正常使用。
相关链接
欢迎指出任何有错误或不够清晰的表达,可以在下面评论区评论。