feat: use import.meta.ROLLDOWN_FILE_URL_* for assets in JS - #22888
Merged
Conversation
import.meta.ROLLUP_FILE_URL_* for assets in JSimport.meta.ROLLDOWN_FILE_URL_* for assets in JS
sapphi-red
force-pushed
the
refactor/exclude-postfix-from-vite-asset
branch
from
July 31, 2026 07:54
8e95035 to
9e6975b
Compare
sapphi-red
force-pushed
the
feat/use-rollup-file-url-for-assets-in-js
branch
from
July 31, 2026 07:54
2f1bf1f to
0cf8fd6
Compare
sapphi-red
force-pushed
the
refactor/exclude-postfix-from-vite-asset
branch
from
July 31, 2026 08:43
9e6975b to
220ccd8
Compare
sapphi-red
force-pushed
the
feat/use-rollup-file-url-for-assets-in-js
branch
from
July 31, 2026 08:43
0cf8fd6 to
b0c338e
Compare
sapphi-red
marked this pull request as ready for review
July 31, 2026 09:46
This was referenced Jul 31, 2026
bluwy
previously approved these changes
Aug 3, 2026
This was referenced Aug 4, 2026
Base automatically changed from
refactor/exclude-postfix-from-vite-asset
to
main
August 21, 2026 10:11
sapphi-red
force-pushed
the
feat/use-rollup-file-url-for-assets-in-js
branch
from
August 21, 2026 10:11
b0c338e to
28d9165
Compare
Closed
7 tasks
This was referenced Sep 2, 2026
dai-shi
added a commit
to wakujs/waku
that referenced
this pull request
Sep 4, 2026
Resolve server assets relative to the emitted chunk with newer Vite
versions.
Keep browser asset URLs handled by Vite.
Resolve server assets relative to the emitted chunk with newer Vite
versions.
Keep browser asset URLs handled by Vite.
## Background
`e2e/fixtures/rsc-asset` covers asset references originating inside an
RSC, in
two directions that have to resolve differently within the same `rsc`
environment:
- `new URL('./test-server.txt', import.meta.url)` + `readFileSync` needs
a URL
the Node process can open on disk, relative to the emitted chunk.
- `./test-client.txt?no-inline` rendered as an `<a href>` needs a public
URL the
browser can fetch (`/assets/...`).
Vite doesn't handle `new URL(..., import.meta.url)` for SSR, so the
fixture ships
its own plugin that rewrites the call into `this.emitFile()` +
`new URL(import.meta.ROLLUP_FILE_URL_<id>)`. That relied on Rollup's
default
`resolveFileUrl`, which produces `new URL('./x', import.meta.url).href`.
vitejs/vite#22888 ("use `import.meta.ROLLDOWN_FILE_URL_*` for assets in
JS")
added a `resolveFileUrl` hook to `vite:asset`. It was written for Vite's
own
emitters, but `resolveFileUrl` is a global Rollup hook, so it also
intercepts
references emitted by user plugins. Those have no `asFileUrl` metadata
attached,
so they fall through to `toOutputFilePathInJS`, which for a
server-consumer
environment always returns a base-joined path.
The fixture's server chunk therefore built as:
```js
const testServerTxtUrl = new URL("/assets/test-server-BTC3QXxI.txt");
```
`new URL()` on a root-relative path with no base throws, so the RSC
render failed
with `TypeError: Invalid URL`, `data-testid="server-file"` never
rendered, and
`[chromium-prd] rsc-asset › basic` timed out. The client `?no-inline`
half was
unaffected. Failing job: <CI job URL>
## This change
The plugin implements its own `resolveFileUrl`, scoped to the reference
IDs it
emitted, and returns `null` for everything else so Vite continues to
handle
browser asset URLs. `enforce: 'pre'` is required because
`resolveFileUrl` is a
*first* hook and `vite:asset` is registered ahead of normal user
plugins, so
without it the hook is never consulted.
Whether Vite intends to intercept third-party file references is a
question for
upstream; this fixture works either way, since its hook returns first.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of the "Use of
import.meta.ROLLUP_FILE_URL_referenceId" in #22709 (comment)This change allows Rolldown plugins using
import.meta.ROLLDOWN_FILE_URL_*to work well with thebaseoption andrenderBuiltUrloption. But this does not convert URL of those assets to data URL. For that #22709 (comment) is needed.This PR migrates the asset plugin to use that approach.