From cbd94c373e275a918fa9f1fc34a0b0bedf57c517 Mon Sep 17 00:00:00 2001 From: julien huang Date: Mon, 14 Aug 2023 16:54:51 +0200 Subject: [PATCH] feat: WORTKING IN BUIKLD --- .../src/app/components/TeleportIfClient.ts | 2 +- .../nuxt/src/app/components/nuxt-island.ts | 34 +++++++++++-------- .../nuxt/src/core/runtime/nitro/renderer.ts | 32 ++++++++++++++--- 3 files changed, 47 insertions(+), 21 deletions(-) diff --git a/packages/nuxt/src/app/components/TeleportIfClient.ts b/packages/nuxt/src/app/components/TeleportIfClient.ts index 01342da12b..e5fa6fa529 100644 --- a/packages/nuxt/src/app/components/TeleportIfClient.ts +++ b/packages/nuxt/src/app/components/TeleportIfClient.ts @@ -49,7 +49,7 @@ export default defineComponent({ return [h('div', { style: 'display: contents;', 'nuxt-ssr-client': props.to - }, [slot]), h(Teleport, { to: props.to }, slot)] + }, []), h(Teleport, { to: props.to }, slot)] } return slot diff --git a/packages/nuxt/src/app/components/nuxt-island.ts b/packages/nuxt/src/app/components/nuxt-island.ts index f9f6189671..00dd0e7933 100644 --- a/packages/nuxt/src/app/components/nuxt-island.ts +++ b/packages/nuxt/src/app/components/nuxt-island.ts @@ -113,23 +113,11 @@ export default defineComponent({ // no need for reactivity let interactiveProps: Record> = process.client && nuxtApp.isHydrating ? toRaw(nuxtApp.payload.data[`${props.name}_${hashId.value}_interactive`].props) : {} const interactiveChunksList = process.client && nuxtApp.isHydrating ? nuxtApp.payload.data[`${props.name}_${hashId.value}_interactive`].chunks : {} - +let interactiveTeleports = {} const html = computed(() => { const currentSlots = Object.keys(slots) let html = ssrHTML.value - if (import.meta.client && mounted.value) { - const el = document.createElement('div') - el.innerHTML = html - - Object.entries(interactiveProps).forEach(([id]) => { - const interactiveWrapper = el.querySelector(`[nuxt-ssr-client="${id}"]`) - if (interactiveWrapper) { - interactiveWrapper.innerHTML = '' - } - }) - - html = el.innerHTML - } + return html.replace(SLOT_FALLBACK_RE, (full, slotName, content) => { // remove fallback to insert slots if (currentSlots.includes(slotName)) { @@ -201,6 +189,8 @@ export default defineComponent({ if (process.client) { await loadComponents(props.source, res.chunks) interactiveProps = res.props + } else { + interactiveTeleports = res.teleports ||{} } setUid() @@ -244,7 +234,21 @@ export default defineComponent({ })) } } - if (process.client && html.value.includes('nuxt-ssr-client') && mounted.value) { + if (process.server) { + for (const [id, html] of Object.entries(interactiveTeleports)) { + console.log(id, html) + nuxtApp.ssrContext.teleports = nuxtApp.ssrContext.teleports || {} + nuxtApp.ssrContext.teleports[`uid=${uid.value};client=${id}`] = html + console.log("TPPPPPPPPP CA MARCHE PASSSSSSSSSSSSSSSSSSSSSSSSS", nuxtApp.ssrContext.teleports || {} + ) + // nodes.push(createVNode(Teleport, { to: `uid=${uid.value};client=${id}`}, { + // default: () => { + // return createStaticVNode(html, 1) + // } + // })) + } + } + if (process.client && html.value.includes('nuxt-ssr-client') ) { for (const [id, props] of Object.entries(interactiveProps)) { const component = components!.get(id.split('-')[0])!._ ?? components!.get(id.split('-')[0])! const vnode = createVNode(Teleport, { to: `[nuxt-ssr-component-uid='${uid.value}'] [nuxt-ssr-client="${id}"]` }, { diff --git a/packages/nuxt/src/core/runtime/nitro/renderer.ts b/packages/nuxt/src/core/runtime/nitro/renderer.ts index c6bd628716..27546aa18f 100644 --- a/packages/nuxt/src/core/runtime/nitro/renderer.ts +++ b/packages/nuxt/src/core/runtime/nitro/renderer.ts @@ -71,6 +71,7 @@ export interface NuxtIslandResponse { } chunks: Record props: Record> + teleports: Record } export interface NuxtRenderResponse { @@ -192,7 +193,8 @@ async function getIslandContext (event: H3Event): Promise { props: destr(context.props) || {}, uid: destr(context.uid) || undefined, chunks: {}, - propsData: {} + propsData: {}, + teleports: {} } return ctx @@ -403,7 +405,7 @@ export default defineRenderHandler(async (event): Promise]*>((?!nuxt-ssr-client="${clientId}"|nuxt-ssr-component-uid)[\\s\\S])*
]*nuxt-ssr-client="${clientId}"[^>]*>`), (full) => { + return full + teleports[key] + }) + console.log(html, 'HTMLLLLLLLL') + } + return html +}