Xget 部署到 Cloudflare Pages 完整指南
本文详细记录了将 Xget 开发者资源加速引擎部署到 Cloudflare Pages 的完整过程,包括遇到的问题、排查思路和最终解决方案。
目录
背景介绍
Xget 是一个超高性能、安全、一体化的开发者资源加速引擎,支持 GitHub、GitLab、npm、PyPI 等众多平台的文件下载加速。
原始项目 xixu-me/Xget 使用 GitHub Actions 自动化部署流程:
sync.yml将main分支代码转换到pages分支pages-cf.yml从pages分支部署到 Cloudflare Pages
本文目标:直接从单一分支(如 cf/xixu-me/xget)通过 Cloudflare Pages Dashboard 构建部署,无需依赖 GitHub Actions。
项目结构分析
web_proxy/
├── src/
│ └── index.js # Workers 主逻辑
├── adapters/
│ └── pages/
│ ├── wrangler.toml # Pages 配置
│ └── functions/
│ └── [[path]].js # Pages Functions 入口
├── wrangler.toml # Workers 配置
└── package.json
关键文件说明
src/index.js
- Workers 核心业务逻辑
- 导出方式:
export default { fetch(request, env, ctx) { ... } } handleRequest函数未直接导出
adapters/pages/functions/[[path]].js
- Pages Functions 的 catch-all 路由处理器
- 原始代码尝试导入
{ handleRequest }(命名导出)
adapters/pages/wrangler.toml
name = "xget"
pages_build_output_dir = "."
compatibility_date = "2024-09-23"
compatibility_flags = ["nodejs_compat"]
部署配置
Cloudflare Pages Dashboard 设置
| 配置项 | 值 |
|---|---|
| 根目录 (Root Directory) | adapters/pages |
| 构建输出目录 (Build Output Directory) | . |
| 构建命令 (Build Command) | 见下方 |
构建命令(核心)
cp -r ../../src . && sed -i "s/import { handleRequest } from '..\\/src\\/index.js';/import worker from '..\\/src\\/index.js';/" functions/[[path]].js && sed -i 's/return handleRequest(request, env, ctx);/return worker.fetch(request, env, ctx);/' functions/[[path]].js
命令解析:
cp -r ../../src .- 将
src目录复制到adapters/pages/下 - 因为根目录设置为
adapters/pages,需要向上两级访问src
- 将
- 第一个
sed命令- 修改 import 语句
- 从:
import { handleRequest } from '../src/index.js'; - 到:
import worker from '../src/index.js';
- 第二个
sed命令- 修改函数调用方式
- 从:
return handleRequest(request, env, ctx); - 到:
return worker.fetch(request, env, ctx);
问题排查过程
问题 1:404 错误 - Functions 未被识别
现象:部署成功但访问返回 404
日志:
Note: No functions dir at /functions found. Skipping.
原因:Cloudflare Pages 在错误的位置查找 functions/ 目录
解决:
- 设置
根目录为adapters/pages - 设置
构建输出目录为. - 这样 Pages 会在
adapters/pages/functions/找到 Functions
问题 2:No matching export 错误
现象:
Error: No matching export in "../src/index.js" for import "handleRequest"
原因:
[[path]].js尝试命名导入{ handleRequest }src/index.js只有默认导出export default { fetch }
解决:
- 使用
sed在构建时修改 import 和调用方式 - 改为导入默认导出并调用其
fetch方法
问题 3:根路径跳转到 GitHub
现象:访问 / 自动跳转到 https://github.com/xixu-me/Xget
原因:src/index.js 中硬编码了 HOME_PAGE_URL
// src/index.js 第 54 行
const HOME_PAGE_URL = '<https://github.com/xixu-me/Xget>';
response = Response.redirect(HOME_PAGE_URL, 302);
这是设计行为,不是 bug。Xget 是纯 API/代理服务,没有 Web UI。
自定义首页跳转
如需将根路径跳转到自定义 URL(如 https://qq.com),可在构建命令中添加 sed 替换:
cp -r ../../src . && sed -i "s|https://github.com/xixu-me/Xget|https://qq.com|g" src/index.js && sed -i "s/import { handleRequest } from '..\\/src\\/index.js';/import worker from '..\\/src\\/index.js';/" functions/[[path]].js && sed -i 's/return handleRequest(request, env, ctx);/return worker.fetch(request, env, ctx);/' functions/[[path]].js
新增部分:
sed -i "s|https://github.com/xixu-me/Xget|https://qq.com|g" src/index.js
这会替换所有 3 处 HOME_PAGE_URL 的值。
最终配置总结
基础配置(保持原始跳转)
| 配置项 | 值 |
|---|---|
| 根目录 | adapters/pages |
| 构建输出目录 | . |
| 构建命令 | cp -r ../../src . && sed -i "s/import { handleRequest } from '..\\/src\\/index.js';/import worker from '..\\/src\\/index.js';/" functions/[[path]].js && sed -i 's/return handleRequest(request, env, ctx);/return worker.fetch(request, env, ctx);/' functions/[[path]].js |
自定义跳转配置
将构建命令中的 https://github.com/xixu-me/Xget 替换为你想要的 URL。
验证测试
部署成功后,测试以下路径:
| 路径 | 预期行为 |
|---|---|
/ |
302 跳转到配置的首页 URL |
/gh/user/repo/releases/latest/download/file.zip |
代理 GitHub Release 文件 |
/npm/package |
代理 npm 包 |
/pypi/package |
代理 PyPI 包 |
与原始项目部署方式的对比
| 方面 | 原始项目 (GitHub Actions) | 本方案 (CF Pages Dashboard) |
|---|---|---|
| 分支要求 | 需要 pages 分支 |
单一分支即可 |
| 自动化 | GitHub Actions 自动同步 | 手动或 CF 自动构建 |
| 代码修改 | sync.yml 自动添加导出 |
构建命令中 sed 处理 |
| 灵活性 | 固定流程 | 可自定义首页跳转等 |
参考资料
最后更新:2025-12-17
欢迎指出任何有错误或不够清晰的表达,可以在下面评论区评论。