workers-migration

安装量: 50
排名: #14888

安装

npx skills add https://github.com/secondsky/claude-skills --skill workers-migration

Migrate existing applications to Cloudflare Workers from various platforms.

Migration Decision Tree

What are you migrating from?
├── AWS Lambda
│   └── Node.js handler? → Lambda adapter pattern
│   └── Python? → Consider Python Workers
│   └── Container/custom runtime? → May need rewrite
├── Vercel/Next.js
│   └── API routes? → Minimal changes with adapter
│   └── Full Next.js app? → Use OpenNext adapter
│   └── Middleware? → Direct Workers equivalent
├── Express/Node.js
│   └── Simple API? → Hono (similar API)
│   └── Complex middleware? → Gradual migration
│   └── Heavy node: usage? → Compatibility layer
└── Other Edge (Deno Deploy, Fastly)
    └── Standard Web APIs? → Minimal changes
    └── Platform-specific? → Targeted rewrites

Platform Comparison

| Cold Start | ~0ms | 100-500ms | 10-100ms | N/A

| CPU Limit | 50ms/10ms | 15 min | 10s | None

| Memory | 128MB | 10GB | 1GB | System

| Max Response | 6MB (stream unlimited) | 6MB | 4.5MB | None

| Global Edge | 300+ PoPs | Regional | ~20 PoPs | Manual

| Node.js APIs | Partial | Full | Full | Full

Top 10 Migration Errors

| fs is not defined | Lambda/Express | File system access | Use KV/R2 for storage

| Buffer is not defined | Node.js | Node.js globals | Import from node:buffer

| process.env undefined | All | Env access pattern | Use env parameter

| setTimeout not returning | Lambda | Async patterns | Use ctx.waitUntil()

| require() not found | Express | CommonJS | Convert to ESM imports

| Exceeded CPU time | All | Long computation | Chunk or use DO

| body already consumed | Express | Request body | Clone before read

| Headers not iterable | Lambda | Headers API | Use Headers constructor

| crypto.randomBytes | Node.js | Node crypto | Use crypto.getRandomValues

| Cannot find module | All | Missing polyfill | Check Workers compatibility

Quick Migration Patterns

AWS Lambda Handler

// Before: AWS Lambda
export const handler = async (event, context) => {
  const body = JSON.parse(event.body);
  return {
    statusCode: 200,
    body: JSON.stringify({ message: 'Hello' }),
  };
};

// After: Cloudflare Workers
export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const body = await request.json();
    return Response.json({ message: 'Hello' });
  },
};

Express Middleware

// Before: Express
app.use((req, res, next) => {
  if (!req.headers.authorization) {
    return res.status(401).json({ error: 'Unauthorized' });
  }
  next();
});

// After: Hono Middleware
app.use('*', async (c, next) => {
  if (!c.req.header('Authorization')) {
    return c.json({ error: 'Unauthorized' }, 401);
  }
  await next();
});

Environment Variables

// Before: Node.js
const apiKey = process.env.API_KEY;

// After: Workers
export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const apiKey = env.API_KEY;
    // ...
  },
};

Node.js Compatibility

Workers support many Node.js APIs via compatibility flags:

// wrangler.jsonc
{
  "compatibility_flags": ["nodejs_compat_v2"],
  "compatibility_date": "2024-12-01"
}

Supported with nodejs_compat_v2:

  • crypto (most methods)

  • buffer (Buffer class)

  • util (promisify, types)

  • stream (Readable, Writable)

  • events (EventEmitter)

  • path (all methods)

  • string_decoder

  • assert

Not Supported (need alternatives):

  • fs → Use R2/KV

  • child_process → Not possible

  • cluster → Not applicable

  • dgram → Not supported

  • net → Use fetch/WebSocket

  • tls → Handled by platform

When to Load References

| references/lambda-migration.md | Migrating AWS Lambda functions

| references/vercel-migration.md | Migrating from Vercel/Next.js

| references/express-migration.md | Migrating Express/Node.js apps

| references/node-compatibility.md | Node.js API compatibility issues

Migration Checklist

  • Analyze Dependencies: Check for unsupported Node.js APIs

  • Convert to ESM: Replace require() with import

  • Update Env Access: Use env parameter instead of process.env

  • Replace File System: Use R2/KV for storage

  • Handle Async: Use ctx.waitUntil() for background tasks

  • Test Locally: Verify with wrangler dev

  • Performance Test: Ensure CPU limits aren't exceeded

See Also

  • workers-runtime-apis - Available APIs in Workers

  • workers-performance - Optimization techniques

  • cloudflare-worker-base - Basic Workers setup

返回排行榜