SvelteKit 2: How to make code-based router instead of file-based router

I’ve wrote lots about how to make a patch on that, and now, still not an npm module, but at least we have a repo:
https://github.com/webentlib/router
The idea is simple — just create universal […path] folder and proxy everything through it via some u…


This content originally appeared on DEV Community and was authored by Max Core

I've wrote lots about how to make a patch on that, and now, still not an npm module, but at least we have a repo:
https://github.com/webentlib/router
The idea is simple — just create universal [...path] folder and proxy everything through it via some urls.ts.

So, this allows to define routes like that:

urls.ts:

import type { Pattern, Layout, Error } from '/router/types';  // or from '/' in case you use root index.ts

export const error: Error = () => import('/src/error.svelte');
const layout: Layout = { page: () => import('/src/base.svelte'), error };
const layouts: Layout[] = [layout];  // for nested layouts — [layout, sublayout, ...]

export const patterns: Pattern[] = [
    {re: '',                     page: () => import('/src/home.svelte'),              layouts},
    {re: 'articles',             page: () => import('/src/articles/articles.svelte'), layouts},
    {re: 'article/(<id>[0-9]+)', page: () => import('/src/articles/article.svelte'),  layouts},
]

Sure, now all pages/components could be stored in any folder and have any name you want and need.

More of it, one can describe load inside <script module> right in page component like in good old Sapper:

article.svelte:

<script module>
export async function load({ fetch, slugs }) {
    const response = await fetch(`/api/articles/${slugs.id}/`);
    const article = await response.json();
    return { article }
}
</script>

Sure, load in separate .js/ts file also available by specifying js and a side params to execute on:

urls.ts:

import { Sides } from '/router/';  // SERVER | CLIENT | UNIVERSAL
{
    re: '',
    page: () => import('/src/home.svelte'),
    js: () => import('/src/home.js'),
    side: Sides.SERVER,
    layouts,
}

More of it, now, one can define page specific vars just in routes, like:

urls.ts:

{
    re: '',
    page: () => import('/src/home.svelte'),
    js: () => import('/src/home.js'),
    side: Sides.SERVER,
    layouts,
    layout: Layouts.DEFAULT,         // E.g: 'CUSTOM', 'CUSTOM'
    wrapper: Wrappers.NARROW,        // Can be used for css class for <main>
    title: 'Welcome to My project!', // Can be used for <title>
    h1: 'Welcome!',                  // Can be used for <h1>
    name: 'HOME',                    // 'id' of a route
    extras: [EXTRAS.GO_TOP],         // Any additions to use in layout,
}

So it can be used in base layout and page like that:

urls.ts:

export enum Layouts {
    DEFAULT = 'DEFAULT',
    CUSTOM = 'CUSTOM',
    BLANK = 'BLANK',
}

export enum Wrappers {
    WIDE = 'WIDE',
    DEFAULT = 'DEFAULT',
    NARROW = 'NARROW',
}

export enum Extras {
    GO_TOP = 'GO_TOP',
}

base.svelte:

<script>
    // ROUTER
    import { routeStore, titleStore, h1Store, Layouts, Wrappers, Extras, beforeNavigate } from '/';

    let title   = $derived($titleStore || $routeStore.title);
    let h1      = $derived($h1Store || $routeStore.h1);
    let path    = $derived($routeStore.url.pathname + $routeStore.url.search);
    let layout  = $derived($routeStore.layout);
    let wrapper = $derived($routeStore.wrapper);
    let extras  = $derived($routeStore.extras);
    beforeNavigate(() => {
        $titleStore = null;
        $h1Store = null;
    });

    // CUSTOM
    import { GoTop } from '/';
    import Header from '/src/Header.svelte';

    let { children } = $props();
</script>

<svelte:head>
    <title>{title ? title + ' | My Project' : 'My Project'}</title>
</svelte:head>

{#if layout !== Layouts.BLANK}
    <Header/>
{/if}

{#key path}
    {#if layout === Layouts.DEFAULT}
        <main
            class='Wrapper'
            class:_Wide={wrapper === Wrappers.WIDE}
            class:_Default={wrapper === Wrappers.DEFAULT}
            class:_Narrow={wrapper === Wrappers.NARROW}
        >
            {#if h1}
                <div class="Heading">
                    <h1 class="Title">{h1}</h1>
                </div>
            {/if}
            {@render children?.()}
        </main>
    {:else}
        {@render children?.()}
    {/if}
{/key}

{#if extras?.length || extras.includes(Extras.GO_TOP)}
    <GoTop/>
{/if}

article.svelte:

$effect(() => {
    $titleStore = article.name    
})

For installation, usage, etc — please follow:
https://github.com/webentlib/router

Thx for you attention.
If you like the idea, please tell — I'll think about packing that as an npm module.


This content originally appeared on DEV Community and was authored by Max Core


Print Share Comment Cite Upload Translate Updates
APA

Max Core | Sciencx (2025-08-31T13:40:22+00:00) SvelteKit 2: How to make code-based router instead of file-based router. Retrieved from https://www.scien.cx/2025/08/31/sveltekit-2-how-to-make-code-based-router-instead-of-file-based-router/

MLA
" » SvelteKit 2: How to make code-based router instead of file-based router." Max Core | Sciencx - Sunday August 31, 2025, https://www.scien.cx/2025/08/31/sveltekit-2-how-to-make-code-based-router-instead-of-file-based-router/
HARVARD
Max Core | Sciencx Sunday August 31, 2025 » SvelteKit 2: How to make code-based router instead of file-based router., viewed ,<https://www.scien.cx/2025/08/31/sveltekit-2-how-to-make-code-based-router-instead-of-file-based-router/>
VANCOUVER
Max Core | Sciencx - » SvelteKit 2: How to make code-based router instead of file-based router. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2025/08/31/sveltekit-2-how-to-make-code-based-router-instead-of-file-based-router/
CHICAGO
" » SvelteKit 2: How to make code-based router instead of file-based router." Max Core | Sciencx - Accessed . https://www.scien.cx/2025/08/31/sveltekit-2-how-to-make-code-based-router-instead-of-file-based-router/
IEEE
" » SvelteKit 2: How to make code-based router instead of file-based router." Max Core | Sciencx [Online]. Available: https://www.scien.cx/2025/08/31/sveltekit-2-how-to-make-code-based-router-instead-of-file-based-router/. [Accessed: ]
rf:citation
» SvelteKit 2: How to make code-based router instead of file-based router | Max Core | Sciencx | https://www.scien.cx/2025/08/31/sveltekit-2-how-to-make-code-based-router-instead-of-file-based-router/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.