Skip to content

Commit f0b4cff

Browse files
authored
fix(rsc): improve auto css heuristics (#643)
1 parent b8a23e4 commit f0b4cff

File tree

9 files changed

+58
-3
lines changed

9 files changed

+58
-3
lines changed

packages/plugin-rsc/e2e/basic.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,11 +322,19 @@ function defineTest(f: Fixture) {
322322
await page.goto(f.url())
323323
await waitForHydration(page)
324324
await testCss(page)
325+
await expect(page.locator('.test-dep-css-in-server')).toHaveCSS(
326+
'color',
327+
'rgb(255, 165, 0)',
328+
)
325329
})
326330

327331
testNoJs('css @nojs', async ({ page }) => {
328332
await page.goto(f.url())
329333
await testCss(page)
334+
await expect(page.locator('.test-dep-css-in-server')).toHaveCSS(
335+
'color',
336+
'rgb(255, 165, 0)',
337+
)
330338
})
331339

332340
async function testCss(page: Page, color = 'rgb(255, 165, 0)') {

packages/plugin-rsc/examples/basic/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"@vitejs/test-dep-client-in-server2": "file:./test-dep/client-in-server2",
2727
"@vitejs/test-dep-server-in-client": "file:./test-dep/server-in-client",
2828
"@vitejs/test-dep-server-in-server": "file:./test-dep/server-in-server",
29+
"@vitejs/test-dep-css-in-server": "file:./test-dep/css-in-server",
2930
"rsc-html-stream": "^0.0.7",
3031
"tailwindcss": "^4.1.11",
3132
"vite": "^7.0.5",

packages/plugin-rsc/examples/basic/src/routes/root.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { TestUseCache } from './use-cache/server'
3030
import { TestHydrationMismatch } from './hydration-mismatch/server'
3131
import { TestBrowserOnly } from './browser-only/client'
3232
import { TestTransitiveCjsClient } from './deps/transitive-cjs/client'
33+
import TestDepCssInServer from '@vitejs/test-dep-css-in-server/server'
3334

3435
export function Root(props: { url: URL }) {
3536
return (
@@ -51,6 +52,7 @@ export function Root(props: { url: URL }) {
5152
<TestCssClientNoSsr url={props.url} />
5253
<TestTailwindClient />
5354
<TestTailwindServer />
55+
<TestDepCssInServer />
5456
<TestHydrationMismatch url={props.url} />
5557
<TestHmrClientDep />
5658
<TestTemporaryReference />
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"name": "@vitejs/test-dep-css-in-server",
3+
"private": true,
4+
"type": "module",
5+
"exports": {
6+
"./server": "./server.js"
7+
},
8+
"peerDependencies": {
9+
"react": "*"
10+
}
11+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.test-dep-css-in-server {
2+
color: rgb(255, 165, 0);
3+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default function TestDepCssInServer(): import('react').ReactNode
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import React from 'react'
2+
import './server.css'
3+
4+
const h = React.createElement
5+
6+
export default function TestDepCssInServer() {
7+
return h(
8+
'div',
9+
{ className: 'test-dep-css-in-server' },
10+
`test-dep-css-in-server`,
11+
)
12+
}

packages/plugin-rsc/src/plugin.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,7 +1646,7 @@ export function vitePluginRscCss(
16461646
id: string
16471647
code: string
16481648
}): false | TransformWrapExportFilter {
1649-
const { query } = parseIdQuery(id)
1649+
const { filename, query } = parseIdQuery(id)
16501650
if ('vite-rsc-css-export' in query) {
16511651
const value = query['vite-rsc-css-export']
16521652
if (value) {
@@ -1658,8 +1658,13 @@ export function vitePluginRscCss(
16581658

16591659
const options = rscCssOptions?.rscCssTransform
16601660
if (options === false) return false
1661-
if (options?.filter && !options.filter(id)) return false
1662-
if (id.includes('/node_modules/') || !/\.[tj]sx$/.test(id)) return false
1661+
if (options?.filter && !options.filter(filename)) return false
1662+
// https://github.com/vitejs/vite/blob/7979f9da555aa16bd221b32ea78ce8cb5292fac4/packages/vite/src/node/constants.ts#L95
1663+
if (
1664+
!/\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)\b/.test(code) ||
1665+
!/\.[tj]sx?$/.test(filename)
1666+
)
1667+
return false
16631668

16641669
// skip transform if no css imports
16651670
const result = esModuleLexer.parse(code)

pnpm-lock.yaml

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)