<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Maysee&apos;s Blog</title><description>Tech Tales &amp; Life Adventures</description><link>https://mayseee.com/</link><language>en</language><item><title>告别手动部署的苦日子：把你的前端项目丢到 Cloudflare Workers 上</title><link>https://mayseee.com/posts/cloudflare-worker/</link><guid isPermaLink="true">https://mayseee.com/posts/cloudflare-worker/</guid><description>以我的个人主页为例，手把手教你如何将前端项目部署到 Cloudflare Workers，并配置 GitHub Actions 实现推代码即部署的极致体验。</description><pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言：为什么我们都讨厌手动部署？&lt;/h2&gt;
&lt;p&gt;还记得上次凌晨两点，你战战兢兢地把代码手动部署到服务器，然后发现网站挂了的经历吗？😱&lt;/p&gt;
&lt;p&gt;每次发布新版本都像在走钢丝：&lt;code&gt;npm run build&lt;/code&gt;、压缩文件、FTP上传、祈祷不要出错...这一套流程下来，咖啡都凉了三遍。更别提那种&quot;我明明记得上传了新文件啊&quot;的灵魂拷问时刻。&lt;/p&gt;
&lt;p&gt;今天，让我们一起摆脱这种石器时代的部署方式，拥抱自动化的美好生活！我将以我的个人主页为例，手把手教你如何将前端项目部署到 Cloudflare Workers，并配置 GitHub Actions 实现推代码即部署的极致体验。&lt;/p&gt;
&lt;h2&gt;为什么选择 Cloudflare Workers？&lt;/h2&gt;
&lt;p&gt;在开始动手之前，让我先安利一下为什么 Cloudflare Workers 值得你花时间学习：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;🚀 &lt;strong&gt;全球秒级部署&lt;/strong&gt;：你的网站会被自动分发到全球 300+ 个数据中心，用户访问时自动连接最近的节点&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;零冷启动&lt;/strong&gt;：不同于传统容器，Workers 使用 V8 Isolate 技术，启动速度快到让你怀疑人生&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;白嫖党福音&lt;/strong&gt;：每天 10 万次免费请求，对个人项目来说绰绰有余&lt;/li&gt;
&lt;li&gt;🛡️ &lt;strong&gt;自带防护盾&lt;/strong&gt;：继承了 Cloudflare 的 DDoS 防护和 WAF，黑客看了都要绕道走&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第一步：把现有项目搬到 Workers 上&lt;/h2&gt;
&lt;h3&gt;1. 准备工作&lt;/h3&gt;
&lt;p&gt;首先，确保你有一个 Cloudflare 账号（没有的话赶紧&lt;a href=&quot;https://dash.cloudflare.com/sign-up&quot;&gt;注册一个&lt;/a&gt;），然后安装 Wrangler CLI 工具：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install wrangler --save-dev
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 配置你的 Worker&lt;/h3&gt;
&lt;p&gt;对于已有的前端项目，我们需要创建两个关键文件：&lt;/p&gt;
&lt;h4&gt;创建 &lt;code&gt;wrangler.jsonc&lt;/code&gt; 配置文件&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;my-blog&quot;, // 项目名
  &quot;compatibility_date&quot;: &quot;2025-08-01&quot;, // 根据这个日期，决定用哪个版本的wrangler运行时环境
  &quot;assets&quot;: {
    &quot;directory&quot;: &quot;./dist&quot;,	// 静态网站的发布文件夹
    &quot;binding&quot;: &quot;ASSETS&quot;,
    &quot;not_found_handling&quot;: &quot;404-page&quot;	// for SSG
  },
  &quot;main&quot;: &quot;index.ts&quot;,
  &quot;observability&quot;: {
    &quot;enabled&quot;: true,
    &quot;head_sampling_rate&quot;: 1
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::TIP
如果你的项目是 SPA（单页应用），需要额外配置路由，让所有路径都返回 &lt;code&gt;index.html&lt;/code&gt;。具体配置可以参考&lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/routing/single-page-application/&quot;&gt;官方 SPA 指南&lt;/a&gt;。
:::&lt;/p&gt;
&lt;h4&gt;创建 Worker 脚本 &lt;code&gt;index.ts&lt;/code&gt;&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Worker 的环境接口，告诉 TypeScript 我们有哪些绑定
interface Env {
  ASSETS: Fetcher;
}

export default {
  async fetch(request, env): Promise&amp;lt;Response&amp;gt; {
    const url = new URL(request.url);
    
    // 预留 API 路由，方便未来扩展
    // 比如添加访问统计、留言板等功能
    if (url.pathname.startsWith(&quot;/api/&quot;)) {
      // 现在先返回个友好的提示
      return new Response(&quot;API 功能开发中，敬请期待! 🚧&quot;);
    }
    
    // 其他请求都交给静态资源处理
    // Workers 会自动处理缓存、压缩等优化
    return env.ASSETS.fetch(request);
  },
} satisfies ExportedHandler&amp;lt;Env&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 获取 API Token&lt;/h3&gt;
&lt;p&gt;部署需要授权，让我们创建一个权限受限的 API Token：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录 &lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;Cloudflare 仪表板&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;进入 左侧&lt;strong&gt;管理帐户&lt;/strong&gt; → &lt;strong&gt;帐户 API 令牌&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;创建令牌&lt;/strong&gt;，选择 &lt;strong&gt;编辑 Cloudflare Workers&lt;/strong&gt; 模板&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;:::caution
永远不要把 API Token 提交到代码仓库！这就像把家门钥匙贴在门上一样危险。
:::&lt;/p&gt;
&lt;h3&gt;4. 首次手动部署&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 构建你的项目
npm run build

# 部署到 Workers
npx wrangler deploy

# 如果遇到网络问题（你懂的）
HTTPS_PROXY=http://你的代理地址:端口 npx wrangler deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;部署成功后，你会获得一个 &lt;code&gt;*.workers.dev&lt;/code&gt; 的免费域名。虽然能用，但不够酷对吧？接下来让我们绑定自己的域名！&lt;/p&gt;
&lt;h2&gt;第二步：绑定自定义域名&lt;/h2&gt;
&lt;h3&gt;1. 把域名dns设置为 Cloudflare&lt;/h3&gt;
&lt;p&gt;如果你的域名在其他服务商那里，配置她的dns：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;a href=&quot;https://dash.cloudflare.com/&quot;&gt;Cloudflare 仪表板&lt;/a&gt; 点击 &lt;strong&gt;加入域&lt;/strong&gt;
&lt;img src=&quot;./image-20250826162033944.png&quot; alt=&quot;image-20250826162033944&quot; /&gt;&lt;/li&gt;
&lt;li&gt;输入你的域名&lt;/li&gt;
&lt;li&gt;按照提示修改域名的 DNS 服务器&lt;/li&gt;
&lt;li&gt;添加一条 A 记录：&lt;code&gt;www → 2.2.2.2&lt;/code&gt;（这是个占位 IP，让代理模式生效）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;./image-20250826163635160.png&quot; alt=&quot;DNS配置示例&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2. 配置 Worker 路由&lt;/h3&gt;
&lt;p&gt;在 Worker 的设置页面，找到 &lt;strong&gt;触发器&lt;/strong&gt; → &lt;strong&gt;自定义域&lt;/strong&gt;，添加你的域名。
&lt;img src=&quot;./image-20250826163930227.png&quot; alt=&quot;image-20250826163930227&quot; /&gt;&lt;/p&gt;
&lt;p&gt;或者更优雅的方式，在 &lt;code&gt;wrangler.jsonc&lt;/code&gt; 中配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
...
&quot;route&quot;: {
    &quot;pattern&quot;: &quot;example.org/*&quot;,
    &quot;zone_name&quot;: &quot;example.org&quot;
  },
...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第三步：GitHub Actions 自动化部署&lt;/h2&gt;
&lt;p&gt;手动部署只是开始，真正的快乐是推代码即部署！&lt;/p&gt;
&lt;h3&gt;1. 创建 GitHub Actions 工作流&lt;/h3&gt;
&lt;p&gt;在项目根目录创建 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: 自动部署到 Cloudflare Workers 🚀

on:
  push:
    branches:
      - main  # 监听 main 分支的推送
  pull_request:
    branches:
      - main  # PR 时也可以预览部署

jobs:
  deploy:
    runs-on: ubuntu-latest
    name: 构建并部署
    timeout-minutes: 10  # 避免任务卡死

    steps:
      # 检出代码
      - name: 📥 拉取代码
        uses: actions/checkout@v4

      # 设置 Node.js 环境
      - name: 📦 配置 Node.js
        uses: actions/setup-node@v4
        with:
          node-version: &apos;20&apos;
          cache: &apos;npm&apos;  # 缓存依赖，加速构建
          
      # 安装依赖
      - name: 🔧 安装依赖
        run: npm ci  # 使用 ci 而不是 install，更快更稳定

      # 构建项目
      - name: 🏗️ 构建项目
        run: npm run build

      # 部署到 Workers
      - name: 🚀 部署到 Cloudflare
        uses: cloudflare/wrangler-action@v3
        with:
          wranglerVersion: &apos;4.33.0&apos;
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          command: deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 配置 GitHub Secrets&lt;/h3&gt;
&lt;p&gt;在 GitHub 仓库的 &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Secrets and variables&lt;/strong&gt; → &lt;strong&gt;Actions&lt;/strong&gt; 中添加：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt;：你之前生成的 API Token&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CLOUDFLARE_ACCOUNT_ID&lt;/code&gt;：在 Cloudflare 仪表板可以找到&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-20250827112903783.png&quot; alt=&quot;image-20250827112903783&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在，每次你推送代码到 &lt;code&gt;main&lt;/code&gt; 分支，GitHub Actions 就会自动帮你部署。去喝杯咖啡，回来就能看到网站更新了！&lt;/p&gt;
&lt;h2&gt;进阶技巧：让你的部署更专业&lt;/h2&gt;
&lt;h3&gt;1. 多环境部署&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;wrangler.jsonc&lt;/code&gt; 中配置多个环境：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;my-worker&quot;,
  &quot;main&quot;: &quot;src/index.js&quot;,
  &quot;compatibility_date&quot;: &quot;2024-07-12&quot;,
  &quot;workers_dev&quot;: false,
  &quot;route&quot;: {
    &quot;pattern&quot;: &quot;example.org/*&quot;,
    &quot;zone_name&quot;: &quot;example.org&quot;
  },
  &quot;kv_namespaces&quot;: [
    {
      &quot;binding&quot;: &quot;&amp;lt;MY_NAMESPACE&amp;gt;&quot;,
      &quot;id&quot;: &quot;&amp;lt;KV_ID&amp;gt;&quot;
    }
  ],
  // 在这里配置staging环境
  &quot;env&quot;: {
    &quot;staging&quot;: {
      &quot;name&quot;: &quot;my-worker-staging&quot;,
      &quot;route&quot;: {
        &quot;pattern&quot;: &quot;staging.example.org/*&quot;,
        &quot;zone_name&quot;: &quot;example.org&quot;
      },
      &quot;kv_namespaces&quot;: [
        {
          &quot;binding&quot;: &quot;&amp;lt;MY_NAMESPACE&amp;gt;&quot;,
          &quot;id&quot;: &quot;&amp;lt;STAGING_KV_ID&amp;gt;&quot;
        }
      ]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在 GitHub Actions 中根据分支部署到不同环境：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- name: 部署到预发环境
  if: github.ref == &apos;refs/heads/develop&apos;
  run: npx wrangler deploy --env staging
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 使用 Workers KV 存储&lt;/h3&gt;
&lt;p&gt;需要存储一些数据？Workers KV 是个不错的选择：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
...
  &quot;kv_namespaces&quot;: [
    {
      &quot;binding&quot;: &quot;BLOG_DATA&quot;,
      &quot;id&quot;: &quot;&amp;lt;YOUR_BINDING_ID&amp;gt;&quot;
    }
  ]
...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在代码中使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 存储访问计数
await env.BLOG_DATA.put(&quot;visit_count&quot;, &quot;12345&quot;);

// 读取数据
const count = await env.BLOG_DATA.get(&quot;visit_count&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更多关于kv-cache可以参考：https://developers.cloudflare.com/kv/&lt;/p&gt;
&lt;h2&gt;常见问题排查&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q: 部署失败，提示认证错误？&lt;/strong&gt; A: 检查 API Token 是否正确，以及是否有足够的权限。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 网站显示 404？&lt;/strong&gt; A: 确认 &lt;code&gt;wrangler.jsonc&lt;/code&gt; 中的 &lt;code&gt;directory&lt;/code&gt; 路径是否正确，以及构建产物是否存在。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: 如何处理大文件？&lt;/strong&gt; A: Workers 有 25MB 的限制，大文件建议使用 &lt;a href=&quot;https://www.cloudflare.com/developer-platform/products/r2/&quot;&gt;R2 对象存储&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参考链接：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Workers 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;Wrangler 配置详解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.github.com/actions&quot;&gt;GitHub Actions 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;https://www.tjsky.net/tutorial/430&lt;/li&gt;
&lt;li&gt;https://blog.pljzy.top/posts/astro/基于astro开发的fuwari静态博客模版配置cicd流程/&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>