fix(build): Prevent duplicate CSS for hydrated client components#14142
fix(build): Prevent duplicate CSS for hydrated client components#14142matthewp merged 13 commits intowithastro:mainfrom
Conversation
🦋 Changeset detectedLatest commit: 60f55de The changes in this PR will be included in the next version bump. 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 |
CodSpeed Performance ReportMerging #14142 will not alter performanceComparing Summary
Footnotes |
3c07ab2 to
49acd37
Compare
|
@P4tt4te thank you for the contribution, and sorry for the late answer. It would be great if we could add a new test. |
|
Hi @ematipico, no problem about the delay. I'll create a test and update the branch in a few days. |
Hi @ematipico, |
6a9f707 to
81fbc81
Compare
|
@ematipico @matthewp is this something we can see merged eventually? 🙏 :) |
|
We have not forgotten about it FYI, sorry if we're being slow! We have reduced capacity ATM and in Amsterdam for ViteConf |
matthewp
left a comment
There was a problem hiding this comment.
Love the comments added to explain how it works!
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [astro](https://astro.build) ([source](https://github.com/withastro/astro/tree/HEAD/packages/astro)) | [`5.14.6` -> `5.14.8`](https://renovatebot.com/diffs/npm/astro/5.14.6/5.14.8) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | | [googleapis](https://github.com/googleapis/google-api-nodejs-client) | [`164.0.0` -> `164.1.0`](https://renovatebot.com/diffs/npm/googleapis/164.0.0/164.1.0) | [](https://docs.renovatebot.com/merge-confidence/) | [](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>withastro/astro (astro)</summary> ### [`v5.14.8`](https://github.com/withastro/astro/blob/HEAD/packages/astro/CHANGELOG.md#5148) [Compare Source](https://github.com/withastro/astro/compare/[email protected]@5.14.8) ##### Patch Changes - [#​14590](withastro/astro#14590) [`577d051`](withastro/astro@577d051) Thanks [@​matthewp](https://github.com/matthewp)! - Fixes image path resolution in content layer collections to support bare filenames. The `image()` helper now normalizes bare filenames like `"cover.jpg"` to relative paths `"./cover.jpg"` for consistent resolution behavior between markdown frontmatter and JSON content collections. ### [`v5.14.7`](https://github.com/withastro/astro/blob/HEAD/packages/astro/CHANGELOG.md#5147) [Compare Source](https://github.com/withastro/astro/compare/[email protected]@5.14.7) ##### Patch Changes - [#​14582](withastro/astro#14582) [`7958c6b`](withastro/astro@7958c6b) Thanks [@​florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes a regression that caused Actions to throw errors while loading - [#​14567](withastro/astro#14567) [`94500bb`](withastro/astro@94500bb) Thanks [@​matthewp](https://github.com/matthewp)! - Fixes the actions endpoint to return 404 for non-existent actions instead of throwing an unhandled error - [#​14566](withastro/astro#14566) [`946fe68`](withastro/astro@946fe68) Thanks [@​matthewp](https://github.com/matthewp)! - Fixes handling malformed cookies gracefully by returning the unparsed value instead of throwing When a cookie with an invalid value is present (e.g., containing invalid URI sequences), `Astro.cookies.get()` now returns the raw cookie value instead of throwing a URIError. This aligns with the behavior of the underlying `cookie` package and prevents crashes when manually-set or corrupted cookies are encountered. - [#​14142](withastro/astro#14142) [`73c5de9`](withastro/astro@73c5de9) Thanks [@​P4tt4te](https://github.com/P4tt4te)! - Updates handling of CSS for hydrated client components to prevent duplicates - [#​14576](withastro/astro#14576) [`2af62c6`](withastro/astro@2af62c6) Thanks [@​aprici7y](https://github.com/aprici7y)! - Fixes a regression that caused `Astro.site` to always be `undefined` in `getStaticPaths()` </details> <details> <summary>googleapis/google-api-nodejs-client (googleapis)</summary> ### [`v164.1.0`](https://github.com/googleapis/google-api-nodejs-client/blob/HEAD/CHANGELOG.md#16410-2025-10-20) [Compare Source](googleapis/google-api-nodejs-client@googleapis-v164.0.0...googleapis-v164.1.0) ##### Features - run the generator ([#​3820](googleapis/google-api-nodejs-client#3820)) ([fd02f58](googleapis/google-api-nodejs-client@fd02f58)) </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS45OS4xMSIsInVwZGF0ZWRJblZlciI6IjQxLjk5LjExIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://code.richardbanks.dev/richard/astro-loader-youtube/pulls/22 Co-authored-by: Renovate Bot <[email protected]> Co-committed-by: Renovate Bot <[email protected]>
Changes
Fix #12303
The root cause was a divergence between the server and client builds:
Server Build: Correctly processes all stylesheets needed for a page, including those from components, and links them in the final HTML.
Client Build: When processing a hydrated component as a separate entry point, it incorrectly generates a redundant, standalone CSS file for that component's styles.
Fix:
Testing
I created a new fixture named "css-deduplication", which is basically the framework-react template.
Three tests were added for this fixture:
For the
inlineStylesheets: 'never'case, we check that the main CSS file does not already contain the styles from any other .css files present in the build folder.For the
inlineStylesheets: 'always'case:Docs
I have added detailed comments to the code to explain the new logic for future maintainers.
I believe this is enough since it's an internal fix, but I'm happy to add formal documentation if you think it's needed!