Xget 部署到 Cloudflare Pages 完整指南 - 无需修改源码的构建配置


Xget 部署到 Cloudflare Pages 完整指南

本文详细记录了将 Xget 开发者资源加速引擎部署到 Cloudflare Pages 的完整过程,包括遇到的问题、排查思路和最终解决方案。

目录

背景介绍

Xget 是一个超高性能、安全、一体化的开发者资源加速引擎,支持 GitHub、GitLab、npm、PyPI 等众多平台的文件下载加速。

原始项目 xixu-me/Xget 使用 GitHub Actions 自动化部署流程:

  1. sync.ymlmain 分支代码转换到 pages 分支
  2. pages-cf.ymlpages 分支部署到 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

命令解析

  1. cp -r ../../src .
    • src 目录复制到 adapters/pages/
    • 因为根目录设置为 adapters/pages,需要向上两级访问 src
  2. 第一个 sed 命令
    • 修改 import 语句
    • 从:import { handleRequest } from '../src/index.js';
    • 到:import worker from '../src/index.js';
  3. 第二个 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


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

×

喜欢就点赞,疼爱就打赏

//