边缘计算×前端:Cloudflare Workers/Vercel Edge 让你的网站快到离谱

前端工程(更新于 2026年6月2日)

为什么前端需要边缘计算?

传统架构中,用户请求需要穿越半个互联网到达源站服务器:

用户(东京)→ CDN 节点(东京,仅缓存静态)→ 源站(美西,动态计算)
延迟:~10ms          ~150ms 跨太平洋                ~50ms 计算
总计:~210ms

边缘计算把计算逻辑推到离用户最近的节点

用户(东京)→ Edge 节点(东京,直接计算)
延迟:~10ms        ~5ms 本地计算
总计:~15ms

14 倍延迟降低——这就是边缘计算的威力。


三大边缘平台对比

维度 Cloudflare Workers Vercel Edge Functions Deno Deploy
运行时 V8 Isolate V8 Isolate Deno
冷启动 <5ms <5ms ~20ms
全球节点 300+ 城市 30+ 区域 35+ 区域
免费额度 10万次/天 按项目计费 100万次/月
语言 JS/TS/WASM JS/TS JS/TS/WASM
包大小限制 10MB 4MB 无限制
KV 存储 Workers KV Edge Config Deno KV
框架集成 框架无关 Next.js 深度集成 Fresh

实战场景一:Geo 路由

根据用户地理位置路由到不同内容,零延迟

// Cloudflare Workers
export default {
  async fetch(request: Request, env: Env, ctx: ExecutionContext) {
    const country = request.cf?.country as string;

    const routes: Record<string, string> = {
      CN: 'https://cn.example.com',
      JP: 'https://jp.example.com',
      US: 'https://us.example.com',
      EU: 'https://eu.example.com',
    };

    const target = routes[country] || routes['US'];

    return Response.redirect(target, 302);
  },
};

Vercel Edge 版本

// middleware.ts (Next.js)
import { NextRequest, NextResponse } from 'next/server';

export function middleware(request: NextRequest) {
  const country = request.geo?.country || 'US';

  const localeMap: Record<string, string> = {
    CN: '/zh-CN',
    TW: '/zh-TW',
    JP: '/ja',
  };

  const locale = localeMap[country] || '/en';

  if (!request.nextUrl.pathname.startsWith(locale)) {
    return NextResponse.redirect(new URL(locale, request.url));
  }

  return NextResponse.next();
}

export const config = {
  matcher: ['/((?!api|_next/static).*)'],
};

实战场景二:A/B 测试

无需客户端 JS,在边缘层直接分流:

export default {
  async fetch(request: Request, env: Env) {
    const url = new URL(request.url);

    // 读取或分配实验组
    let variant = getCookie(request, 'ab-variant');

    if (!variant) {
      variant = Math.random() < 0.5 ? 'control' : 'experiment';
    }

    // 从 KV 读取对应版本的 HTML
    const html = await env.KV.get(`landing:${variant}`);

    const response = new Response(html, {
      headers: { 'Content-Type': 'text/html' },
    });

    // 设置 Cookie 保持分组一致性
    response.headers.append(
      'Set-Cookie',
      `ab-variant=${variant}; Path=/; Max-Age=86400`
    );

    return response;
  },
};

function getCookie(request: Request, name: string): string | null {
  const cookies = request.headers.get('Cookie') || '';
  const match = cookies.match(new RegExp(`${name}=([^;]+)`));
  return match ? match[1] : null;
}

优势对比

方案 首屏闪烁 性能影响 SEO 友好 实现复杂度
客户端 JS 分流 ❌ 闪烁 降低 LCP
服务端分流 ✅ 无闪烁 增加延迟
边缘分流 ✅ 无闪烁 几乎无影响

实战场景三:个性化内容

