Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pilot: Next.js + KoliBri real SSR #5506

Open
sdvg opened this issue Oct 30, 2023 · 4 comments
Open

Pilot: Next.js + KoliBri real SSR #5506

sdvg opened this issue Oct 30, 2023 · 4 comments
Labels
lab unclear It is unclear what should be the next steps or who is responsible.

Comments

@sdvg
Copy link
Member

sdvg commented Oct 30, 2023

Bitte das Samples (Mono-Repo, wenn mehr als 1) in folgendes Repo pushen: https://github.com/public-ui/lab-ssr-stencil

@sdvg sdvg self-assigned this Oct 30, 2023
@sdvg sdvg converted this from a draft issue Oct 30, 2023
@deleonio deleonio added the lab label Oct 31, 2023
@sdvg
Copy link
Member Author

sdvg commented Oct 31, 2023

Meine Erkenntnisse bzw. Notizen bis jetzt:

  • Kein Funktionierendes Beispiel mit der aktuellen Next.js-Version zu finden.

Ausgangslage

  • React generiert HTML mit Web-Component-Tags, diese müssen mit Stencil hydrated werden bevor das HTML an den Client gesendet wird
    • zum Hydrieren verwenden wir diesen Adapter, existiert bereits: @public-ui/hydrate

Lösungsansätze

  • Next Server Wrapper (server.ts, die Next wrappt)
  • Next Middleware
    • wird zu früh ausgeführt - response HTML kann überschrieben werden, basiert aber nicht auf dem von Next gerenderten HTML
    • Würde voraussichtlich zu mismatch zwischen und Server und Client führen
  • Eigene React Wrapper component
    • Nur als Proof of concept mit String-Parameter, kann so noch niht produktiv verwendet werden:
      • Verwendung: <Kolibri>{`<kol-heading _label="KolHeading"></kol-heading>`}</Kolibri>
      • → Funktioniert soweit als Async component:
import React from 'react';
import { renderToString } from '@public-ui/hydrate';

export const Kolibri = async ({children}: {children: string}) => {
    const START_TAG = `<kolibri-canvas>`
    const END_TAG = `</kolibri-canvas>`
    const htmlToRender = `${START_TAG}${children}${END_TAG}`
    const hydratedHtml = (await renderToString(htmlToRender)).html
    const matches = hydratedHtml.match(new RegExp(`${START_TAG}(.*)${END_TAG}`, 's'));
    return <div dangerouslySetInnerHTML={{ __html: matches?.[1] ?? '' }}></div>
}
  • Darauf basierend, eigenen Adapter analog zum Stencil React Adapter entwickeln:
    • Native React/JSX Anbindung
    • Functional statt Class-Component für Server Components Support
    • Intern wird die component als HTML gerendert (ReactDOM) und dann hydrated
    • component rendert mit dangerouslySetInnerHTML
    • Mglw. schlechte Performance wegen vieler Hydrate Aufrufe?

Sonstige/allgemeine Probleme:

Mögliche nächste Schritte:

  • Ansatz mit eigenem React Adapter mit eingebauter Hydration weiter verfolgen -> Performance müsste unbedingt getestet und sichergestellt werden
  • Ansatz mit Hydration in (custom) Middleware weiter verfolgen. Wird mgwl. wegen DOM mismatches nicht gut funktionieren. Braucht womöglich einen zweiten Server, der als Middleware agiert.

@laske185 laske185 moved this from 🏗 In progress to 🕒 Waiting in KoliBri Board Dec 7, 2023
@deleonio
Copy link
Contributor

See ionic-team/stencil#4389

@deleonio
Copy link
Contributor

deleonio commented Dec 24, 2023

@deleonio deleonio added this to the Support SSR, SSG milestone Jan 5, 2024
@laske185 laske185 moved this from 🕒 Waiting to Backlog in KoliBri Board May 21, 2024
@sdvg sdvg removed their assignment Jun 10, 2024
@deleonio deleonio added the unclear It is unclear what should be the next steps or who is responsible. label Jul 29, 2024
@deleonio deleonio removed the status in KoliBri Board Sep 23, 2024
@deleonio
Copy link
Contributor

Nice to know: ionic-team/stencil-site#1490

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
lab unclear It is unclear what should be the next steps or who is responsible.
Projects
Status: No status
Development

No branches or pull requests

2 participants