Skip to content

Commit 2e0630b

Browse files
authored
perf: use experimental meta.resolve flag instead of a custom loader (#8567)
1 parent 72a000e commit 2e0630b

File tree

7 files changed

+137
-466
lines changed

7 files changed

+137
-466
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
"typescript": "^5.9.2",
6565
"unplugin-isolated-decl": "^0.15.1",
6666
"unplugin-oxc": "^0.5.1",
67-
"vite": "^6.3.5",
67+
"vite": "^7.1.5",
6868
"vitest": "workspace:*",
6969
"zx": "^8.8.1"
7070
},

packages/vitest/src/node/pool.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@ import type { TestProject } from './project'
44
import type { TestSpecification } from './spec'
55
import type { BuiltinPool, Pool } from './types/pool-options'
66
import { isatty } from 'node:tty'
7+
import { resolve } from 'pathe'
78
import { version as viteVersion } from 'vite'
9+
import { rootDir } from '../paths'
810
import { isWindows } from '../utils/env'
911
import { createForksPool } from './pools/forks'
1012
import { createThreadsPool } from './pools/threads'
1113
import { createTypecheckPool } from './pools/typecheck'
1214
import { createVmForksPool } from './pools/vmForks'
1315
import { createVmThreadsPool } from './pools/vmThreads'
1416

17+
const suppressWarningsPath = resolve(rootDir, './suppress-warnings.cjs')
18+
1519
export type RunWithFiles = (
1620
files: TestSpecification[],
1721
invalidates?: string[]
@@ -100,7 +104,13 @@ export function createPool(ctx: Vitest): ProcessPool {
100104

101105
async function executeTests(method: 'runTests' | 'collectTests', files: TestSpecification[], invalidate?: string[]) {
102106
const options: PoolProcessOptions = {
103-
execArgv: [...execArgv, ...conditions],
107+
execArgv: [
108+
...execArgv,
109+
...conditions,
110+
'--experimental-import-meta-resolve',
111+
'--require',
112+
suppressWarningsPath,
113+
],
104114
env: {
105115
TEST: 'true',
106116
VITEST: 'true',

packages/vitest/src/node/pools/vmForks.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,11 @@ import { resolve } from 'node:path'
1313
import v8 from 'node:v8'
1414
import { createBirpc } from 'birpc'
1515
import Tinypool from 'tinypool'
16-
import { rootDir } from '../../paths'
1716
import { wrapSerializableConfig } from '../../utils/config-helpers'
1817
import { getWorkerMemoryLimit, stringToBytes } from '../../utils/memory-limit'
1918
import { groupFilesByEnv } from '../../utils/test-helpers'
2019
import { createMethodsRPC } from './rpc'
2120

22-
const suppressWarningsPath = resolve(rootDir, './suppress-warnings.cjs')
23-
2421
function createChildProcessChannel(project: TestProject, collect: boolean) {
2522
const emitter = new EventEmitter()
2623

@@ -106,10 +103,7 @@ export function createVmForksPool(
106103

107104
env,
108105
execArgv: [
109-
'--experimental-import-meta-resolve',
110106
'--experimental-vm-modules',
111-
'--require',
112-
suppressWarningsPath,
113107
...(poolOptions.execArgv ?? []),
114108
...execArgv,
115109
],

packages/vitest/src/node/pools/vmThreads.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,10 @@ import { resolve } from 'node:path'
1313
import { MessageChannel } from 'node:worker_threads'
1414
import { createBirpc } from 'birpc'
1515
import Tinypool from 'tinypool'
16-
import { rootDir } from '../../paths'
1716
import { getWorkerMemoryLimit, stringToBytes } from '../../utils/memory-limit'
1817
import { groupFilesByEnv } from '../../utils/test-helpers'
1918
import { createMethodsRPC } from './rpc'
2019

21-
const suppressWarningsPath = resolve(rootDir, './suppress-warnings.cjs')
22-
2320
function createWorkerChannel(project: TestProject, collect: boolean) {
2421
const channel = new MessageChannel()
2522
const port = channel.port2
@@ -85,10 +82,7 @@ export function createVmThreadsPool(
8582

8683
env,
8784
execArgv: [
88-
'--experimental-import-meta-resolve',
8985
'--experimental-vm-modules',
90-
'--require',
91-
suppressWarningsPath,
9286
...(poolOptions.execArgv ?? []),
9387
...execArgv,
9488
],

packages/vitest/src/runtime/moduleRunner/moduleRunner.ts

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,35 @@ import * as viteModuleRunner from 'vite/module-runner'
1010
import { VitestMocker } from './moduleMocker'
1111
import { VitestTransport } from './moduleTransport'
1212

13-
// eslint-disable-next-line ts/ban-ts-comment
14-
// @ts-ignore available since Vite 7.1 https://github.com/vitejs/vite/pull/20260
1513
export type CreateImportMeta = NonNullable<viteModuleRunner.ModuleRunnerOptions['createImportMeta']>
16-
// eslint-disable-next-line ts/ban-ts-comment
17-
// @ts-ignore
18-
export const createNodeImportMeta: CreateImportMeta = viteModuleRunner.createNodeImportMeta
14+
export const createNodeImportMeta: CreateImportMeta = (modulePath: string) => {
15+
if (!viteModuleRunner.createDefaultImportMeta) {
16+
throw new Error(`createNodeImportMeta is not supported in this version of Vite.`)
17+
}
18+
19+
const defaultMeta = viteModuleRunner.createDefaultImportMeta(modulePath)
20+
const href = defaultMeta.url
21+
22+
const importMetaResolver = createImportMetaResolver()
23+
24+
return {
25+
...defaultMeta,
26+
main: false,
27+
resolve(id: string, parent?: string) {
28+
const resolver = importMetaResolver ?? defaultMeta.resolve
29+
return resolver(id, parent ?? href)
30+
},
31+
}
32+
}
33+
34+
function createImportMetaResolver() {
35+
if (!import.meta.resolve) {
36+
return
37+
}
38+
39+
return (specifier: string, importer: string) =>
40+
import.meta.resolve(specifier, importer)
41+
}
1942

2043
// @ts-expect-error overriding private method
2144
export class VitestModuleRunner extends viteModuleRunner.ModuleRunner {
@@ -32,8 +55,6 @@ export class VitestModuleRunner extends viteModuleRunner.ModuleRunner {
3255
hmr: false,
3356
evaluatedModules,
3457
sourcemapInterceptor: 'prepareStackTrace',
35-
// eslint-disable-next-line ts/ban-ts-comment
36-
// @ts-ignore
3758
createImportMeta: vitestOptions.createImportMeta,
3859
},
3960
options.evaluator,
@@ -68,10 +89,7 @@ export class VitestModuleRunner extends viteModuleRunner.ModuleRunner {
6889

6990
public async import(rawId: string): Promise<any> {
7091
const resolved = await this.vitestOptions.transport.resolveId(rawId)
71-
if (!resolved) {
72-
return super.import(rawId)
73-
}
74-
return super.import(resolved.url)
92+
return super.import(resolved ? resolved.url : rawId)
7593
}
7694

7795
public async fetchModule(url: string, importer?: string): Promise<EvaluatedModuleNode> {

packages/vitest/src/runtime/moduleRunner/startModuleRunner.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,6 @@ export function startVitestModuleRunner(options: ContextModuleRunnerOptions): Vi
166166
createImportMeta: options.createImportMeta,
167167
})
168168

169-
// await moduleRunner.import('/@vite/env')
170-
// await moduleRunner.mocker.initializeSpyModule()
171-
172169
return moduleRunner
173170
}
174171

0 commit comments

Comments
 (0)