Skip to content

feat: support Rolldown #13747

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

Merged
merged 46 commits into from
Jun 20, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
cebc7fa
try these
eltigerchino Apr 28, 2025
d3f5f87
try disable native plugins
eltigerchino Apr 28, 2025
3308e95
fix
eltigerchino Apr 28, 2025
e800190
more fixes
eltigerchino Apr 28, 2025
5bc5cc6
revert this part
eltigerchino Apr 28, 2025
80cbf3a
fix lint errors
eltigerchino Apr 28, 2025
8ab56f2
inline dynamic imports when creating single chunk
eltigerchino Apr 28, 2025
5c21ac3
thank you sapphi-red!
eltigerchino Apr 28, 2025
3fd65a2
allow rolldown build script
eltigerchino Apr 28, 2025
69b80d2
fix single bundle
eltigerchino Apr 28, 2025
9cd1325
add todo
eltigerchino Apr 28, 2025
76e8611
conditionally rename service worker to mjs
eltigerchino Apr 30, 2025
c5e4bea
merge main
benmccann May 5, 2025
4f666d8
preserveEntrySignatures
benmccann May 5, 2025
e1bde9d
Merge branch 'main' into rolldown
eltigerchino May 6, 2025
950ccb8
remove expect error
eltigerchino May 6, 2025
85ef7da
change to rolldown types
eltigerchino May 6, 2025
5ee6e9d
oops
eltigerchino May 6, 2025
fcddf95
Merge branch 'main' into rolldown
eltigerchino May 8, 2025
90bde1e
Update packages/kit/src/exports/vite/index.js
eltigerchino Jun 13, 2025
9ddde7c
Merge branch 'main' into rolldown
eltigerchino Jun 16, 2025
437af20
format
eltigerchino Jun 16, 2025
020704a
upgrade vps
eltigerchino Jun 16, 2025
8f44efd
add todo to client config too
eltigerchino Jun 16, 2025
f54548e
update vite and fix lint errors
eltigerchino Jun 16, 2025
5dc3c16
remove rolldown check for minify
eltigerchino Jun 17, 2025
378c051
bump rolldown-vite
eltigerchino Jun 17, 2025
b92bae1
bump rolldown-vite
eltigerchino Jun 17, 2025
cdcd915
require node 20.19.2 or newer
eltigerchino Jun 17, 2025
b5e1e46
Revert "require node 20.19.2 or newer"
eltigerchino Jun 17, 2025
e0cdeac
Update packages/kit/test/apps/basics/test/client.test.js
eltigerchino Jun 18, 2025
547907b
add rolldown check for warning code
eltigerchino Jun 18, 2025
3802f31
the vite team is fast and amazing
eltigerchino Jun 18, 2025
78ec612
fix types
eltigerchino Jun 19, 2025
e3db0ec
remove rolldown types
eltigerchino Jun 19, 2025
fc4d196
add native plugin issue to comment
eltigerchino Jun 19, 2025
2e5b2f5
changeset
eltigerchino Jun 19, 2025
1c73c93
remove rolldown override
eltigerchino Jun 19, 2025
d501134
oopsie forgot one
eltigerchino Jun 19, 2025
2579931
expect ts error
eltigerchino Jun 19, 2025
af08235
ugh forgot this one because I had build excluded in my search
eltigerchino Jun 19, 2025
fef086e
last one
eltigerchino Jun 19, 2025
c0cf4ba
revert
eltigerchino Jun 19, 2025
0a3ed62
try fixing lockfile
benmccann Jun 19, 2025
48bfac4
Update .changeset/nine-ads-tease.md
benmccann Jun 19, 2025
c3d2e95
revert typescript from 5.8.3 to 5.6.3
eltigerchino Jun 20, 2025
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
5 changes: 5 additions & 0 deletions .changeset/nine-ads-tease.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@sveltejs/kit': minor
---

