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

Svelte新手使用svelte-navigator构建客户端路由时遇TypeError报错

解决SvelteKit中使用svelte-navigator的SSR编译错误

错误原因

svelte-navigator依赖浏览器环境的API(如window),在SvelteKit的SSR(服务端渲染)编译阶段,这些API不存在,从而触发Cannot read properties of null (reading 'indexOf')错误。

解决方案

方案一:仅在浏览器环境中渲染svelte-navigator组件

修改src/routes/+layout.svelte,利用SvelteKit的browser变量判断运行环境,仅在客户端导入并渲染路由组件:

<script>
    import Header from './Header.svelte';
    import './styles.css';
    import { browser } from '$app/environment';
    
    // 仅在浏览器环境下导入svelte-navigator
    let Router, Route, Link;
    if (browser) {
        ({ Router, Route, Link } = await import("svelte-navigator"));
    }
</script>

{#if browser}
<Router>
    <div class="app">
        <Header />

        <main>
            <Route path="/">
                <h3>Home</h3>
                <p>Home sweet home...</p>
            </Route>
        
            <Route path="about">
                <h3>About</h3>
                <p>That's what it's all about!</p>
            </Route>
        </main>
    </div>
</Router>
{/if}

方案二:改用SvelteKit自带的文件系统路由(推荐)

SvelteKit原生提供了适配SSR的文件系统路由,无需额外依赖,步骤如下:

  1. 创建首页文件src/routes/+page.svelte:
<h3>Home</h3>
<p>Home sweet home...</p>
  1. 创建关于页面文件src/routes/about/+page.svelte:
<h3>About</h3>
<p>That's what it's all about!</p>
  1. 修改Header.svelte使用SvelteKit原生导航组件:
<script>
    import { Link } from '$app/navigation';
</script>
<nav>
    <Link to="/">Home</Link>
    <Link to="/about">About</Link>
</nav>
  1. 简化src/routes/+layout.svelte:
<script>
    import Header from './Header.svelte';
    import './styles.css';
</script>

<div class="app">
    <Header />
    <main>
        <slot /> <!-- 自动渲染对应路由的页面内容 -->
    </main>
</div>

额外检查点

  • 确认package.json中svelte-navigator版本与当前Svelte/SvelteKit版本兼容,若版本差异过大,尝试升级或降级svelte-navigator。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 19:52:50