部署在Vercel上的Elysia无法提供静态文件问题咨询
问题原因及解决方案
核心原因
Vercel的Bun runtime与Elysia静态文件服务不兼容,主要源于以下几点:
- Vercel默认会优先接管
public目录下的静态文件请求,不会转发给Elysia处理 - Elysia的
static插件路径或优先级设置不当,导致静态请求无法匹配 - Vercel路由规则未配置,使得静态请求没有到达Elysia的处理逻辑
解决方案
方案1:让Elysia全权处理静态文件
- 正确配置Elysia的
static插件,确保路径和优先级正确:
import { Elysia } from 'elysia' import { staticPlugin } from '@elysiajs/static' const app = new Elysia() // 优先加载静态插件,确保静态请求先被处理 .use(staticPlugin({ assets: './public', // 指向你的静态文件目录 prefix: '/', // 根路径匹配所有静态请求 alwaysStatic: true // 强制静态服务优先,避免和其他路由冲突 })) // 其他业务路由 .get('/api/hello', () => 'Hello from API') .listen(process.env.PORT || 3000)
- 修改
vercel.json,让所有请求都转发到Elysia入口文件:
{ "functions": { "index.ts": { "runtime": "@vercel/bun@1.0.0" } }, "routes": [ { "src": "/(.*)", "dest": "index.ts" } ] }
- 检查
.vercelignore,确保没有忽略public目录:
# 不要包含这行: # public/
方案2:让Vercel接管静态文件(更轻量)
如果不需要Elysia处理静态文件,可以直接利用Vercel的原生静态服务:
- 将所有静态文件放在项目根目录的
public文件夹下 - 移除Elysia中的
static插件配置 - 修改
vercel.json,让API请求转发到Elysia,静态请求由Vercel直接处理:
{ "functions": { "index.ts": { "runtime": "@vercel/bun@1.0.0" } }, "routes": [ { "src": "/api/(.*)", "dest": "index.ts" }, { "src": "/(.*)", "dest": "/public/$1" } ] }
额外注意事项
- 确保
@elysiajs/static插件是最新版本,避免兼容性问题:
bun add @elysiajs/static@latest
- 部署前本地测试静态文件是否能正常访问,再推送到Vercel验证
内容的提问来源于stack exchange,提问作者PrasadB
相关产品推荐
相关产品推荐

