Skip to content

Instantly share code, notes, and snippets.

@arisris
Created October 31, 2022 06:19
Show Gist options
  • Save arisris/a6108e2f42a99dc76bba1e0aaf1410f3 to your computer and use it in GitHub Desktop.
Save arisris/a6108e2f42a99dc76bba1e0aaf1410f3 to your computer and use it in GitHub Desktop.
React SSR Suspense fallback & streaming suport : Example Code
// file: react_test.ts
// it just for my note
import React from "https://esm.sh/react@18.2.0";
import ReactDomServer from "https://esm.sh/react-dom@18.2.0/server";
import { Handler, serve } from "https://deno.land/std@0.161.0/http/server.ts";

const Module = {
  default: () =>
    React.createElement("div", {
      hello: "World",
    }, "Dynamic Modules"),
};

const DynComp = React.lazy(async () => {
  await new Promise((resolve) => {
    setTimeout(() => {
      resolve(1);
    }, 5000);
  });
  return Module;
});

const Component = (props: { hello?: string }) => {
  return React.createElement("div", {}, [
    React.createElement("h3", {}, props?.hello ?? "Hello React"),
    React.createElement(React.Suspense, {
      fallback: React.createElement("span", {}, "Loading..."),
    }, [
      React.createElement(DynComp),
    ]),
    React.createElement("p", {}, "I am here"),
  ]);
};

//await stream.allReady

const ac = new AbortController();
const handler: Handler = async (req) => {
  const stream = await ReactDomServer.renderToReadableStream(
    React.createElement(Component, { hello: "Hello World" }),
    { signal: ac.signal },
  );
  return new Response(stream, {
    headers: {
      "content-type": "text/html; charset=utf-8",
    },
  });
};

await serve(handler, { port: 3000, signal: ac.signal });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment