[ SKILL_DOCUMENTATION ]
# Workerd 模式
## 多服务架构
capnp
const config :Workerd.Config = (
services = [
(name = "frontend", worker = (
modules = [(name = "index.js", esModule = embed "frontend/index.js")],
compatibilityDate = "2024-01-15",
bindings = [(name = "API", service = "api")]
)),
(name = "api", worker = (
modules = [(name = "index.js", esModule = embed "api/index.js")],
compatibilityDate = "2024-01-15",
bindings = [(name = "DB", service = "postgres"), (name = "CACHE", kvNamespace = "kv")]
)),
(name = "postgres", external = (address = "db.internal:5432", http = ())),
(name = "kv", disk = (path = "/var/kv", writable = true))
],
sockets = [(name = "http", address = "*:8080", http = (), service = "frontend")]
);
## Durable Objects
capnp
const worker :Workerd.Worker = (
modules = [(name = "index.js", esModule = embed "index.js"), (name = "room.js", esModule = embed "room.js")],
compatibilityDate = "2024-01-15",
bindings = [(name = "ROOMS", durableObjectNamespace = "Room")],
durableObjectNamespaces = [(className = "Room", uniqueKey = "v1")],
durableObjectStorage = (localDisk = "/var/do")
);
## 开发环境与生产环境配置
capnp
# 使用参数绑定实现环境特定配置
const baseWorker :Workerd.Worker = (
modules = [(name = "index.js", esModule = embed "src/index.js")],
compatibilityDate = "2024-01-15",
bindings = [(name = "API_URL", parameter = (type = text))]
);
const prodWorker :Workerd.Worker = (
inherit = "base-service",
bindings = [(name = "API_URL", text = "https://api.prod.com")]
);
## HTTP 反向代理
capnp
services = [
(name = "proxy", worker = (serviceWorkerScript = embed "proxy.js", compatibilityDate = "2024-01-15", bindings = [(name = "BACKEND", service = "backend")])),
(name = "backend", external = (address = "internal:8080", http = ()))
]
## 本地开发
**推荐:** 使用 Wrangler
bash
wrangler dev # 内部使用 workerd
**直接使用 workerd:**
bash
workerd serve config.capnp --socket-addr http=*:3000 --verbose
**环境变量:**
capnp
bindings = [(name = "DATABASE_URL", fromEnvironment = "DATABASE_URL")]
## 测试
bash
workerd test config.capnp
workerd test config.capnp --test-only=test.js
测试文件必须包含在 `modules = [...]` 配置中。
## 生产部署
### 编译二进制文件 (推荐)
bash
workerd compile config.capnp myConfig -o production-server