diff --git a/packages/browser/src/node/plugin.ts b/packages/browser/src/node/plugin.ts index 3f5986224..b6fdd547d 100644 --- a/packages/browser/src/node/plugin.ts +++ b/packages/browser/src/node/plugin.ts @@ -344,7 +344,10 @@ export default (parentServer: ParentBrowserProject, base = '/'): Plugin[] => { BrowserContext(parentServer), dynamicImportPlugin({ globalThisAccessor: '"__vitest_browser_runner__"', - filter(id) { + filter(id, environment) { + if (environment.name !== 'client') { + return false + } if (id.includes(distRoot)) { return false } diff --git a/packages/mocker/src/node/dynamicImportPlugin.ts b/packages/mocker/src/node/dynamicImportPlugin.ts index dd236ec7b..bf087f08d 100644 --- a/packages/mocker/src/node/dynamicImportPlugin.ts +++ b/packages/mocker/src/node/dynamicImportPlugin.ts @@ -1,5 +1,5 @@ import type { SourceMap } from 'magic-string' -import type { Plugin, Rollup } from 'vite' +import type { Environment, Plugin, Rollup } from 'vite' import type { Expression, Positioned } from './esmWalker' import MagicString from 'magic-string' import { esmWalker } from './esmWalker' @@ -11,7 +11,7 @@ export interface DynamicImportPluginOptions { * @default `"__vitest_mocker__"` */ globalThisAccessor?: string - filter?: (id: string) => boolean + filter?: (id: string, environment: Environment) => boolean } export function dynamicImportPlugin(options: DynamicImportPluginOptions = {}): Plugin { @@ -23,7 +23,7 @@ export function dynamicImportPlugin(options: DynamicImportPluginOptions = {}): P if (!regexDynamicImport.test(source)) { return } - if (options.filter && !options.filter(id)) { + if (options.filter && !options.filter(id, this.environment)) { return } return injectDynamicImport(source, id, this.parse, options) diff --git a/test/browser/test/server/entry.ts b/test/browser/test/server/entry.ts new file mode 100644 index 000000000..4385e3314 --- /dev/null +++ b/test/browser/test/server/entry.ts @@ -0,0 +1,7 @@ +export default async (url: URL) => { + if (url.pathname === '/api/ssr-dep') { + const lib = await import('./ssr-dep') + return lib.default + } + return 'not-found' +} diff --git a/test/browser/test/server/ssr-dep.ts b/test/browser/test/server/ssr-dep.ts new file mode 100644 index 000000000..dea335a6c --- /dev/null +++ b/test/browser/test/server/ssr-dep.ts @@ -0,0 +1 @@ +export default 'ssr-dep' diff --git a/test/browser/test/ssr.test.ts b/test/browser/test/ssr.test.ts new file mode 100644 index 000000000..f6959394b --- /dev/null +++ b/test/browser/test/ssr.test.ts @@ -0,0 +1,7 @@ +import { expect, test } from 'vitest' + +test('ssr dynamic import', async () => { + const res = await fetch('/api/ssr-dep') + const text = await res.json() + expect(text).toBe('ssr-dep') +}) diff --git a/test/browser/vitest.config.mts b/test/browser/vitest.config.mts index 7c21962bd..161a61432 100644 --- a/test/browser/vitest.config.mts +++ b/test/browser/vitest.config.mts @@ -106,5 +106,26 @@ export default defineConfig({ await server.ssrLoadModule('/package.json') }, }, + { + name: 'my-ssr', + configureServer(server) { + server.middlewares.use(async (req, res, next) => { + const url = new URL(req.url || '', 'http://localhost') + if (url.pathname.startsWith('/api/')) { + try { + const mod = await server.ssrLoadModule('./test/server/entry.ts') + const result = await mod.default(url) + res.end(JSON.stringify(result)) + return + } + catch (e) { + next(e) + return + } + } + next() + }) + }, + }, ], })