diff --git a/src/core/props/props.ts b/src/core/props/props.ts index 43d00985227..aa6d58db24b 100644 --- a/src/core/props/props.ts +++ b/src/core/props/props.ts @@ -13,8 +13,7 @@ Error.stackTraceLimit = 9999; const Q_IS_HYDRATED = '__isHydrated__'; export const Q_CTX = '__ctx__'; -export function hydrateIfNeeded(element: Element): void { - const doc = getDocument(element); +export function hydrateIfNeeded(doc: Document): void { const isHydrated = (doc as any)[Q_IS_HYDRATED]; if (!isHydrated) { (doc as any)[Q_IS_HYDRATED] = true; @@ -36,8 +35,6 @@ export interface QContext { } export function getContext(element: Element): QContext { - hydrateIfNeeded(element); - let ctx: QContext = (element as any)[Q_CTX]; if (!ctx) { const cache = new Map(); diff --git a/src/core/render/notify-render.ts b/src/core/render/notify-render.ts index dd287a54c87..ecf660cc5de 100644 --- a/src/core/render/notify-render.ts +++ b/src/core/render/notify-render.ts @@ -2,7 +2,7 @@ import { assertDefined } from '../assert/assert'; import { QHostAttr } from '../util/markers'; import { getQComponent } from '../component/component-ctx'; import { executeContextWithSlots, printRenderStats, RenderContext } from './cursor'; -import { getContext } from '../props/props'; +import { getContext, hydrateIfNeeded } from '../props/props'; import { qDev } from '../util/qdev'; import { getPlatform } from '../index'; import { getDocument } from '../util/dom'; @@ -25,8 +25,9 @@ import { getDocument } from '../util/dom'; // TODO(misko): this should take QComponent as well. export function notifyRender(hostElement: Element): Promise { assertDefined(hostElement.getAttribute(QHostAttr)); - const ctx = getContext(hostElement); const doc = getDocument(hostElement); + hydrateIfNeeded(doc); + const ctx = getContext(hostElement); const state = getRenderingState(doc); if (ctx.dirty) { // TODO diff --git a/src/core/render/render.public.ts b/src/core/render/render.public.ts index 8427b1fc537..4bd14cd8210 100644 --- a/src/core/render/render.public.ts +++ b/src/core/render/render.public.ts @@ -8,6 +8,7 @@ import { then } from '../util/promises'; import { getRenderingState } from './notify-render'; import { getDocument } from '../util/dom'; import { qDev } from '../util/qdev'; +import { hydrateIfNeeded } from '../props/props'; /** * Render JSX. @@ -31,6 +32,7 @@ export function render( } const doc = isDocument(parent) ? parent : getDocument(parent); const stylesParent = isDocument(parent) ? parent.head : parent.parentElement; + hydrateIfNeeded(doc); const ctx: RenderContext = { operations: [], diff --git a/src/core/use/use-lexical-scope.public.ts b/src/core/use/use-lexical-scope.public.ts index 06a1d41aec0..179b8502dc7 100644 --- a/src/core/use/use-lexical-scope.public.ts +++ b/src/core/use/use-lexical-scope.public.ts @@ -1,7 +1,8 @@ import { assertDefined } from '../assert/assert'; import { parseQRL } from '../import/qrl'; import { qInflate } from '../json/q-json'; -import { getContext } from '../props/props'; +import { getContext, hydrateIfNeeded } from '../props/props'; +import { getDocument } from '../util/dom'; import { getInvokeContext } from './use-core'; import { useURL } from './use-url.public'; @@ -21,9 +22,11 @@ import { useURL } from './use-url.public'; // export function useLexicalScope(): VARS { const context = getInvokeContext(); + const qrl = context.qrl ?? parseQRL(decodeURIComponent(String(useURL()))); if (qrl.captureRef == null) { const el = context.element; + hydrateIfNeeded(getDocument(el)); const ctx = getContext(el); assertDefined(qrl.capture); qrl.captureRef = qrl.capture!.map((idx) => qInflate(idx, ctx)); diff --git a/src/optimizer/src/rollup/index.ts b/src/optimizer/src/rollup/index.ts index 33ac00c3ae0..78185e75f3b 100644 --- a/src/optimizer/src/rollup/index.ts +++ b/src/optimizer/src/rollup/index.ts @@ -13,7 +13,7 @@ import { } from '..'; import type { NormalizedOutputOptions, PluginContext, RollupError } from 'rollup'; -import type { HmrContext, Plugin, ViteDevServer } from 'vite'; +import type { HmrContext, Plugin, UserConfig, ViteDevServer } from 'vite'; const QWIK_BUILD = '@builder.io/qwik/build'; /** @@ -167,7 +167,10 @@ export function qwikRollup(opts: QwikPluginOptions): any { name: 'qwik', enforce: 'pre', log, - config(config, { command }) { + async config(config, { command }) { + if (!optimizer) { + optimizer = await createOptimizer(); + } if (command === 'serve') { isBuild = false; entryStrategy = { type: 'hook' }; @@ -175,6 +178,11 @@ export function qwikRollup(opts: QwikPluginOptions): any { (config as any).ssr.noExternal = false; } } + if (command === 'build') { + // Removed if fixed: https://github.com/vitejs/vite/pull/7275 + fixSSRInput(config, optimizer); + } + log(`vite command`, command); return { @@ -482,6 +490,19 @@ export const isBrowser = ${!isSSR}; `; } +function slash(p: string): string { + return p.replace(/\\/g, '/'); +} + +function fixSSRInput(config: UserConfig, optimizer: Optimizer) { + if (typeof config?.build?.ssr === 'string' && config?.build.rollupOptions?.input) { + const resolvedRoot = optimizer.path.normalize( + slash(config.root ? optimizer.path.resolve(config.root) : process.cwd()) + ); + config.build.rollupOptions.input = optimizer.path.resolve(resolvedRoot, config.build.ssr); + } +} + /** * @alpha */ diff --git a/starters/apps/base/vite.config.ts b/starters/apps/base/vite.config.ts index c7616f95b3e..2cb25483790 100644 --- a/starters/apps/base/vite.config.ts +++ b/starters/apps/base/vite.config.ts @@ -7,6 +7,7 @@ export default defineConfig(({ mode }) => { return { build: { rollupOptions: { + input: ['src/main.tsx', 'index.html'], output: { chunkFileNames: 'q-[hash].js', assetFileNames: 'q-[hash].[ext]', diff --git a/starters/servers/express/vite.config.ts b/starters/servers/express/vite.config.ts index 498a4c1a172..87f245e1031 100644 --- a/starters/servers/express/vite.config.ts +++ b/starters/servers/express/vite.config.ts @@ -7,6 +7,7 @@ export default defineConfig(({ mode }) => { return { build: { rollupOptions: { + input: ['src/main.tsx', 'index.html'], output: { // Qwik tends to generate long chunk names chunkFileNames: 'q-[hash].js',