7

Is there a way to import components in svelte dynamically using fetch or import? May be a svelte file or module file created from shareable component (still don't know how that works). very new with svelte and very excited.

I found some code in stackoverflow, which worked for v2. Here is the link


<button on:click="loadChatbox()">
  chat to a customer service representative
</button>

{#if ChatBox}
  <svelte:component this={ChatBox}/>
{/if}

<script>
  export default {
    methods: {
      async loadChatbox() {
        const { default: Chatbox } = await import('./Chatbox.html');
        this.set({ Chatbox });
      }
    }
  };
</script>
ssuwal
  • 103
  • 1
  • 6

1 Answers1

15

The same functionality exists in Svelte 3, but you only need to assign the dynamically imported component to a regular variable that you use for the this property on the svelte:component.

Example (REPL)

<!-- App.svelte -->
<script>
  let Chatbox;

  function loadChatbox() {
    import('./ChatBox.svelte').then(res => Chatbox = res.default)
  }
</script>

<button on:click="{loadChatbox}">Load chatbox</button>
<svelte:component this="{Chatbox}" />

<!-- ChatBox.svelte -->
<h1>Dynamically loaded chatbox</h1>
<input />
Tholle
  • 108,070
  • 19
  • 198
  • 189
  • 4
    Great, this works. I tried it in the repl and it works as it suppose to but the rollup build fails while doing locally using the sveltejs/template. With the help of this I was also able to load external mjs in runtime to load components. Here are the related project [main project](https://github.com/ssuwal/svelte-gettting-statrted), [component generator](https://github.com/ssuwal/svelte-component-generator) and [module server](https://github.com/ssuwal/svelte-test-component-server). I had to switch to mjs since import didn't like svelte or html served from server. – ssuwal Jun 05 '19 at 13:10
  • What do you have to do to get rollup to put the components in the build output? – Andrew Mao Feb 05 '21 at 20:12
  • @AndrewMao inlineDynamicImports – Rob B Apr 06 '21 at 02:44