Skip to content

Conversation

@dummdidumm
Copy link
Member

@dummdidumm dummdidumm commented Oct 10, 2025

We tried very hard to get manualChunks to work (see #14632 for the latest attempt) but it just doesn't quite work out. What we need is to actually have Vite/Rollup know about the proper entry points to then resolve everything from there. The problem previously was that we didn't know of a good way to know which entry points we have on the fly.

Turns out, this.emitFile is our savior (https://rollupjs.org/plugin-development/#this-emitfile). We can use it to create entry points while traversing the module graph and have Vite/Rollup wire up everything correctly.

Fixes #14679
Fixes #14708
Fixes #14736


Please don't delete this checklist! Before submitting the PR, please make sure you do the following:

  • It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs
  • This message body should clearly illustrate what problems it solves.
  • Ideally, include a test that fails without this PR but passes with it.

Tests

  • Run the tests with pnpm test and lint the project with pnpm lint and pnpm check

Changesets

  • If your PR makes a change that should be noted in one or more packages' changelogs, generate a changeset by running pnpm changeset and following the prompts. Changesets that add features should be minor and those that fix bugs should be patch. Please prefix changeset messages with feat:, fix:, or chore:.
We tried very hard to get manualChunks to work (see #14632 for the latest attempt) but it just doesn't quite work out. What we need is to actually have Vite/Rollup know about the proper entry points to then resolve everything from there. The problem previously was that we didn't know of a good way to know which entry points we have on the fly. Turns out, `this.emitFile` is our savior (https://rollupjs.org/plugin-development/#this-emitfile). We can use it to create entry points while traversing the module graph and have Vite/Rollup wire up everything correctly. Fixes #14679
@changeset-bot
Copy link

changeset-bot bot commented Oct 10, 2025

🦋 Changeset detected

Latest commit: 85dbbd6

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@sveltejs/kit Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@alexbjorlig
Copy link
Contributor

If it’s possible to prioritize this PR, I’d greatly appreciate it 🙏
We’re currently blocked on version 2.38.1, and updating to the latest version would help us move forward — including with our Rolldown testing.

@teemingc
Copy link
Member

teemingc commented Oct 17, 2025

Commenting just so it's easy to find the historical context of this again: #14293 is the PR that introduced the manualChunks solution for finding remote functions in node_modules.

@dummdidumm
Copy link
Member Author

Tried to come up with a good testcase, alas there's nothing sensible except the repositories themselves, and even they may change depending on module ordering etc.
So I think we have to go without a test on this one.

@dummdidumm dummdidumm merged commit b99b88c into main Oct 17, 2025
22 checks passed
@dummdidumm dummdidumm deleted the fix-remote-files-graph-take-10000 branch October 17, 2025 08:12
@github-actions github-actions bot mentioned this pull request Oct 17, 2025
@Blackwidow-sudo
Copy link

Blackwidow-sudo commented Oct 24, 2025

There is still some issue with the order of declarations when using a shared schema for server & client, for example.
I have a zod schema exported by my <script module> in routes/login/+page.svelte and use it in routes/login/login.remote.js.
When building i get:

ReferenceError [Error]: can't access lexical declaration 'schema' before initialization 

because the order is messed up in .svelte-kit/output/server/chunks/_page.js:

import { z as attributes } from "./index.js"; import "@sveltejs/kit/internal/server"; import "./utils.js"; import "@sveltejs/kit"; import { f as form } from "./query.js"; import * as z from "zod"; import { init_remote_functions } from "@sveltejs/kit/internal"; const m = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, get login() { return login; } }, Symbol.toStringTag, { value: "Module" })); const login = form(schema, (data) => { console.log(data); }); init_remote_functions(m, "src/routes/form/login.remote.js", "dth4yy"); for (const [name, fn] of Object.entries(m)) { fn.__.id = "dth4yy/" + name; fn.__.name = name; } const schema = z.object({ email: z.email(), password: z.string().min(8) }); function _page($$renderer, $$props) { $$renderer.component(($$renderer2) => { $$renderer2.push(`<form${attributes({ ...login.preflight(schema) })}><label>Email: <input${attributes({ ...login.fields.email.as("email") }, void 0, void 0, void 0, 4)}/></label> <label>Password: <input${attributes({ ...login.fields.password.as("password") }, void 0, void 0, void 0, 4)}/></label> <button type="submit">Login</button></form>`); }); } export { _page as _, m, schema as s };
@teemingc
Copy link
Member

There is still some issue with the order of declarations when using a shared schema for server & client, for example. I have a zod schema exported by my <script module> in routes/login/+page.svelte and use it in routes/login/login.remote.js. When building i get:

ReferenceError [Error]: can't access lexical declaration 'schema' before initialization 

because the order is messed up in .svelte-kit/output/server/chunks/_page.js:

import { z as attributes } from "./index.js"; import "@sveltejs/kit/internal/server"; import "./utils.js"; import "@sveltejs/kit"; import { f as form } from "./query.js"; import * as z from "zod"; import { init_remote_functions } from "@sveltejs/kit/internal"; const m = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, get login() { return login; } }, Symbol.toStringTag, { value: "Module" })); const login = form(schema, (data) => { console.log(data); }); init_remote_functions(m, "src/routes/form/login.remote.js", "dth4yy"); for (const [name, fn] of Object.entries(m)) { fn.__.id = "dth4yy/" + name; fn.__.name = name; } const schema = z.object({ email: z.email(), password: z.string().min(8) }); function _page($$renderer, $$props) { $$renderer.component(($$renderer2) => { $$renderer2.push(`<form${attributes({ ...login.preflight(schema) })}><label>Email: <input${attributes({ ...login.fields.email.as("email") }, void 0, void 0, void 0, 4)}/></label> <label>Password: <input${attributes({ ...login.fields.password.as("password") }, void 0, void 0, void 0, 4)}/></label> <button type="submit">Login</button></form>`); }); } export { _page as _, m, schema as s };

Can you create a new issue with a minimal reproduction?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

5 participants