Skip to content

Commit

Permalink
fix: configure Vite config optimizeDeps.entries option (#12182)
Browse files Browse the repository at this point in the history
* add failing test

* add optimizeDeps.entries

* changeset

* prettier

* only match + prefixed route files

* try to fix test for ubuntu firefox

* hope this works

* nicer comment...?

* move test to dev-only test app

* prettier

* oops forgot to undo this

* add tests for each routing file

* prettier
  • Loading branch information
eltigerchino committed May 4, 2024
1 parent 32c0acc commit 7a62572
Show file tree
Hide file tree
Showing 20 changed files with 236 additions and 2 deletions.
5 changes: 5 additions & 0 deletions .changeset/stale-otters-yell.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@sveltejs/kit": patch
---

fix: prevent excessive Vite dependency optimizations on navigation
1 change: 1 addition & 0 deletions packages/kit/src/exports/vite/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,7 @@ async function kit({ svelte_config }) {
cors: { preflightContinue: true }
},
optimizeDeps: {
entries: [`${kit.files.routes}/**/+*.{svelte,js,ts}`],
exclude: [
'@sveltejs/kit',
// exclude kit features so that libraries using them work even when they are prebundled
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
cjs: () => 'cjs'
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"version": "1.0.0",
"private": true,
"name": "e2e-test-dep-cjs-only",
"main": "index.js",
"files": [
"index.js"
],
"type": "commonjs"
}
10 changes: 10 additions & 0 deletions packages/kit/test/apps/dev-only/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,16 @@
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^3.0.1",
"cross-env": "^7.0.3",
"e2e-test-dep-page-svelte": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-page-universal": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-page-server": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-layout-svelte": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-layout-universal": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-layout-server": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-server": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-error": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-hooks": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-hooks-client": "file:./_test_dependencies/cjs-only",
"svelte": "^4.2.10",
"svelte-check": "^3.6.3",
"typescript": "^5.3.3",
Expand Down
7 changes: 7 additions & 0 deletions packages/kit/test/apps/dev-only/src/hooks.client.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import cjs from 'e2e-test-dep-hooks-client';
cjs.cjs();

/** @type {import("@sveltejs/kit").HandleClientError} */
export function handleError({ message }) {
return { message };
}
7 changes: 7 additions & 0 deletions packages/kit/test/apps/dev-only/src/hooks.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import cjs from 'e2e-test-dep-hooks';
cjs.cjs();

/** @type {import("@sveltejs/kit").Reroute} */
export function reroute({ url }) {
return url.pathname;
}
13 changes: 13 additions & 0 deletions packages/kit/test/apps/dev-only/src/routes/+page.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<script>
import { onMount } from 'svelte';
let message = '';
onMount(() => {
message = 'hello world!';
});
</script>

<p>{message}</p>

<a href="/optimize-deps">Go to /optimize-deps</a>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<script>
import cjs from 'e2e-test-dep-error';
cjs.cjs();
</script>

<slot />

<p>this error page uses a new dependency</p>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import cjs from 'e2e-test-dep-layout-universal';
cjs.cjs();

export function load() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import cjs from 'e2e-test-dep-layout-server';
cjs.cjs();

export function load() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<script>
import cjs from 'e2e-test-dep-layout-svelte';
cjs.cjs();
</script>

<slot />

<p>this layout uses a new dependency</p>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import cjs from 'e2e-test-dep-page-universal';
cjs.cjs();

export function load() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import cjs from 'e2e-test-dep-page-server';
cjs.cjs();

export function load() {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<script>
import cjs from 'e2e-test-dep-page-svelte';
cjs.cjs();
</script>

<p>this page uses a new dependency</p>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import cjs from 'e2e-test-dep-server';
cjs.cjs();

export function GET() {
return new Response('ok');
}
99 changes: 99 additions & 0 deletions packages/kit/test/apps/dev-only/test/test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { expect } from '@playwright/test';
import { test } from '../../../utils.js';
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));

/** @typedef {import('@playwright/test').Response} Response */

Expand Down Expand Up @@ -78,3 +83,97 @@ test.describe.serial('Illegal imports', () => {
);
});
});

