1.3.0 • Published 4 years ago

svelte-filerouter v1.3.0

Weekly downloads
26
License
ISC
Repository
github
Last release
4 years ago

svelte-filerouter

Minimalist SPA file router inspired by Sapper router.

While svelte-filerouter and Sapper's router should work interchangeably, there are some key differences.

DifferencesSapper routersvelte-filerouter
SSR+-
SPA-+
Resets-+
Scoped variables-+
Route props-+
Helpers-+
Fast dev builds-+

To install

npm i -D svelte-filerouter

<!--App.svelte-->

<script>
    import { Router } from "svelte-filerouter";
</script>

<Router />
// rollup.config.js
import { fileRouter } from 'svelte-filerouter'
...
    plugins: [
        fileRouter({}),
...

fileRouter accepters the following parameters:

appFile: path/to/App.svelte (Defaults to ./src/App.svelte)

pages: path/to/pages (Defaults to ./src/pages)

ignore: ['widget.svelte'] (Files and dirs. Can be string or array. Interpreted as regular expression)

unknownPropWarnings: true (Defaults to true. Disable to hide warnings about props passed by filerouter)

dynamicImports: false (Experimental code splitting. Defaults to false.)

Guide

File scheme

Basic

src/pages/about.svelte corresponds to /about

Parameters

src/pages/admin/[business].svelte corresponds to /admin/:business

To exclude

src/admin/_navbar.svelte corresponds to nothing as _prefixed files are ignored.

Layouts

Layout files are named _layout.svelte and apply to all adjacent and nested svelte files. A file can have multiple layouts if multiple layouts are recursively present in parent folders.

Resets

Reset files are named _reset.svelte. They function exactly like layout files, but do no inherit parent layouts.

404 and fallbacks

404s can be caught with _fallback.svelte. The first _fallback.svelte that's found while traversing back through parent folders will be used.

Accessing route and parameters

Examples below is reactive

<!-- src/pages/admin/[business]/[project].svelte-->
<script>
    export let route //current route
    export let routes //all routes
</script>

<a href="my/path">go somewhere</a>

<div>Business: {route.params.business}</div>
<div>Project: {route.params.project}</div>

route(s) can also be accessed like this import { route, routes } from "svelte-filerouter" (route is reactive)

Props

Props can be passed through the scopes prop.

<!-- src/pages/posts/_layout.svelte -->
<script>
    import posts from posts.js
    export let route;
    $: { postId } = route.params;
    $: post = posts[postId]
</script>
<slot scoped={{post}} />

Props passed through scopes are available to all nested components served by the router. Props can be accessed directly or through the scoped prop.

<!-- src/pages/posts/[postId]/index.svelte -->
<script>
    export let post
</script>
<h1>{post.title}</h1>
<div>{post.body}</div>

Helpers

url ( path, params )

Can be imported with export let url.

path:string - An absolute, relative or named path. Parameters are prefixed with colon. Absolute paths starts with /. Relative paths starts with ./ or ../. Paths that aren't prefixed we be considered named paths. A route is named by it's parent dir and filename (without extension). E.g. the file src/pages/companies/[companyId]/index.svelte will have the name companyId/index

params:object - Parameters. If parameters already exist within the current route, these are merged. Therefore, parameters included in the current route, do not need to be specified again.

Examples

<!-- src/pages/companies/[companyId]/index.svelte -->
<script>
 export let url
</script>

<!-- absolute routes -->
<a href={url('/')}>Frontpage</a>
<a href={url('/companies/')}>Company index</a>
<a href={url('/companies/:companyId')}>Current company/page</a>
<a href={url('/companies/:companyId/products')}>Products</a>
<a href={url('/companies/:companyId/products/:productId'), {productId: 123}}>Product no. 123</a>
<a href={url('/companies/:companyId'), {companyId: 456}}>Different company</a>

<!-- relative routes -->
<a href={url('../../')}>Frontpage</a>
<a href={url('../')}>Company index</a>
<a href={url('./')}>Current company/page</a>
<a href={url('./products')}>Products</a>
<a href={url('./products/:productId', {productId: 123})}>Product no. 123</a>
<a href={url('./', {companyId: 123})}>Different company</a>

<!-- named routes -->
<a href={url('/index')}>Frontpage</a>
<a href={url('company/index')}>Company index</a>
<a href={url('companyId/index')}>Current company/page</a>
<a href={url('products/index')}>Products</a>
<a href={url('productId/index') , {productId: 123}}>Product no. 123</a>
<a href={url('companyId/index'), {companyId: 123}}>Different company</a>

Examples

https://github.com/jakobrosenberg/svelte-filerouter-example

Notes

  • <a href="my/path"> tags are handled by svelte-router

Roadmap

  • <link path="pathname" params={params}> or similar for normalized link handling. As well as helper script to generate url from pathname and parameters.
  • Example project

Caveats

Restart of Rollup is required to update the routes map.

Issues

Feel free to open an issue or a pull request, if there's anything you think could be improved.

1.4.6

4 years ago

1.4.5

4 years ago

1.4.4

4 years ago

1.4.3

4 years ago

1.4.2

4 years ago

1.4.1

4 years ago

1.4.0

4 years ago

1.3.0

4 years ago

1.2.6

4 years ago

1.2.5

5 years ago

1.2.4

5 years ago

1.2.3

5 years ago

1.2.2

5 years ago

1.2.1

5 years ago

1.2.0

5 years ago

1.1.2

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.9

5 years ago

1.0.8

5 years ago

1.0.7

5 years ago

1.0.5

5 years ago

1.0.4

5 years ago

1.0.3

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago