Streaming Content Example

Each content chunk will stream render in and render in-place whenever it is done loading. This is built into Hyperspan HTML Templates and doesn't require any special syntax to enable — it is just calling an async function as a template variable.

Content Block 1

Waits 1000ms to render

Rendered after 1000ms!

Content Block 2

Waits 5000ms to render

Rendered after 5000ms!

Content Block 3

Waits 3000ms to render

Rendered after 3000ms!

Example Streaming Code

The code to enable this streaming behavior is a simple html template:

import { html, placeholder } from '@hyperspan/html';

const tmpl = html`
  <section class="flex gap-4">
    <div class="card">
      <h2>Content Block 1</h2>
      <p>Waits 1000ms to render</p>
      ${AsyncRenderBlock(1000, 'Rendered after 1000ms!')}
    </div>

    <div class="card">
      <h2>Content Block 2</h2>
      <p>Waits 5000ms to render</p>
      ${placeholder(
        html`<span>Custom Loading HTML...</span>`,
        AsyncRenderBlock(5000, 'Rendered after 5000ms!')
      )}
    </div>

    <div class="card">
      <h2>Content Block 3</h2>
      <p>Waits 3000ms to render</p>
      ${AsyncRenderBlock(3000, 'Rendered after 3000ms!')}
    </div>
  </section>
  `;

AsyncRenderBlock is just a standard async function:

async function AsyncRenderBlock(waitMs: number, msg: string) {
  await sleep(waitMs);

  return html`<div>${msg}</div>`;
}