kaisermann / svelte-loadable

Dynamically load a svelte component
MIT License
320 stars 13 forks source link

use register for spa? #26

Closed Arstman closed 4 years ago

Arstman commented 4 years ago

Hi,

it's me again... :)

i am building a spa now and i try to use register in it, due to i also using a router, i try few times but still can find a way to use register in spa, since require.resolve is a node module.

one way to use both loadable and router i can figure out is to make another wrap component, and in that wrapper, load the actually component i want to load.

i don't if i get some misunderstanding, is there any way to use register in spa, i mean beside the forthcoming barbel plugin?

thanks for your help.

JohnnyFun commented 4 years ago

Yeah, I think you'll just want to wrap your dynamically imported page components in a wrapper component. We do something similar with svelte-routing. We have a component LazyRoute used like:

<LazyRoute component="Home" path="/" />

LazyRoute is basically a Loadable that uses a registered loader (see https://github.com/kaisermann/svelte-loadable#registering-a-loader)

So something like:

<script>
  import { register } from 'svelte-loadable'

  const pages = {
     "Home": register({
        loader: () => import('pages/Home.svelte'), // dynamic import the component when it's needed
        resolve: () => 'Home' // we don't use SSR, so this can be set to whatever pretty much for us...
      })
      // ... other page loaders ...
  }
<script>

<Loadable loader={pages[component]} let:component={loadedComponent}>
    <div slot="loading">
      Loading...
    </div>
    <svelte:component this={loadedComponent} {...params} />
  </Loadable>

You'll have to pass in "params" from somewhere. Ours came from svelte-routing different than yours will come from "svelte-spa-router", but should be pretty straight-forward.

Arstman commented 4 years ago

@JohnnyFun

it very nice.

thanks for help.