svelte-virtual-list (demo)
A virtual list component for Svelte apps. Instead of rendering all your data, <VirtualList> just renders the bits that are visible, keeping your page nice and light.
yarn add @sveltejs/svelte-virtual-list<VirtualList items={things} component={RowComponent} />
<script>
  import VirtualList from '@sveltejs/svelte-virtual-list';
  import RowComponent from './RowComponent.html';
  export default {
    components: { VirtualList },
    data() {
      return {
        things: [
          // these can be any values you like
          { name: 'one', number: 1 },
          { name: 'two', number: 2 },
          { name: 'three', number: 3 },
          // ...
          { name: 'six thousand and ninety-two', number: 6092 }
        ],
        RowComponent
      };
    }
  };
</script>The component constructor you supply to <VirtualList> will be instantiated for each visible member of items:
<!-- RowComponent.html -->
<div>
  <strong>{number}</strong>
  <span>{name}</span>
</div>You can track which rows are visible at any given by binding to the start and end values:
<VirtualList items={things} component={RowComponent} bind:start bind:end />
<p>showing {start}-{end} of {things.length} rows</p>You can rename them with e.g. bind:start=a bind:end=b.
You can optimize initial display and scrolling when the height of items is known in advance.
<VirtualList items={things} component={RowComponent} itemHeight={48} />You can add arbitrary properties to <VirtualList> and they will be forwarded to the rows:
<VirtualList class="funky" answer={42} items={things} component={RowComponent} /><!-- RowComponent.html -->
<div class="{number === answer ? 'the-answer' : ''}">
  <strong>{number}</strong>
  <span>{name}</span>
</div>If you're using webpack with svelte-loader, make sure that you add "svelte" to resolve.mainFields in your webpack config. This ensures that webpack imports the uncompiled component (src/index.html) rather than the compiled version (index.mjs) — this is more efficient.
If you're using Rollup with rollup-plugin-svelte, this will happen automatically.