export default {
  async fetch(request: Request, env: Env) {
    const country = request.cf?.country;
    const timezone = request.cf?.timezone;

    // 根据时区显示本地时间
    const localTime = new Date().toLocaleTimeString('zh-CN', {
      timeZone: timezone,
    });

    // 根据国家显示本地货币
    const currencyMap: Record<string, { symbol: string; rate: number }> = {
      CN: { symbol: '¥', rate: 7.2 },
      JP: { symbol: '¥', rate: 150 },
      US: { symbol: '$', rate: 1 },
    };

    const currency = currencyMap[country] || currencyMap['US'];

    // 获取基础页面并注入个性化数据
    const response = await fetch(request);
    const html = await response.text();

    const personalized = html
      .replace('{{LOCAL_TIME}}', localTime)
      .replace('{{CURRENCY_SYMBOL}}', currency.symbol);

    return new Response(personalized, {
      headers: response.headers,
    });
  },
};

实战场景四:API 聚合与缓存

在边缘层聚合多个 API,减少客户端请求:

export default {
  async fetch(request: Request, env: Env, ctx: ExecutionContext) {
    const cache = caches.default;
    const cacheKey = new Request(request.url);

    // 1. 检查边缘缓存
    let response = await cache.match(cacheKey);
    if (response) return response;

    // 2. 并行请求多个 API
    const [user, posts, notifications] = await Promise.all([
      fetch('https://api.example.com/user', { headers: request.headers }),
      fetch('https://api.example.com/posts?limit=10'),
      fetch('https://api.example.com/notifications/unread'),
    ]);

    // 3. 聚合响应
    const data = {
      user: await user.json(),
      posts: await posts.json(),
      notifications: await notifications.json(),
    };

    response = new Response(JSON.stringify(data), {
      headers: {
        'Content-Type': 'application/json',
        'Cache-Control': 'public, max-age=60',
      },
    });

    // 4. 写入边缘缓存
    ctx.waitUntil(cache.put(cacheKey, response.clone()));

    return response;
  },
};

边缘 KV 存储:全球低延迟数据库

Cloudflare Workers KV

// 写入
await env.KV.put('user:123:preferences', JSON.stringify({
  theme: 'dark',
  language: 'zh-CN',
}));

// 读取(最终一致性,~60s 全球同步)
const prefs = await env.KV.get('user:123:preferences', 'json');

// 列表
const list = await env.KV.list({ prefix: 'user:123:' });

Vercel Edge Config

import { get } from '@vercel/edge-config';

// 读取配置(全球同步,~1s 延迟)
const flags = await get('feature-flags');

if (flags?.newHomepage) {
  return newHomepage();
}
return oldHomepage();

从传统架构迁移

迁移路径

阶段 1:静态资源上 CDN(1-2 天)
  → HTML/JS/CSS/图片 → CDN 边缘缓存
  → 动态请求仍走源站

阶段 2:边缘中间件(1-2 周)
  → 重定向、A/B 测试、Geo 路由 → Edge
  → 业务逻辑仍在源站

阶段 3:轻量 API 边缘化(2-4 周)
  → 读多写少的 API → Edge + KV
  → 写操作仍走源站

阶段 4:重度逻辑边缘化(按需)
  → SSR → Edge SSR
  → 流式响应 → Edge Streaming

注意事项

限制 说明 应对
无 Node.js API 没有 fspath 使用 Web API 替代
执行时间限制 Workers: 30ms (免费) / 30s (付费) 拆分长任务
包大小限制 Workers: 10MB Tree-shaking、WASM
无全局状态 每次请求独立 Isolate 使用 KV/D1 持久化
冷启动虽快但非零 V8 Isolate ~5ms 预热关键路由

性能实测

工具库网站使用 Cloudflare CDN + 静态导出架构:

指标              传统 SSR    边缘静态
TTFB              200-500ms   10-30ms
LCP               1.5-3s      0.3-0.8s
全球 P50 延迟     150ms       15ms
全球 P99 延迟     800ms       50ms

总结

边缘计算是前端性能优化的终极武器——不是在服务器上优化 50ms,而是把 150ms 的网络延迟降到 5ms。2026 年,如果你的动态页面还没有跑在边缘上,你正在给用户白白浪费 100ms+ 的等待时间。从 Geo 路由、A/B 测试到 API 聚合,边缘计算让前端开发者拥有了"在全球 300+ 城市部署代码"的超能力。

本站提供浏览器本地工具,免注册即可试用 →

#边缘计算#CDN#Edge Functions#性能优化#Cloudflare Workers