diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index b504c1c697c8c5..ff158a4a34e6f0 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -331,6 +331,15 @@ export function cssPlugin(config: ResolvedConfig): Plugin { ) }, + configureServer() { + // Initialize module cache for dev mode in case buildStart is not called + // (e.g. when using createServerModuleRunner) + if (!cssModulesCache.has(config)) { + moduleCache = new Map>() + cssModulesCache.set(config, moduleCache) + } + }, + buildEnd() { preprocessorWorkerController?.close() }, @@ -552,7 +561,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin { } const inlined = inlineRE.test(id) - const modules = cssModulesCache.get(config)!.get(id) + const modules = cssModulesCache.get(config)?.get(id) // #6984, #7552 // `foo.module.css` => modulesCode diff --git a/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts b/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts index 5114dab3b593bc..ef146a76caae2d 100644 --- a/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts +++ b/packages/vite/src/node/ssr/runtime/__tests__/server-runtime.spec.ts @@ -1,9 +1,11 @@ import { existsSync, readdirSync } from 'node:fs' import { posix, win32 } from 'node:path' import { fileURLToPath } from 'node:url' -import { describe, expect, vi } from 'vitest' +import { describe, expect, it, vi } from 'vitest' import { isWindows } from '../../../../shared/utils' import type { ExternalFetchResult } from '../../../../shared/invokeMethods' +import { createServer } from '../../../server' +import { createServerModuleRunner } from '../serverModuleRunner' import { createModuleRunnerTester } from './utils' const _URL = URL @@ -537,3 +539,39 @@ describe('invalid package', async () => { `) }) }) + +describe('css without middlewareMode', () => { + it('css is loaded correctly without middlewareMode', async () => { + const server = await createServer({ + root: import.meta.dirname, + logLevel: 'error', + server: { + watch: null, + ws: false, + }, + optimizeDeps: { + disabled: true, + noDiscovery: true, + include: [], + }, + }) + const runner = createServerModuleRunner(server.environments.ssr, { + hmr: { logger: false }, + sourcemapInterceptor: false, + }) + try { + const css = await runner.import('/fixtures/test.css') + expect(css.default).toBe(undefined) + const module = await runner.import('/fixtures/test.module.css') + expect(module).toMatchObject({ + default: { + test: expect.stringMatching(/^_test_/), + }, + test: expect.stringMatching(/^_test_/), + }) + } finally { + await runner.close() + await server.close() + } + }) +})