如何为使用Node Adapter构建的SvelteKit生产环境配置路由?
方案1:将SvelteKit与Express后端整合为单个服务
这是最直接的解决方式,既然你本身用Express做后端,直接把SvelteKit的生产构建产物挂载到Express服务里,同时保留后端API路由即可。
步骤:
- 先正常构建SvelteKit项目:
npm run build
构建完成后会生成build目录。
- 修改你的Express主文件(比如
server.js),引入SvelteKit的Node Adapter处理静态资源和页面路由,同时挂载你的API路由:
import express from 'express'; import { handler } from './build/handler.js'; const app = express(); // 先挂载你的后端API路由,比如所有/api开头的接口 app.use('/api', yourApiRouter); // 替换成你实际的API路由实例 // 再挂载SvelteKit的处理程序,处理所有非API的请求(页面、静态资源等) app.use(handler); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
- 启动服务时直接运行这个Express文件:
node server.js
这样前端Axios请求/api/xxx会直接被Express的API路由处理,不存在跨域问题,也不需要额外代理配置。
方案2:在SvelteKit中配置服务端请求转发(hooks.server.js)
如果不想把两者整合到同一个服务,也可以在SvelteKit的服务端钩子中配置请求转发,把前端的API请求转交到后端服务器。
步骤:
- 在SvelteKit项目根目录创建
src/hooks.server.js文件,添加以下代码:
import { proxy } from 'http-proxy-middleware'; // 创建代理实例 const apiProxy = proxy({ target: 'http://your-backend-server:port', // 替换成你的后端实际地址 changeOrigin: true, pathRewrite: { '^/api': '' // 如果后端API没有/api前缀,就把前端请求的/api前缀去掉,根据实际情况调整 } }); export async function handle({ event, resolve }) { // 匹配所有/api开头的请求,转发到后端 if (event.url.pathname.startsWith('/api')) { return new Promise((resolve, reject) => { apiProxy(event.request, event.response, (err) => { if (err) reject(err); }); }); } // 其他请求交给SvelteKit处理 return resolve(event); }
先安装依赖:
npm install http-proxy-middleware
- 构建项目后,启动SvelteKit的生产服务:
node build/index.js
前端发送的/api/xxx请求会被自动转发到后端服务器。
关键注意事项
- 开发环境的Vite代理配置可以保留,生产环境不需要额外修改。
- 方案1中,Express和SvelteKit共用一个端口,彻底避免跨域问题。
- Axios的baseURL在生产环境直接设为
/api即可,两种方案都能正确处理请求路由。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