feat: add support for Rolldown. See https://vite.dev/guide/rolldown.html#how-to-try-rolldown for details about how to try it. You will also need `vite-plugin-svelte@^6.0.0-next.0` and `vite@^7.0.0-beta.0`.
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
"pnpm": {
"onlyBuiltDependencies": [
"esbuild",
"rolldown",
"sharp",
"svelte-preprocess",
"workerd"
Expand Down
2 changes: 1 addition & 1 deletion packages/adapter-auto/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
},
"devDependencies": {
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"@types/node": "^18.19.48",
"typescript": "^5.3.3",
"vitest": "catalog:"
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-cloudflare/test/apps/pages/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
},
"devDependencies": {
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"server-side-dep": "file:server-side-dep",
"svelte": "^5.23.1",
"vite": "^6.2.7",
"vite": "catalog:",
"wrangler": "^4.14.3"
},
"type": "module"
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-cloudflare/test/apps/workers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
},
"devDependencies": {
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"server-side-dep": "file:server-side-dep",
"svelte": "^5.23.1",
"vite": "^6.2.7",
"vite": "catalog:",
"wrangler": "^4.14.3"
},
"type": "module"
Expand Down
2 changes: 1 addition & 1 deletion packages/adapter-netlify/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^16.0.0",
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"@types/node": "^18.19.48",
"@types/set-cookie-parser": "^2.4.7",
"rollup": "^4.14.2",
Expand Down
2 changes: 1 addition & 1 deletion packages/adapter-node/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"devDependencies": {
"@polka/url": "^1.0.0-next.28",
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"@types/node": "^18.19.48",
"polka": "^1.0.0-next.28",
"sirv": "^3.0.0",
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-static/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,12 @@
"devDependencies": {
"@playwright/test": "catalog:",
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"@types/node": "^18.19.48",
"sirv": "^3.0.0",
"svelte": "^5.23.1",
"typescript": "^5.3.3",
"vite": "^6.2.7"
"vite": "catalog:"
},
"peerDependencies": {
"@sveltejs/kit": "^2.0.0"
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-static/test/apps/prerendered/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@
},
"devDependencies": {
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"sirv-cli": "^3.0.0",
"svelte": "^5.23.1",
"vite": "^6.2.7"
"vite": "catalog:"
},
"type": "module"
}
4 changes: 2 additions & 2 deletions packages/adapter-static/test/apps/spa/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
"devDependencies": {
"@sveltejs/adapter-node": "workspace:^",
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"sirv-cli": "^3.0.0",
"svelte": "^5.23.1",
"vite": "^6.2.7"
"vite": "catalog:"
},
"type": "module"
}
2 changes: 1 addition & 1 deletion packages/adapter-vercel/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
},
"devDependencies": {
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"@types/node": "^18.19.48",
"typescript": "^5.3.3",
"vitest": "catalog:"
Expand Down
4 changes: 2 additions & 2 deletions packages/enhanced-img/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,13 @@
"zimmerframe": "^1.1.2"
},
"devDependencies": {
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"@types/estree": "^1.0.5",
"@types/node": "^18.19.48",
"rollup": "^4.27.4",
"svelte": "^5.23.1",
"typescript": "^5.6.3",
"vite": "^6.2.7",
"vite": "catalog:",
"vitest": "catalog:"
},
"peerDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions packages/enhanced-img/test/markup-plugin.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ it('Image preprocess snapshot test', async () => {
throw new Error(`unrecognized id ${id}`);
}
});
const plugin_context = /** @type {import('rollup').TransformPluginContext} */ (
const plugin_context = /** @type {import('vite').Rollup.TransformPluginContext} */ (
/** @type {unknown} */ ({
// @ts-ignore
resolve(url) {
Expand All @@ -27,7 +27,7 @@ it('Image preprocess snapshot test', async () => {
})
);
const transform =
/** @type {(this: import('rollup').TransformPluginContext, code: string, id: string, options?: {ssr?: boolean;}) => Promise<import('rollup').TransformResult>} */ (
/** @type {(this: import('vite').Rollup.TransformPluginContext, code: string, id: string, options?: {ssr?: boolean;}) => Promise<import('rollup').TransformResult>} */ (
vite_plugin.transform
);
const transformed = await transform.call(
Expand Down
8 changes: 4 additions & 4 deletions packages/kit/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
},
"devDependencies": {
"@playwright/test": "catalog:",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"@types/connect": "^3.4.38",
"@types/node": "^18.19.48",
"@types/set-cookie-parser": "^2.4.7",
Expand All @@ -43,13 +43,13 @@
"svelte": "^5.23.1",
"svelte-preprocess": "^6.0.0",
"typescript": "^5.3.3",
"vite": "^6.2.7",
"vite": "catalog:",
"vitest": "catalog:"
},
"peerDependencies": {
"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0",
"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0",
"svelte": "^4.0.0 || ^5.0.0-next.0",
"vite": "^5.0.3 || ^6.0.0"
"vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0"
},
"bin": {
"svelte-kit": "svelte-kit.js"
Expand Down
12 changes: 5 additions & 7 deletions packages/kit/src/exports/vite/build/build_server.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,20 @@ import { create_node_analyser } from '../static_analysis/index.js';
* @param {import('vite').Manifest} server_manifest
* @param {import('vite').Manifest | null} client_manifest
* @param {import('vite').Rollup.OutputBundle | null} server_bundle
* @param {import('vite').Rollup.RollupOutput['output'] | null} client_bundle
* @param {import('vite').Rollup.RollupOutput['output'] | null} client_chunks
* @param {import('types').RecursiveRequired<import('types').ValidatedConfig['kit']['output']>} output_config
* @param {Map<string, { page_options: Record<string, any> | null, children: string[] }>} static_exports
*/
export async function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, server_bundle, client_bundle, output_config, static_exports) {
export async function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, server_bundle, client_chunks, output_config, static_exports) {
mkdirp(`${out}/server/nodes`);
mkdirp(`${out}/server/stylesheets`);

/** @type {Map<string, string>} */
const stylesheets_to_inline = new Map();

if (server_bundle && client_bundle && kit.inlineStyleThreshold > 0) {
const client = get_stylesheets(client_bundle);

const server_chunks = Object.values(server_bundle);
const server = get_stylesheets(server_chunks);
if (server_bundle && client_chunks && kit.inlineStyleThreshold > 0) {
const client = get_stylesheets(client_chunks);
const server = get_stylesheets(Object.values(server_bundle));

// map server stylesheet name to the client stylesheet name
for (const [id, client_stylesheet] of client.stylesheets_used) {
Expand Down
8 changes: 6 additions & 2 deletions packages/kit/src/exports/vite/build/build_service_worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ export async function build_service_worker(
},
output: {
// .mjs so that esbuild doesn't incorrectly inject `export` https://github.com/vitejs/vite/issues/15379
entryFileNames: 'service-worker.mjs',
// @ts-expect-error `vite.rolldownVersion` only exists in `rolldown-vite`
entryFileNames: `service-worker.${vite.rolldownVersion ? 'js' : 'mjs'}`,
assetFileNames: `${kit.appDir}/immutable/assets/[name].[hash][extname]`,
inlineDynamicImports: true
}
Expand All @@ -129,5 +130,8 @@ export async function build_service_worker(
});

// rename .mjs to .js to avoid incorrect MIME types with ancient webservers
fs.renameSync(`${out}/client/service-worker.mjs`, `${out}/client/service-worker.js`);
// @ts-expect-error `vite.rolldownVersion` only exists in `rolldown-vite`
if (!vite.rolldownVersion) {
fs.renameSync(`${out}/client/service-worker.mjs`, `${out}/client/service-worker.js`);
}
}
37 changes: 32 additions & 5 deletions packages/kit/src/exports/vite/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ let manifest_data;
* @return {Promise<import('vite').Plugin[]>}
*/
async function kit({ svelte_config }) {
/** @type {import('vite')} */
const vite = await import_peer('vite');

const { kit } = svelte_config;
Expand Down Expand Up @@ -694,13 +695,15 @@ Tips:
assetFileNames: `${prefix}/assets/[name].[hash][extname]`,
hoistTransitiveImports: false,
sourcemapIgnoreList,
manualChunks: split ? undefined : () => 'bundle',
inlineDynamicImports: false
},
preserveEntrySignatures: 'strict',
onwarn(warning, handler) {
if (
warning.code === 'MISSING_EXPORT' &&
// @ts-expect-error `vite.rolldownVersion` only exists in `rolldown-vite`
(vite.rolldownVersion
? warning.code === 'IMPORT_IS_UNDEFINED'
: warning.code === 'MISSING_EXPORT') &&
warning.id === `${kit.outDir}/generated/client-optimized/app.js`
) {
// ignore e.g. undefined `handleError` hook when
Expand All @@ -725,7 +728,25 @@ Tips:
}
}
}
// TODO: enabling `experimental.enableNativePlugin` causes styles to not be applied
// see https://github.com/vitejs/rolldown-vite/issues/213
// experimental: {
// enableNativePlugin: true
// }
};

if (!split && new_config.build?.rollupOptions?.output) {
const output_options = /** @type {import('vite').Rollup.OutputOptions} */ (
new_config.build.rollupOptions.output
);
// @ts-expect-error `vite.rolldownVersion` only exists in `rolldown-vite`
if (vite.rolldownVersion) {
output_options.inlineDynamicImports = true;
} else {
/** @type {import('rollup').OutputOptions} */ (output_options).manualChunks = () =>
'bundle';
}
}
} else {
new_config = {
appType: 'custom',
Expand All @@ -738,6 +759,11 @@ Tips:
}
},
publicDir: kit.files.assets
// TODO: enabling `experimental.enableNativePlugin` causes styles to not be applied
// see https://github.com/vitejs/rolldown-vite/issues/213
// experimental: {
// enableNativePlugin: true
// }
};
}

Expand Down Expand Up @@ -779,7 +805,8 @@ Tips:
renderChunk(code, chunk) {
if (code.includes('__SVELTEKIT_TRACK__')) {
return {
code: code.replace(/__SVELTEKIT_TRACK__\('(.+?)'\)/g, (_, label) => {
// Rolldown changes our single quotes to double quotes so we need it in the regex too
code: code.replace(/__SVELTEKIT_TRACK__\(['"](.+?)['"]\)/g, (_, label) => {
(tracked_features[chunk.name + '.js'] ??= []).push(label);
// put extra whitespace at the end of the comment to preserve the source size and avoid interfering with source maps
return `/* track ${label} */`;
Expand Down Expand Up @@ -960,7 +987,7 @@ Tips:
};

if (svelte_config.kit.output.bundleStrategy === 'inline') {
const style = /** @type {import('rollup').OutputAsset} */ (
const style = /** @type {import('vite').Rollup.OutputAsset} */ (
client_chunks.find(
(chunk) =>
chunk.type === 'asset' &&
Expand Down Expand Up @@ -1035,7 +1062,7 @@ Tips:
...vite_config,
build: {
...vite_config.build,
minify: initial_config.build?.minify ?? 'esbuild'
minify: initial_config.build?.minify ?? true
}
},
manifest_data,
Expand Down
9 changes: 6 additions & 3 deletions packages/kit/src/runtime/client/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -712,9 +712,12 @@ async function load_node({ loader, parent, url, params, route, server_data_node
: await resource.blob(),
cache: resource.cache,
credentials: resource.credentials,
// the headers are undefined on the server if the Headers object is empty
// so we need to make sure they are also undefined here if there are no headers
headers: [...resource.headers].length ? resource.headers : undefined,
// the server sets headers to `undefined` if there are no headers but
// the client defaults to an empty Headers object in the Request object.
// To keep the two values in sync, we explicitly set the headers to `undefined`.
// Also, not sure why, but sometimes 0 is evaluated as truthy so we need to
// explicitly compare the headers length to a number here
headers: [...resource.headers].length > 0 ? resource?.headers : undefined,
integrity: resource.integrity,
keepalive: resource.keepalive,
method: resource.method,
Expand Down
4 changes: 2 additions & 2 deletions packages/kit/test/apps/amp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@
"devDependencies": {
"@sveltejs/amp": "workspace:^",
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"cross-env": "^7.0.3",
"dropcss": "^1.0.16",
"svelte": "^5.23.1",
"svelte-check": "^4.1.1",
"typescript": "^5.5.4",
"vite": "^6.2.7"
"vite": "catalog:"
},
"type": "module"
}
4 changes: 2 additions & 2 deletions packages/kit/test/apps/basics/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@
},
"devDependencies": {
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"cross-env": "^7.0.3",
"svelte": "^5.23.1",
"svelte-check": "^4.1.1",
"redirect-pkg": "file:./_test_dependencies/redirect-pkg",
"typescript": "^5.5.4",
"vite": "^6.2.7"
"vite": "catalog:"
},
"type": "module"
}
4 changes: 2 additions & 2 deletions packages/kit/test/apps/basics/test/client.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -1268,7 +1268,7 @@
expect(page.locator('p.loadingfail')).toBeHidden();
});

test('Catches fetch errors from server load functions (direct hit)', async ({ page }) => {

Check warning on line 1271 in packages/kit/test/apps/basics/test/client.test.js

View workflow job for this annotation

GitHub Actions / test-kit-server-side-route-resolution (dev)

flaky test: Catches fetch errors from server load functions (direct hit)

retries: 2
page.goto('/streaming/server-error');
await expect(page.locator('p.eager')).toHaveText('eager');
await expect(page.locator('p.fail')).toHaveText('fail');
Expand Down Expand Up @@ -1494,10 +1494,10 @@
await page.goto('/reroute/external');
const current_url = new URL(page.url());

//click the link with the text External URL
// click the link with the text External URL
await page.click("a[data-test='external-url']");

//The URl should not have the same origin as the current URL
// The URL should not have the same origin as the current URL
const new_url = new URL(page.url());
expect(current_url.origin).not.toEqual(new_url.origin);
});
Expand Down
4 changes: 2 additions & 2 deletions packages/kit/test/apps/dev-only/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
},
"devDependencies": {
"@sveltejs/kit": "workspace:^",
"@sveltejs/vite-plugin-svelte": "^5.0.1",
"@sveltejs/vite-plugin-svelte": "catalog:",
"cross-env": "^7.0.3",
"e2e-test-dep-error": "file:./_test_dependencies/cjs-only",
"e2e-test-dep-hooks": "file:./_test_dependencies/cjs-only",
Expand All @@ -27,7 +27,7 @@
"svelte": "^5.23.1",
"svelte-check": "^4.1.1",
"typescript": "^5.5.4",
"vite": "^6.2.7"
"vite": "catalog:"
},
"type": "module"
}
Loading
Loading