Skip to content

Commit aaa4a31

Browse files
authored
feat: support Rolldown (#13747)
1 parent 293392b commit aaa4a31

File tree

50 files changed

+453
-465
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+453
-465
lines changed

.changeset/nine-ads-tease.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@sveltejs/kit': minor
3+
---
4+
5+
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`.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"pnpm": {
3939
"onlyBuiltDependencies": [
4040
"esbuild",
41+
"rolldown",
4142
"sharp",
4243
"svelte-preprocess",
4344
"workerd"

packages/adapter-auto/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
},
4242
"devDependencies": {
4343
"@sveltejs/kit": "workspace:^",
44-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
44+
"@sveltejs/vite-plugin-svelte": "catalog:",
4545
"@types/node": "^18.19.48",
4646
"typescript": "^5.3.3",
4747
"vitest": "catalog:"

packages/adapter-cloudflare/test/apps/pages/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
},
1212
"devDependencies": {
1313
"@sveltejs/kit": "workspace:^",
14-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
14+
"@sveltejs/vite-plugin-svelte": "catalog:",
1515
"server-side-dep": "file:server-side-dep",
1616
"svelte": "^5.23.1",
17-
"vite": "^6.2.7",
17+
"vite": "catalog:",
1818
"wrangler": "^4.14.3"
1919
},
2020
"type": "module"

packages/adapter-cloudflare/test/apps/workers/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
},
1212
"devDependencies": {
1313
"@sveltejs/kit": "workspace:^",
14-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
14+
"@sveltejs/vite-plugin-svelte": "catalog:",
1515
"server-side-dep": "file:server-side-dep",
1616
"svelte": "^5.23.1",
17-
"vite": "^6.2.7",
17+
"vite": "catalog:",
1818
"wrangler": "^4.14.3"
1919
},
2020
"type": "module"

packages/adapter-netlify/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
"@rollup/plugin-json": "^6.1.0",
5252
"@rollup/plugin-node-resolve": "^16.0.0",
5353
"@sveltejs/kit": "workspace:^",
54-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
54+
"@sveltejs/vite-plugin-svelte": "catalog:",
5555
"@types/node": "^18.19.48",
5656
"@types/set-cookie-parser": "^2.4.7",
5757
"rollup": "^4.14.2",

packages/adapter-node/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
"devDependencies": {
4545
"@polka/url": "^1.0.0-next.28",
4646
"@sveltejs/kit": "workspace:^",
47-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
47+
"@sveltejs/vite-plugin-svelte": "catalog:",
4848
"@types/node": "^18.19.48",
4949
"polka": "^1.0.0-next.28",
5050
"sirv": "^3.0.0",

packages/adapter-static/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@
4141
"devDependencies": {
4242
"@playwright/test": "catalog:",
4343
"@sveltejs/kit": "workspace:^",
44-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
44+
"@sveltejs/vite-plugin-svelte": "catalog:",
4545
"@types/node": "^18.19.48",
4646
"sirv": "^3.0.0",
4747
"svelte": "^5.23.1",
4848
"typescript": "^5.3.3",
49-
"vite": "^6.2.7"
49+
"vite": "catalog:"
5050
},
5151
"peerDependencies": {
5252
"@sveltejs/kit": "^2.0.0"

packages/adapter-static/test/apps/prerendered/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
},
1111
"devDependencies": {
1212
"@sveltejs/kit": "workspace:^",
13-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
13+
"@sveltejs/vite-plugin-svelte": "catalog:",
1414
"sirv-cli": "^3.0.0",
1515
"svelte": "^5.23.1",
16-
"vite": "^6.2.7"
16+
"vite": "catalog:"
1717
},
1818
"type": "module"
1919
}

packages/adapter-static/test/apps/spa/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
"devDependencies": {
1212
"@sveltejs/adapter-node": "workspace:^",
1313
"@sveltejs/kit": "workspace:^",
14-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
14+
"@sveltejs/vite-plugin-svelte": "catalog:",
1515
"sirv-cli": "^3.0.0",
1616
"svelte": "^5.23.1",
17-
"vite": "^6.2.7"
17+
"vite": "catalog:"
1818
},
1919
"type": "module"
2020
}

packages/adapter-vercel/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
},
4646
"devDependencies": {
4747
"@sveltejs/kit": "workspace:^",
48-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
48+
"@sveltejs/vite-plugin-svelte": "catalog:",
4949
"@types/node": "^18.19.48",
5050
"typescript": "^5.3.3",
5151
"vitest": "catalog:"

packages/enhanced-img/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@
4343
"zimmerframe": "^1.1.2"
4444
},
4545
"devDependencies": {
46-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
46+
"@sveltejs/vite-plugin-svelte": "catalog:",
4747
"@types/estree": "^1.0.5",
4848
"@types/node": "^18.19.48",
4949
"rollup": "^4.27.4",
5050
"svelte": "^5.23.1",
5151
"typescript": "^5.6.3",
52-
"vite": "^6.2.7",
52+
"vite": "catalog:",
5353
"vitest": "catalog:"
5454
},
5555
"peerDependencies": {

packages/enhanced-img/test/markup-plugin.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ it('Image preprocess snapshot test', async () => {
1818
throw new Error(`unrecognized id ${id}`);
1919
}
2020
});
21-
const plugin_context = /** @type {import('rollup').TransformPluginContext} */ (
21+
const plugin_context = /** @type {import('vite').Rollup.TransformPluginContext} */ (
2222
/** @type {unknown} */ ({
2323
// @ts-ignore
2424
resolve(url) {
@@ -27,7 +27,7 @@ it('Image preprocess snapshot test', async () => {
2727
})
2828
);
2929
const transform =
30-
/** @type {(this: import('rollup').TransformPluginContext, code: string, id: string, options?: {ssr?: boolean;}) => Promise<import('rollup').TransformResult>} */ (
30+
/** @type {(this: import('vite').Rollup.TransformPluginContext, code: string, id: string, options?: {ssr?: boolean;}) => Promise<import('rollup').TransformResult>} */ (
3131
vite_plugin.transform
3232
);
3333
const transformed = await transform.call(

packages/kit/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
},
3535
"devDependencies": {
3636
"@playwright/test": "catalog:",
37-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
37+
"@sveltejs/vite-plugin-svelte": "catalog:",
3838
"@types/connect": "^3.4.38",
3939
"@types/node": "^18.19.48",
4040
"@types/set-cookie-parser": "^2.4.7",
@@ -43,13 +43,13 @@
4343
"svelte": "^5.23.1",
4444
"svelte-preprocess": "^6.0.0",
4545
"typescript": "^5.3.3",
46-
"vite": "^6.2.7",
46+
"vite": "catalog:",
4747
"vitest": "catalog:"
4848
},
4949
"peerDependencies": {
50-
"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0",
50+
"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0",
5151
"svelte": "^4.0.0 || ^5.0.0-next.0",
52-
"vite": "^5.0.3 || ^6.0.0"
52+
"vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0"
5353
},
5454
"bin": {
5555
"svelte-kit": "svelte-kit.js"

packages/kit/src/exports/vite/build/build_server.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,20 @@ import { create_node_analyser } from '../static_analysis/index.js';
1414
* @param {import('vite').Manifest} server_manifest
1515
* @param {import('vite').Manifest | null} client_manifest
1616
* @param {import('vite').Rollup.OutputBundle | null} server_bundle
17-
* @param {import('vite').Rollup.RollupOutput['output'] | null} client_bundle
17+
* @param {import('vite').Rollup.RollupOutput['output'] | null} client_chunks
1818
* @param {import('types').RecursiveRequired<import('types').ValidatedConfig['kit']['output']>} output_config
1919
* @param {Map<string, { page_options: Record<string, any> | null, children: string[] }>} static_exports
2020
*/
21-
export async function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, server_bundle, client_bundle, output_config, static_exports) {
21+
export async function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, server_bundle, client_chunks, output_config, static_exports) {
2222
mkdirp(`${out}/server/nodes`);
2323
mkdirp(`${out}/server/stylesheets`);
2424

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

28-
if (server_bundle && client_bundle && kit.inlineStyleThreshold > 0) {
29-
const client = get_stylesheets(client_bundle);
30-
31-
const server_chunks = Object.values(server_bundle);
32-
const server = get_stylesheets(server_chunks);
28+
if (server_bundle && client_chunks && kit.inlineStyleThreshold > 0) {
29+
const client = get_stylesheets(client_chunks);
30+
const server = get_stylesheets(Object.values(server_bundle));
3331

3432
// map server stylesheet name to the client stylesheet name
3533
for (const [id, client_stylesheet] of client.stylesheets_used) {

packages/kit/src/exports/vite/build/build_service_worker.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ export async function build_service_worker(
103103
},
104104
output: {
105105
// .mjs so that esbuild doesn't incorrectly inject `export` https://github.com/vitejs/vite/issues/15379
106-
entryFileNames: 'service-worker.mjs',
106+
// @ts-expect-error `vite.rolldownVersion` only exists in `rolldown-vite`
107+
entryFileNames: `service-worker.${vite.rolldownVersion ? 'js' : 'mjs'}`,
107108
assetFileNames: `${kit.appDir}/immutable/assets/[name].[hash][extname]`,
108109
inlineDynamicImports: true
109110
}
@@ -129,5 +130,8 @@ export async function build_service_worker(
129130
});
130131

131132
// rename .mjs to .js to avoid incorrect MIME types with ancient webservers
132-
fs.renameSync(`${out}/client/service-worker.mjs`, `${out}/client/service-worker.js`);
133+
// @ts-expect-error `vite.rolldownVersion` only exists in `rolldown-vite`
134+
if (!vite.rolldownVersion) {
135+
fs.renameSync(`${out}/client/service-worker.mjs`, `${out}/client/service-worker.js`);
136+
}
133137
}

packages/kit/src/exports/vite/index.js

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ let manifest_data;
182182
* @return {Promise<import('vite').Plugin[]>}
183183
*/
184184
async function kit({ svelte_config }) {
185+
/** @type {import('vite')} */
185186
const vite = await import_peer('vite');
186187

187188
const { kit } = svelte_config;
@@ -694,13 +695,15 @@ Tips:
694695
assetFileNames: `${prefix}/assets/[name].[hash][extname]`,
695696
hoistTransitiveImports: false,
696697
sourcemapIgnoreList,
697-
manualChunks: split ? undefined : () => 'bundle',
698698
inlineDynamicImports: false
699699
},
700700
preserveEntrySignatures: 'strict',
701701
onwarn(warning, handler) {
702702
if (
703-
warning.code === 'MISSING_EXPORT' &&
703+
// @ts-expect-error `vite.rolldownVersion` only exists in `rolldown-vite`
704+
(vite.rolldownVersion
705+
? warning.code === 'IMPORT_IS_UNDEFINED'
706+
: warning.code === 'MISSING_EXPORT') &&
704707
warning.id === `${kit.outDir}/generated/client-optimized/app.js`
705708
) {
706709
// ignore e.g. undefined `handleError` hook when
@@ -725,7 +728,25 @@ Tips:
725728
}
726729
}
727730
}
731+
// TODO: enabling `experimental.enableNativePlugin` causes styles to not be applied
732+
// see https://github.com/vitejs/rolldown-vite/issues/213
733+
// experimental: {
734+
// enableNativePlugin: true
735+
// }
728736
};
737+
738+
if (!split && new_config.build?.rollupOptions?.output) {
739+
const output_options = /** @type {import('vite').Rollup.OutputOptions} */ (
740+
new_config.build.rollupOptions.output
741+
);
742+
// @ts-expect-error `vite.rolldownVersion` only exists in `rolldown-vite`
743+
if (vite.rolldownVersion) {
744+
output_options.inlineDynamicImports = true;
745+
} else {
746+
/** @type {import('rollup').OutputOptions} */ (output_options).manualChunks = () =>
747+
'bundle';
748+
}
749+
}
729750
} else {
730751
new_config = {
731752
appType: 'custom',
@@ -738,6 +759,11 @@ Tips:
738759
}
739760
},
740761
publicDir: kit.files.assets
762+
// TODO: enabling `experimental.enableNativePlugin` causes styles to not be applied
763+
// see https://github.com/vitejs/rolldown-vite/issues/213
764+
// experimental: {
765+
// enableNativePlugin: true
766+
// }
741767
};
742768
}
743769

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

962989
if (svelte_config.kit.output.bundleStrategy === 'inline') {
963-
const style = /** @type {import('rollup').OutputAsset} */ (
990+
const style = /** @type {import('vite').Rollup.OutputAsset} */ (
964991
client_chunks.find(
965992
(chunk) =>
966993
chunk.type === 'asset' &&
@@ -1035,7 +1062,7 @@ Tips:
10351062
...vite_config,
10361063
build: {
10371064
...vite_config.build,
1038-
minify: initial_config.build?.minify ?? 'esbuild'
1065+
minify: initial_config.build?.minify ?? true
10391066
}
10401067
},
10411068
manifest_data,

packages/kit/src/runtime/client/client.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -712,9 +712,12 @@ async function load_node({ loader, parent, url, params, route, server_data_node
712712
: await resource.blob(),
713713
cache: resource.cache,
714714
credentials: resource.credentials,
715-
// the headers are undefined on the server if the Headers object is empty
716-
// so we need to make sure they are also undefined here if there are no headers
717-
headers: [...resource.headers].length ? resource.headers : undefined,
715+
// the server sets headers to `undefined` if there are no headers but
716+
// the client defaults to an empty Headers object in the Request object.
717+
// To keep the two values in sync, we explicitly set the headers to `undefined`.
718+
// Also, not sure why, but sometimes 0 is evaluated as truthy so we need to
719+
// explicitly compare the headers length to a number here
720+
headers: [...resource.headers].length > 0 ? resource?.headers : undefined,
718721
integrity: resource.integrity,
719722
keepalive: resource.keepalive,
720723
method: resource.method,

packages/kit/test/apps/amp/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
"devDependencies": {
1616
"@sveltejs/amp": "workspace:^",
1717
"@sveltejs/kit": "workspace:^",
18-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
18+
"@sveltejs/vite-plugin-svelte": "catalog:",
1919
"cross-env": "^7.0.3",
2020
"dropcss": "^1.0.16",
2121
"svelte": "^5.23.1",
2222
"svelte-check": "^4.1.1",
2323
"typescript": "^5.5.4",
24-
"vite": "^6.2.7"
24+
"vite": "catalog:"
2525
},
2626
"type": "module"
2727
}

packages/kit/test/apps/basics/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@
1818
},
1919
"devDependencies": {
2020
"@sveltejs/kit": "workspace:^",
21-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
21+
"@sveltejs/vite-plugin-svelte": "catalog:",
2222
"cross-env": "^7.0.3",
2323
"svelte": "^5.23.1",
2424
"svelte-check": "^4.1.1",
2525
"redirect-pkg": "file:./_test_dependencies/redirect-pkg",
2626
"typescript": "^5.5.4",
27-
"vite": "^6.2.7"
27+
"vite": "catalog:"
2828
},
2929
"type": "module"
3030
}

packages/kit/test/apps/basics/test/client.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,10 +1494,10 @@ test.describe('reroute', () => {
14941494
await page.goto('/reroute/external');
14951495
const current_url = new URL(page.url());
14961496

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

1500-
//The URl should not have the same origin as the current URL
1500+
// The URL should not have the same origin as the current URL
15011501
const new_url = new URL(page.url());
15021502
expect(current_url.origin).not.toEqual(new_url.origin);
15031503
});

packages/kit/test/apps/dev-only/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
},
1313
"devDependencies": {
1414
"@sveltejs/kit": "workspace:^",
15-
"@sveltejs/vite-plugin-svelte": "^5.0.1",
15+
"@sveltejs/vite-plugin-svelte": "catalog:",
1616
"cross-env": "^7.0.3",
1717
"e2e-test-dep-error": "file:./_test_dependencies/cjs-only",
1818
"e2e-test-dep-hooks": "file:./_test_dependencies/cjs-only",
@@ -27,7 +27,7 @@
2727
"svelte": "^5.23.1",
2828
"svelte-check": "^4.1.1",
2929
"typescript": "^5.5.4",
30-
"vite": "^6.2.7"
30+
"vite": "catalog:"
3131
},
3232
"type": "module"
3333
}

0 commit comments

Comments
 (0)