#svelte #sapper
#стройный #сапер
Вопрос:
В сапере я пытаюсь импортировать компонент, только если он отображается на стороне клиента (с помощью onMount
). Есть ли что-то похожее на React Suspense
и React.lazy
? Или есть другой подход?
Комментарии:
1. Я знаю библиотеку под названием svelte-lazy , которая позволяет выполнять отложенную загрузку.
Ответ №1:
Вы, безусловно, можете сделать это таким образом, да:
<script>
import { onMount } from 'svelte';
let Thing;
onMount(async () => {
Thing = (await import('./Thing.svelte')).default;
});
</script>
<svelte:component this={Thing} answer={42}>
<p>some slotted content</p>
</svelte:component>
В качестве альтернативы, вы могли бы обернуть это в компонент:
<!-- Loader.svelte -->
<script>
import { onMount } from 'svelte';
let loader;
let Component;
onMount(async () => {
Component = (await loader()).default;
});
export { loader as this };
</script>
<svelte:component this={Component} {...$$restProps}>
<slot></slot>
</svelte:component>
{#if !Component}
<slot name="fallback"></slot>
{/if}
<Loader
this={() => import('./Thing.svelte')}
answer={42}
>
<p>some slotted content</p>
<p slot="fallback">loading...</p>
</Loader>
Демонстрация здесь. Предостережение при таком подходе заключается в том, что слоты, отличные от default
, не будут «перенаправлены» на базовый компонент.
Комментарии:
1. есть ли какой-либо способ сделать это SSR? Это было бы очень полезно для веб-приложений, где пользовательский интерфейс зависит, например, от наличия файлов cookie аутентификации. В настоящее время при импорте только CSR это вызывает сдвиг макета.