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

如何在SvelteKit中通过顶级域名设置全局变量?

基于SvelteKit的多域名国家参数处理方案

1. 服务端通过主机名推断国家并传递给页面

在根布局的服务端load函数中解析请求主机名,映射对应的国家代码,同时将其存入locals供API路由使用:

// src/routes/+layout.server.ts
export async function load({ request }) {
  const hostname = request.headers.get('host') || '';
  // 按实际域名规则配置映射关系
  const countryMap: Record<string, string> = {
    'example.com': 'us',
    'example.co.uk': 'uk'
  };
  const country = countryMap[hostname] || 'default';
  
  return { country };
}

在根布局组件中,通过setContext将国家代码全局传递给子组件:

<!-- src/routes/+layout.svelte -->
<script>
  export let data;
  import { setContext } from 'svelte';
  setContext('country', data.country);
</script>

<slot />

2. 客户端统一封装带国家参数的API请求

创建全局API工具函数,自动从上下文或页面数据中获取国家参数并添加到请求:

// src/lib/api.ts
import { getContext } from 'svelte';
import { page } from '$app/stores';

export async function fetchWithCountry(url: string, options: RequestInit = {}) {
  let country;
  try {
    // 优先从组件上下文获取
    country = getContext('country');
  } catch {
    // 非组件环境从page store读取
    country = $page.data.country;
  }

  const urlObj = new URL(url, import.meta.env.VITE_API_BASE_URL);
  urlObj.searchParams.set('country', country);

  return fetch(urlObj.toString(), options);
}

3. API路由直接从locals读取国家参数

通过hooks.server.ts将国家代码注入locals,API路由即可直接使用:

// src/hooks.server.ts
export async function handle({ event, resolve }) {
  const hostname = event.request.headers.get('host') || '';
  const countryMap: Record<string, string> = {
    'example.com': 'us',
    'example.co.uk': 'uk'
  };
  event.locals.country = countryMap[hostname] || 'default';

  const response = await resolve(event);
  return response;
}

API路由示例:

// src/routes/api/+server.ts
export async function GET({ locals }) {
  // 直接使用locals中的国家参数请求后端
  const backendResponse = await fetch(`https://your-backend/api?country=${locals.country}`);
  const data = await backendResponse.json();
  
  return new Response(JSON.stringify(data), {
    headers: { 'Content-Type': 'application/json' }
  });
}

4. 开发环境模拟多域名

修改本地hosts文件添加域名映射:

127.0.0.1 example.com
127.0.0.1 example.co.uk

启动开发服务时指定端口:

npm run dev -- --port 3000

即可在本地模拟多域名环境测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:46:23