Xget 无侵入不走actions部署到 EdgeOne Pages 指南

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"

步骤说明

  1. 复制源码: 将 src 目录复制到构建根目录
  2. 添加命名导出: 在 export default 前插入 export { handleRequest }
  3. 替换首页地址: 修改 HOME_PAGE_URL(可选)
  4. 创建根路由: 复制函数文件为 index.js 处理根路径 /
  5. 重命名 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 协议不兼容。发布到生产环境后可正常使用。

相关链接


欢迎指出任何有错误或不够清晰的表达,可以在下面评论区评论。

×

喜欢就点赞,疼爱就打赏

//