You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为使用Node Adapter构建的SvelteKit生产环境配置路由?

方案1:将SvelteKit与Express后端整合为单个服务

这是最直接的解决方式,既然你本身用Express做后端,直接把SvelteKit的生产构建产物挂载到Express服务里,同时保留后端API路由即可。

步骤:

  1. 先正常构建SvelteKit项目:
npm run build

构建完成后会生成build目录。

  1. 修改你的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}`);
});
  1. 启动服务时直接运行这个Express文件:
node server.js

这样前端Axios请求/api/xxx会直接被Express的API路由处理,不存在跨域问题,也不需要额外代理配置。

方案2:在SvelteKit中配置服务端请求转发(hooks.server.js)

如果不想把两者整合到同一个服务,也可以在SvelteKit的服务端钩子中配置请求转发,把前端的API请求转交到后端服务器。

步骤:

  1. 在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
  1. 构建项目后,启动SvelteKit的生产服务:
node build/index.js

前端发送的/api/xxx请求会被自动转发到后端服务器。

关键注意事项
  • 开发环境的Vite代理配置可以保留,生产环境不需要额外修改。
  • 方案1中,Express和SvelteKit共用一个端口,彻底避免跨域问题。
  • Axios的baseURL在生产环境直接设为/api即可,两种方案都能正确处理请求路由。

内容的提问来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:17:37