test.describe('Vite', () => {
test.skip(({ javaScriptEnabled }) => !process.env.DEV || !javaScriptEnabled);

test('optimizes +page.svelte dependencies', async ({ page }) => {
await page.goto('/');
await page.getByText('hello world!').waitFor();

const manifest_path = path.join(__dirname, '../node_modules/.vite/deps/_metadata.json');
const manifest = JSON.parse(fs.readFileSync(manifest_path, 'utf-8'));

expect(manifest).toHaveProperty('optimized.e2e-test-dep-page-svelte');
});

test('optimizes +page.js dependencies', async ({ page }) => {
await page.goto('/');
await page.getByText('hello world!').waitFor();

const manifest_path = path.join(__dirname, '../node_modules/.vite/deps/_metadata.json');
const manifest = JSON.parse(fs.readFileSync(manifest_path, 'utf-8'));

expect(manifest).toHaveProperty('optimized.e2e-test-dep-page-universal');
});

test('optimizes +page.server.js dependencies', async ({ page }) => {
await page.goto('/');
await page.getByText('hello world!').waitFor();

const manifest_path = path.join(__dirname, '../node_modules/.vite/deps/_metadata.json');
const manifest = JSON.parse(fs.readFileSync(manifest_path, 'utf-8'));

expect(manifest).toHaveProperty('optimized.e2e-test-dep-page-server');
});

test('optimizes +layout.svelte dependencies', async ({ page }) => {
await page.goto('/');
await page.getByText('hello world!').waitFor();

const manifest_path = path.join(__dirname, '../node_modules/.vite/deps/_metadata.json');
const manifest = JSON.parse(fs.readFileSync(manifest_path, 'utf-8'));

expect(manifest).toHaveProperty('optimized.e2e-test-dep-layout-svelte');
});

test('optimizes +layout.js dependencies', async ({ page }) => {
await page.goto('/');
await page.getByText('hello world!').waitFor();

const manifest_path = path.join(__dirname, '../node_modules/.vite/deps/_metadata.json');
const manifest = JSON.parse(fs.readFileSync(manifest_path, 'utf-8'));

expect(manifest).toHaveProperty('optimized.e2e-test-dep-layout-universal');
});

test('optimizes +layout.server.js dependencies', async ({ page }) => {
await page.goto('/');
await page.getByText('hello world!').waitFor();

const manifest_path = path.join(__dirname, '../node_modules/.vite/deps/_metadata.json');
const manifest = JSON.parse(fs.readFileSync(manifest_path, 'utf-8'));

expect(manifest).toHaveProperty('optimized.e2e-test-dep-layout-server');
});

test('optimizes +error.svelte dependencies', async ({ page }) => {
await page.goto('/');
await page.getByText('hello world!').waitFor();

const manifest_path = path.join(__dirname, '../node_modules/.vite/deps/_metadata.json');
const manifest = JSON.parse(fs.readFileSync(manifest_path, 'utf-8'));

expect(manifest).toHaveProperty('optimized.e2e-test-dep-error');
});

test('optimizes hooks.client.js dependencies', async ({ page }) => {
await page.goto('/');
await page.getByText('hello world!').waitFor();

const manifest_path = path.join(__dirname, '../node_modules/.vite/deps/_metadata.json');
const manifest = JSON.parse(fs.readFileSync(manifest_path, 'utf-8'));

expect(manifest).toHaveProperty('optimized.e2e-test-dep-hooks-client');
});

test('optimizes hooks.js dependencies', async ({ page }) => {
await page.goto('/');
await page.getByText('hello world!').waitFor();

const manifest_path = path.join(__dirname, '../node_modules/.vite/deps/_metadata.json');
const manifest = JSON.parse(fs.readFileSync(manifest_path, 'utf-8'));

expect(manifest).toHaveProperty('optimized.e2e-test-dep-hooks');
});
});
2 changes: 1 addition & 1 deletion packages/kit/test/apps/dev-only/vite.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const config = {
optimizeDeps: {
// for CI, we need to explicitly prebundle deps, since
// the reload confuses Playwright
include: ['cookie', 'marked']
include: ['cookie']
},
plugins: [sveltekit()],
server: {
Expand Down
2 changes: 1 addition & 1 deletion packages/kit/test/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ export const config = {
// generous timeouts on CI
timeout: process.env.CI ? 45000 : 15000,
webServer: {
command: process.env.DEV ? 'pnpm dev' : 'pnpm build && pnpm preview',
command: process.env.DEV ? 'pnpm dev --force' : 'pnpm build && pnpm preview',
port: process.env.DEV ? 5173 : 4173
},
retries: process.env.CI ? 2 : 0,
Expand Down
35 changes: 35 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 7a62572

Please sign in to comment.