Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions packages/react/src/plugin-pages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -166,10 +166,9 @@ export function pagesPlugin(pagesDir: string, options?: PagesPluginOptions): Plu
},
optimizeDeps: {
exclude: ['@void/react'],
// Pre-include React entries that are discovered late via dynamic
// imports during SPA navigation, avoiding a full-page reload
// from Vite's dep optimizer.
include: CLIENT_OPTIMIZE_DEPS,
// The virtual client entry is absent from the initial dependency crawl.
// Include its runtime imports up front to avoid optimizer reloads.
include: [...CLIENT_OPTIMIZE_DEPS, 'void/pages-client', 'void/pages-prefetch'],
},
ssr: {
optimizeDeps: {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { resolve } from 'node:path';
import { registerPagesDependencyTests } from '../../../../test/pages-deps-contract.ts';
import { pagesPlugin } from '../../src/plugin-pages.ts';

registerPagesDependencyTests(resolve(import.meta.dirname, '../..'), (pagesDir) => [
pagesPlugin(pagesDir),
]);
10 changes: 8 additions & 2 deletions packages/solid/src/plugin-pages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,14 @@ export function pagesPlugin(pagesDir: string, options?: PagesPluginOptions): Plu
if (isDev) {
return {
optimizeDeps: {
// Pre-include Solid entries discovered late via dynamic imports
include: ['solid-js', 'solid-js/web', 'solid-js/store'],
// Include imports from the virtual client entry before the first request.
include: [
'solid-js',
'solid-js/web',
'solid-js/store',
'void/pages-client',
'void/pages-prefetch',
],
},
};
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { resolve } from 'node:path';
import { registerPagesDependencyTests } from '../../../../test/pages-deps-contract.ts';
import { pagesPlugin } from '../../src/plugin-pages.ts';

registerPagesDependencyTests(resolve(import.meta.dirname, '../..'), (pagesDir) => [
pagesPlugin(pagesDir),
]);
11 changes: 9 additions & 2 deletions packages/svelte/src/plugin-pages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,15 @@ const SVELTE_OPTIMIZE_DEPS = {
// Exclude @void/svelte so the virtual module and user components share
// the same Svelte context (identity).
exclude: ['@void/svelte'],
// Pre-include Svelte so it's not discovered late via dynamic imports.
include: ['svelte', 'svelte/store', 'svelte/internal', 'svelte/internal/client'],
// Include imports from the virtual client entry before the first request.
include: [
'svelte',
'svelte/store',
'svelte/internal',
'svelte/internal/client',
'void/pages-client',
'void/pages-prefetch',
],
};

export type PrefetchConfig = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { resolve } from 'node:path';
import { registerPagesDependencyTests } from '../../../../test/pages-deps-contract.ts';
import { pagesPlugin } from '../../src/plugin-pages.ts';

registerPagesDependencyTests(resolve(import.meta.dirname, '../..'), (pagesDir) => [
pagesPlugin(pagesDir),
]);
9 changes: 8 additions & 1 deletion packages/svelte/test/unit/plugin-pages.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,14 @@ describe('pagesPlugin dev HMR', () => {
expect(config).toMatchObject({
optimizeDeps: {
exclude: ['@void/svelte'],
include: ['svelte', 'svelte/store', 'svelte/internal', 'svelte/internal/client'],
include: [
'svelte',
'svelte/store',
'svelte/internal',
'svelte/internal/client',
'void/pages-client',
'void/pages-prefetch',
],
},
environments: {
void_worker: {
Expand Down
6 changes: 2 additions & 4 deletions packages/vue/src/plugin-pages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -272,10 +272,8 @@ export function pagesPlugin(pagesDir: string, options?: PagesPluginOptions): Rea
if (isDev) {
return {
optimizeDeps: {
// Pre-include Vue so it's not discovered late via dynamic
// imports during SPA navigation, avoiding a full-page reload
// from Vite's dep optimizer.
include: ['vue'],
// Include imports from the virtual client entry before the first request.
include: ['vue', 'void/pages-client', 'void/pages-prefetch'],
},
};
}
Expand Down
7 changes: 7 additions & 0 deletions packages/vue/test/integration/pages-client-prebundle.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { resolve } from 'node:path';
import { registerPagesDependencyTests } from '../../../../test/pages-deps-contract.ts';
import { pagesPlugin } from '../../src/plugin-pages.ts';

registerPagesDependencyTests(resolve(import.meta.dirname, '../..'), (pagesDir) =>
pagesPlugin(pagesDir),
);
36 changes: 36 additions & 0 deletions test/pages-deps-contract.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { existsSync, mkdirSync, mkdtempSync, rmSync } from 'node:fs';
import { join } from 'node:path';
import { optimizeDeps, resolveConfig, type Plugin } from 'vite';
import { expect, it } from 'vite-plus/test';

export function registerPagesDependencyTests(
root: string,
plugins: (pagesDir: string) => ReadonlyArray<Plugin>,
): void {
it('prebundles the Pages client runtime before the first browser request', async () => {
const directory = mkdtempSync(join(root, 'test', '__tmp_pages_deps_'));
const pagesDir = join(directory, 'pages');
mkdirSync(pagesDir);
try {
const config = await resolveConfig(
{
root: directory,
configFile: false,
logLevel: 'error',
cacheDir: join(directory, '.vite'),
plugins: [...plugins(pagesDir)],
// The generated virtual client entry is absent from the initial dependency crawl.
optimizeDeps: { noDiscovery: true },
},
'serve',
);
const metadata = await optimizeDeps(config, true, true);
for (const dependency of ['void/pages-client', 'void/pages-prefetch']) {
expect(metadata.optimized[dependency], dependency).toBeDefined();
expect(existsSync(metadata.optimized[dependency].file)).toBe(true);
}
} finally {
rmSync(directory, { recursive: true, force: true });
}
});
}