EdgeOne Makers 迁移指南
你已经把项目部署在 Vercel 或 Cloudflare Pages 上了,用着还行,但发现中国用户访问慢、某些功能受限、或者想要更好的国内访问体验。这时候就涉及到迁移。这篇教你怎么把项目从其他平台搬到 EdgeOne Makers,尽量做到平滑过渡,不影响线上服务。
为什么迁移
先说说迁移的常见原因,帮你判断自己是不是真的需要迁移。
| 痛点 | Vercel | Cloudflare Pages | EdgeOne Makers |
|---|---|---|---|
| 国内访问速度 | 较慢,服务器在海外 | 一般,节点覆盖有限 | 快,亚洲节点密集 |
| 免费额度 | 有限,超了可能被暂停 | 较宽裕 | 免费额度充足 |
| 函数写法 | Vercel Functions | Cloudflare Workers | Makers Functions |
| 配置文件 | vercel.json | wrangler.toml | edgeone.json |
| 中国区域加速 | 不支持 | 不支持 | 原生支持 |
| Agent 部署 | 不支持 | 不支持 | 原生支持 |
如果你的用户主要在中国或亚太地区,EdgeOne Makers 的边缘节点覆盖和国内加速是最大优势。另外平台目前处于公测阶段,限制相对较少。
迁移的整体思路
不管从哪个平台迁过来,核心步骤都是一样的:
1. 记录原平台的构建配置(构建命令、输出目录)
2. 迁移配置文件(重定向、请求头等)
3. 迁移函数代码(语法适配)
4. 在 Makers 创建新项目并部署
5. 配置自定义域名
6. 切换 DNS 解析
下面分别讲从 Vercel 和 Cloudflare 迁移的具体操作。
从 Vercel 迁移
第一步: 记录构建配置
登录 Vercel 控制台,找到你的项目,进入 Settings -> General,在 Build and Development Settings 面板里记下两个关键信息:
- Build Command(构建命令),比如
npm run build - Output Directory(输出目录),比如
dist或build
这两个信息后面在 Makers 创建项目时需要填。
第二步: 迁移配置文件
如果你用了 vercel.json 来配置重定向或自定义请求头,需要把这些配置迁移到 edgeone.json。两个平台的配置语法非常相似,大部分情况下改改格式就行。
原来在 Vercel 的 vercel.json:
{
"redirects": [
{
"source": "/articles",
"destination": "/blog",
"statusCode": 301
}
],
"rewrites": [
{
"source": "/assets/*",
"destination": "/assets-new/:splat"
}
],
"headers": [
{
"source": "/(.*)",
"headers": [
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "Cache-Control",
"value": "max-age=7200"
}
]
}
]
}
迁移到 Makers 的 edgeone.json:
{
"redirects": [
{
"source": "/articles",
"destination": "/blog",
"statusCode": 301
}
],
"rewrites": [
{
"source": "/assets/*",
"destination": "/assets-new/:splat"
}
],
"headers": [
{
"source": "/*",
"headers": [
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "Cache-Control",
"value": "max-age=7200"
}
]
}
]
}
主要区别在于 headers 的 source 匹配语法,Vercel 用 /(.*) 这种正则写法,Makers 用 /* 这种通配符写法。其他部分基本一样。
第三步: 迁移函数代码
Vercel Functions 和 Makers Functions 的写法有差异,需要适配。
Vercel 的函数写法:
// Vercel Functions
export const dynamic = 'force-dynamic';
export function POST(request) {
return new Response('Hello world');
}
Makers 的函数写法:
// Makers Functions
export default function onRequestPost(context) {
return new Response('Hello world');
}
核心差异:
| 对比点 | Vercel | Makers |
|---|---|---|
| 函数导出方式 | 导出具名函数(GET/POST) | 导出 onRequest 系列函数 |
| 请求参数 | 直接接收 Request 对象 | 接收 context 对象,包含请求和环境变量 |
| HTTP 方法路由 | 导出函数名决定方法 | onRequestGet/onRequestPost 等 |
| 响应方式 | Response 对象 | Response 对象,写法相同 |
GET 请求的迁移示例:
// Vercel: GET 请求
export function GET(request) {
const url = new URL(request.url);
const name = url.searchParams.get('name');
return Response.json({ message: `Hello ${name}` });
}
// Makers: GET 请求
export default function onRequestGet(context) {
const url = new URL(context.request.url);
const name = url.searchParams.get('name');
return Response.json({ message: `Hello ${name}` });
}
第四步: 在 Makers 创建项目
- 登录腾讯云控制台,进入 Makers
- 点创建项目,选择你的 GitHub 仓库
- 填入之前记录的构建命令和输出目录
- 点开始部署
第五步: 切换域名
这一步要尽量减少停机时间。
- 在 Makers 项目设置里添加你的自定义域名,获取 CNAME 记录值
- 先去 DNS 服务商那里,把原来指向 Vercel 的记录删掉
- 添加新的 CNAME 记录,指向 Makers 提供的值
- 等待 DNS 生效(通常几分钟到几小时)
如果你不想有任何停机时间,可以先让 Makers 用默认的 .pages.dev 类域名跑起来验证没问题,再切域名。
从 Cloudflare Pages 迁移
第一步: 对照功能差异
Cloudflare Pages 和 EdgeOne Makers 的功能对应关系:
| Cloudflare Pages | EdgeOne Makers | 说明 |
|---|---|---|
| Pages 静态托管 | Makers 静态托管 | 基本相同 |
| Pages Functions | Makers Functions | 语法有差异,需要适配 |
| wrangler.toml | edgeone.json | 配置文件格式不同 |
| KV 存储 | Edge KV | 概念相同,API 不同 |
| D1 数据库 | 无内置数据库 | 需要对接外部数据库 |
| R2 存储 | Blob 存储 | 概念类似 |
第二步: 迁移配置文件
Cloudflare Pages 的 _routes.json 和 _headers 文件需要迁移到 edgeone.json:
原来在 Cloudflare 的 _routes.json:
{
"version": 1,
"include": ["/api/*"],
"exclude": ["/static/*"]
}
对应的 edgeone.json 配置:
{
"routes": {
"include": ["/api/*"],
"exclude": ["/static/*"]
}
}
原来在 Cloudflare 的 _headers 文件:
/*
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
/assets/*
Cache-Control: max-age=31536000
迁移到 edgeone.json:
{
"headers": [
{
"source": "/*",
"headers": [
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "X-Content-Type-Options",
"value": "nosniff"
}
]
},
{
"source": "/assets/*",
"headers": [
{
"key": "Cache-Control",
"value": "max-age=31536000"
}
]
}
]
}
第三步: 迁移函数代码
Cloudflare Pages Functions 和 Makers Functions 的对比:
// Cloudflare Pages Functions
// functions/api/hello.js
export async function onRequestGet(context) {
const { env, request } = context;
return Response.json({ message: 'Hello from Cloudflare' });
}
// Makers Functions
// cloud-functions/api/hello.js
export default function onRequestGet(context) {
const { request } = context;
return Response.json({ message: 'Hello from Makers' });
}
主要差异:
| 对比点 | Cloudflare Pages | Makers |
|---|---|---|
| 文件位置 | functions/ 目录 | cloud-functions/ 或 edge-functions/ 目录 |
| 导出方式 | 具名导出 onRequestGet | 默认导出 onRequestGet |
| env 访问 | context.env | context 对象或环境变量 |
| 函数类型 | 只有 Pages Functions | Edge Functions + Cloud Functions |
第四步: 处理 KV 存储迁移
如果你在 Cloudflare 用了 KV 存储,迁移到 Makers 的 Edge KV 需要改写 API 调用:
// Cloudflare KV 写入
await env.MY_KV.put('key', 'value');
// Cloudflare KV 读取
const value = await env.MY_KV.get('key');
// Makers Edge KV 写入
await context.storage.put('key', 'value');
// Makers Edge KV 读取
const value = await context.storage.get('key');
具体 API 可能因函数类型不同而有差异,建议参考 Edge KV 的文档确认最新的调用方式。
第五步: 部署和验证
流程和 Vercel 迁移一样,在 Makers 控制台创建项目、关联仓库、配置构建参数、部署。部署成功后切换到域名管理页面配置自定义域名。
迁移检查清单
不管从哪个平台迁移,完成部署后逐项检查:
| 检查项 | 操作 | 状态 |
|---|---|---|
| 页面能正常访问 | 逐个检查主要页面 | |
| 重定向规则生效 | 测试所有重定向路径 | |
| 自定义请求头生效 | 用浏览器开发者工具检查响应头 | |
| 函数正常运行 | 调用所有 API 接口测试 | |
| 环境变量正确配置 | 检查所有环境变量是否迁移 | |
| 自定义域名绑定 | DNS 记录是否指向 Makers | |
| HTTPS 证书 | SSL 证书是否正常 | |
| 静态资源加载 | CSS、JS、图片等资源是否 404 |
回退方案
迁移过程中万一出问题,需要有回退方案。建议迁移期间不要急着删原平台的项目,保留一到两周的观察期。
迁移期间:
- 原平台项目保持运行,不要删除
- DNS 切到 Makers 后持续观察
- 如果有问题,DNS 切回原平台即可恢复
- 观察一到两周确认稳定后,再清理原平台资源
DNS 切换回退很快,通常几分钟就能生效。这比数据丢失或者长时间停机要好得多。
速查卡片
| 要点 | 说明 |
|---|---|
| 迁移核心步骤 | 记录配置 -> 迁移配置文件 -> 适配函数代码 -> 部署 -> 切域名 |
| vercel.json 到 edgeone.json | 语法相似,headers 的 source 匹配语法不同 |
| Vercel 函数迁移 | 导出方式从具名函数改为 onRequest 系列函数 |
| Cloudflare 函数迁移 | 目录从 functions/ 改为 cloud-functions/ 或 edge-functions/ |
| 配置对比 | Vercel 用 vercel.json,Cloudflare 用 wrangler.toml,Makers 用 edgeone.json |
| 域名切换 | 先绑 Makers 域名获取 CNAME,再改 DNS 解析 |
| 回退策略 | 保留原平台项目一到两周,出问题直接切回 DNS |
| 迁移后验证 | 页面、重定向、请求头、函数、环境变量、域名、HTTPS、静态资源 |