[ PROMPT_NODE_24334 ]
Static Assets 设计模式
[ SKILL_DOCUMENTATION ]
### 常见模式
**1. 转发请求至资源:**
typescript
export default {
async fetch(request: Request, env: Env): Promise {
return env.ASSETS.fetch(request);
}
};
**2. 通过路径获取特定资源:**
typescript
const response = await env.ASSETS.fetch("https://assets.local/logo.png");
**3. 在获取资源前修改请求:**
typescript
const url = new URL(request.url);
url.pathname = "/index.html";
return env.ASSETS.fetch(new Request(url, request));
**4. 转换资源响应:**
typescript
const response = await env.ASSETS.fetch(request);
const modifiedResponse = new Response(response.body, response);
modifiedResponse.headers.set("X-Custom-Header", "value");
modifiedResponse.headers.set("Cache-Control", "public, max-age=3600");
return modifiedResponse;
**5. 条件化资源服务:**
typescript
export default {
async fetch(request: Request, env: Env): Promise {
const url = new URL(request.url);
if (url.pathname === '/') {
return env.ASSETS.fetch('/index.html');
}
return env.ASSETS.fetch(request);
}
};
**6. 带有 API 路由的单页应用 (SPA):**
最常见的全栈模式 - 静态 SPA 配合后端 API:
typescript
export default {
async fetch(request: Request, env: Env): Promise {
const url = new URL(request.url);
if (url.pathname.startsWith('/api/')) {
return handleAPI(request, env);
}
return env.ASSETS.fetch(request);
}
};
async function handleAPI(request: Request, env: Env): Promise {
return new Response(JSON.stringify({ status: 'ok' }), {
headers: { 'Content-Type': 'application/json' }
});
}
**配置:** 设置 `run_worker_first: ["/api/*"]` (参考 configuration.md:66-106)
**7. 受保护资源的权限控制:**
typescript
export default {
async fetch(request: Request, env: Env): Promise {
const url = new URL(request.url);
if (url.pathname.startsWith('/admin/')) {
const session = await validateSession(request, env);
if (!session) {
return Response.redirect('/login', 302);
}
}
return env.ASSETS.fetch(request);
}
};
**配置:** 设置 `run_worker_first: ["/admin/*"]`
**8. 用于安全的自定义响应头:**
typescript
export default {
async fetch(request: Request, env: Env): Promise {
const response = await env.ASSETS.fetch(request);
const secureResponse = new Response(response.body, response);
secureResponse