From e2e0a6b007f610ae756e96fcfd0ce369ba5b672d Mon Sep 17 00:00:00 2001 From: JIHOON LEE Date: Mon, 13 Oct 2025 11:01:28 +0900 Subject: [PATCH 01/11] feat: add client-side builtin module check in module runner --- packages/vite/src/module-runner/runner.ts | 29 ++- packages/vite/src/module-runner/types.ts | 4 + packages/vite/src/module-runner/utils.ts | 16 ++ .../node/ssr/runtime/serverModuleRunner.ts | 1 + pnpm-lock.yaml | 196 +++++++++++++++++- 5 files changed, 235 insertions(+), 11 deletions(-) diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index 6230d33f16ab5a..38f2fea1b92de5 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -15,7 +15,12 @@ import type { ResolvedResult, SSRImportMetadata, } from './types' -import { posixDirname, posixPathToFileHref, posixResolve } from './utils' +import { + createIsBuiltin, + posixDirname, + posixPathToFileHref, + posixResolve, +} from './utils' import { ssrDynamicImportKey, ssrExportAllKey, @@ -44,6 +49,7 @@ export class ModuleRunner { string, Promise >() + private readonly isBuiltin?: (id: string) => boolean private closed = false @@ -54,6 +60,9 @@ export class ModuleRunner { ) { this.evaluatedModules = options.evaluatedModules ?? new EvaluatedModules() this.transport = normalizeModuleRunnerTransport(options.transport) + if (options.builtins) { + this.isBuiltin = createIsBuiltin(options.builtins) + } if (options.hmr !== false) { const optionsHmr = options.hmr ?? true const resolvedHmrLogger: HMRLogger = @@ -255,14 +264,16 @@ export class ModuleRunner { ( url.startsWith('data:') ? { externalize: url, type: 'builtin' } - : await this.transport.invoke('fetchModule', [ - url, - importer, - { - cached: isCached, - startOffset: this.evaluator.startOffset, - }, - ]) + : this.isBuiltin?.(url) + ? { externalize: url, type: 'builtin' } + : await this.transport.invoke('fetchModule', [ + url, + importer, + { + cached: isCached, + startOffset: this.evaluator.startOffset, + }, + ]) ) as ResolvedResult if ('cache' in fetchedModule) { diff --git a/packages/vite/src/module-runner/types.ts b/packages/vite/src/module-runner/types.ts index f4ff25b47aab74..b49e47ad8a1e4b 100644 --- a/packages/vite/src/module-runner/types.ts +++ b/packages/vite/src/module-runner/types.ts @@ -117,6 +117,10 @@ export interface ModuleRunnerOptions { * Custom module cache. If not provided, creates a separate module cache for each ModuleRunner instance. */ evaluatedModules?: EvaluatedModules + /** + * List of builtin modules to check on the client side. + */ + builtins?: (string | RegExp)[] } export interface ImportMetaEnv { diff --git a/packages/vite/src/module-runner/utils.ts b/packages/vite/src/module-runner/utils.ts index d5829e1b43272b..bb37a34e844ac1 100644 --- a/packages/vite/src/module-runner/utils.ts +++ b/packages/vite/src/module-runner/utils.ts @@ -63,3 +63,19 @@ export function posixPathToFileHref(posixPath: string): string { export function toWindowsPath(path: string): string { return path.replace(/\//g, '\\') } + +export function createIsBuiltin( + builtins: (string | RegExp)[], +): (id: string) => boolean { + const plainBuiltinsSet = new Set( + builtins.filter( + (builtin): builtin is string => typeof builtin === 'string', + ), + ) + const regexBuiltins = builtins.filter( + (builtin): builtin is RegExp => builtin instanceof RegExp, + ) + + return (id: string) => + plainBuiltinsSet.has(id) || regexBuiltins.some((regexp) => regexp.test(id)) +} diff --git a/packages/vite/src/node/ssr/runtime/serverModuleRunner.ts b/packages/vite/src/node/ssr/runtime/serverModuleRunner.ts index 828ea96ad58a82..0d31101b788c9b 100644 --- a/packages/vite/src/node/ssr/runtime/serverModuleRunner.ts +++ b/packages/vite/src/node/ssr/runtime/serverModuleRunner.ts @@ -130,6 +130,7 @@ export function createServerModuleRunner( channel: environment.hot as NormalizedServerHotChannel, }), hmr, + builtins: environment.config.resolve.builtins, createImportMeta: createNodeImportMeta, sourcemapInterceptor: resolveSourceMapOptions(options), }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8d778c7a39037..671976673b5e89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2762,6 +2762,9 @@ packages: '@napi-rs/wasm-runtime@1.0.5': resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + '@node-rs/bcrypt-android-arm-eabi@1.10.7': resolution: {integrity: sha512-8dO6/PcbeMZXS3VXGEtct9pDYdShp2WBOWlDvSbcRwVqyB580aCBh0BEFmKYtXLzLvUK8Wf+CG3U6sCdILW1lA==} engines: {node: '>= 10'} @@ -2867,6 +2870,9 @@ packages: '@oxc-project/types@0.93.0': resolution: {integrity: sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==} + '@oxc-project/types@0.94.0': + resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -2982,89 +2988,175 @@ packages: cpu: [arm64] os: [android] + '@rolldown/binding-android-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-W5ZKF3TP3bOWuBfotAGp+UGjxOkGV7jRmIRbBA7NFjggx7Oi6vOmGDqpHEIX7kDCiry1cnIsWQaxNvWbMdkvzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': resolution: {integrity: sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-abw/wtgJA8OCgaTlL+xJxnN/Z01BwV1rfzIp5Hh9x+IIO6xOBfPsQ0nzi0+rWx3TyZ9FZXyC7bbC+5NpQ9EaXQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.41': resolution: {integrity: sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] + '@rolldown/binding-darwin-x64@1.0.0-beta.42': + resolution: {integrity: sha512-Y/UrZIRVr8CvXVEB88t6PeC46r1K9/QdPEo2ASE/b/KBEyXIx+QbM6kv9QfQVWU2Atly2+SVsQzxQsIvuk3lZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': resolution: {integrity: sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': + resolution: {integrity: sha512-zRM0oOk7BZiy6DoWBvdV4hyEg+j6+WcBZIMHVirMEZRu8hd18kZdJkg+bjVMfCEhwpWeFUfBfZ1qcaZ5UdYzlQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': resolution: {integrity: sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': + resolution: {integrity: sha512-6RjFaC52QNwo7ilU8C5H7swbGlgfTkG9pudXwzr3VYyT18s0C9gLg3mvc7OMPIGqNxnQ0M5lU8j6aQCk2DTRVg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': resolution: {integrity: sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': + resolution: {integrity: sha512-LMYHM5Sf6ROq+VUwHMDVX2IAuEsWTv4SnlFEedBnMGpvRuQ14lCmD4m5Q8sjyAQCgyha9oghdGoK8AEg1sXZKg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': resolution: {integrity: sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': + resolution: {integrity: sha512-/bNTYb9aKNhzdbPn3O4MK2aLv55AlrkUKPE4KNfBYjkoZUfDr4jWp7gsSlvTc5A/99V1RCm9axvt616ZzeXGyA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': resolution: {integrity: sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': + resolution: {integrity: sha512-n/SLa4h342oyeGykZdch7Y3GNCNliRPL4k5wkeZ/5eQZs+c6/ZG1SHCJQoy7bZcmxiMyaXs9HoFmv1PEKrZgWg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': resolution: {integrity: sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': + resolution: {integrity: sha512-4PSd46sFzqpLHSGdaSViAb1mk55sCUMpJg+X8ittXaVocQsV3QLG/uydSH8RyL0ngHX5fy3D70LcCzlB15AgHw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': resolution: {integrity: sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': + resolution: {integrity: sha512-BmWoeJJyeZXmZBcfoxG6J9+rl2G7eO47qdTkAzEegj4n3aC6CBIHOuDcbE8BvhZaEjQR0nh0nJrtEDlt65Q7Sw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': resolution: {integrity: sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': + resolution: {integrity: sha512-2Ft32F7uiDTrGZUKws6CLNTlvTWHC33l4vpXrzUucf9rYtUThAdPCOt89Pmn13tNX6AulxjGEP2R0nZjTSW3eQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': resolution: {integrity: sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-hC1kShXW/z221eG+WzQMN06KepvPbMBknF0iGR3VMYJLOe9gwnSTfGxFT5hf8XrPv7CEZqTWRd0GQpkSHRbGsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': resolution: {integrity: sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-AICBYromawouGjj+GS33369E8Vwhy6UwhQEhQ5evfS8jPCsyVvoICJatbDGDGH01dwtVGLD5eDFzPicUOVpe4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': resolution: {integrity: sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': + resolution: {integrity: sha512-XpZ0M+tjoEiSc9c+uZR7FCnOI0uxDRNs1elGOMjeB0pUP1QmvVbZGYNsyLbLoP4u7e3VQN8rie1OQ8/mB6rcJg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} '@rolldown/pluginutils@1.0.0-beta.41': resolution: {integrity: sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==} + '@rolldown/pluginutils@1.0.0-beta.42': + resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==} + '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -6570,6 +6662,11 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rolldown@1.0.0-beta.42: + resolution: {integrity: sha512-xaPcckj+BbJhYLsv8gOqezc8EdMcKKe/gk8v47B0KPvgABDrQ0qmNPAiT/gh9n9Foe0bUkEv2qzj42uU5q1WRg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-license@3.6.0: resolution: {integrity: sha512-1ieLxTCaigI5xokIfszVDRoy6c/Wmlot1fDEnea7Q/WXSR8AqOjYljHDLObAx7nFxHC2mbxT3QnTSPhaic2IYw==} engines: {node: '>=14.0.0'} @@ -8682,6 +8779,13 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true + '@node-rs/bcrypt-android-arm-eabi@1.10.7': optional: true @@ -8759,6 +8863,8 @@ snapshots: '@oxc-project/types@0.93.0': {} + '@oxc-project/types@0.94.0': {} + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -8848,51 +8954,97 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.41': optional: true + '@rolldown/binding-android-arm64@1.0.0-beta.42': + optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': optional: true + '@rolldown/binding-darwin-arm64@1.0.0-beta.42': + optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.41': optional: true + '@rolldown/binding-darwin-x64@1.0.0-beta.42': + optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': optional: true + '@rolldown/binding-freebsd-x64@1.0.0-beta.42': + optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': optional: true + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': + optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': optional: true + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': + optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': optional: true + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': + optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': optional: true + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': + optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': optional: true + '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': + optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': optional: true + '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': + optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': dependencies: '@napi-rs/wasm-runtime': 1.0.5 optional: true + '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': optional: true + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': + optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': optional: true + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': + optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': optional: true + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': + optional: true + '@rolldown/pluginutils@1.0.0-beta.29': {} '@rolldown/pluginutils@1.0.0-beta.41': {} + '@rolldown/pluginutils@1.0.0-beta.42': {} + '@rollup/plugin-alias@5.1.1(rollup@4.43.0)': optionalDependencies: rollup: 4.43.0 @@ -12535,6 +12687,25 @@ snapshots: - oxc-resolver - supports-color + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.42)(typescript@5.9.2)(vue-tsc@3.1.0(typescript@5.9.2)): + dependencies: + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + ast-kit: 2.1.2 + birpc: 2.6.1 + debug: 4.4.3 + dts-resolver: 2.1.2 + get-tsconfig: 4.10.1 + magic-string: 0.30.19 + rolldown: 1.0.0-beta.42 + optionalDependencies: + typescript: 5.9.2 + vue-tsc: 3.1.0(typescript@5.9.2) + transitivePeerDependencies: + - oxc-resolver + - supports-color + rolldown@1.0.0-beta.41: dependencies: '@oxc-project/types': 0.93.0 @@ -12556,6 +12727,27 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.41 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.41 + rolldown@1.0.0-beta.42: + dependencies: + '@oxc-project/types': 0.94.0 + '@rolldown/pluginutils': 1.0.0-beta.42 + ansis: 4.2.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.42 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.42 + '@rolldown/binding-darwin-x64': 1.0.0-beta.42 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.42 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.42 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.42 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.42 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.42 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.42 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.42 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.42 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.42 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 + rollup-plugin-license@3.6.0(picomatch@4.0.3)(rollup@4.43.0): dependencies: commenting: 1.1.0 @@ -13179,8 +13371,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.41 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.41)(typescript@5.9.2)(vue-tsc@3.1.0(typescript@5.9.2)) + rolldown: 1.0.0-beta.42 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.42)(typescript@5.9.2)(vue-tsc@3.1.0(typescript@5.9.2)) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 From ff1d8acaa744ebccb8f99d25b9474ce5e8b9d6c8 Mon Sep 17 00:00:00 2001 From: jiji-hoon96 Date: Wed, 15 Oct 2025 23:14:09 +0900 Subject: [PATCH 02/11] feat: lazy load builtins from server instead of requiring upfront configuration --- packages/vite/src/module-runner/runner.ts | 25 +++- packages/vite/src/module-runner/types.ts | 2 + packages/vite/src/node/server/environment.ts | 3 + .../node/ssr/runtime/serverModuleRunner.ts | 1 - packages/vite/src/shared/invokeMethods.ts | 2 + pnpm-lock.yaml | 134 +++++++++--------- 6 files changed, 98 insertions(+), 69 deletions(-) diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index 38f2fea1b92de5..e197156b68194c 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -49,7 +49,8 @@ export class ModuleRunner { string, Promise >() - private readonly isBuiltin?: (id: string) => boolean + private isBuiltin?: (id: string) => boolean + private builtinsPromise?: Promise private closed = false @@ -247,6 +248,26 @@ export class ModuleRunner { return cached } + private async ensureBuiltins(): Promise { + if (this.isBuiltin) return + + if (this.builtinsPromise) return this.builtinsPromise + + this.builtinsPromise = (async () => { + try { + this.debug?.('[module runner] fetching builtins from server') + const builtins = await this.transport.invoke('getBuiltins', []) + this.isBuiltin = createIsBuiltin(builtins) + this.debug?.('[module runner] builtins loaded:', builtins) + } catch (error) { + this.debug?.('[module runner] failed to load builtins:', error) + this.isBuiltin = () => false + } + })() + + return this.builtinsPromise + } + private async getModuleInformation( url: string, importer: string | undefined, @@ -256,6 +277,8 @@ export class ModuleRunner { throw new Error(`Vite module runner has been closed.`) } + await this.ensureBuiltins() + this.debug?.('[module runner] fetching', url) const isCached = !!(typeof cachedModule === 'object' && cachedModule.meta) diff --git a/packages/vite/src/module-runner/types.ts b/packages/vite/src/module-runner/types.ts index b49e47ad8a1e4b..026f831ea34827 100644 --- a/packages/vite/src/module-runner/types.ts +++ b/packages/vite/src/module-runner/types.ts @@ -119,6 +119,8 @@ export interface ModuleRunnerOptions { evaluatedModules?: EvaluatedModules /** * List of builtin modules to check on the client side. + * If not provided, will be automatically fetched from the server via transport.invoke('getBuiltins'). + * This option is primarily for backward compatibility or when you need to override server configuration. */ builtins?: (string | RegExp)[] } diff --git a/packages/vite/src/node/server/environment.ts b/packages/vite/src/node/server/environment.ts index 281cec3b5de1b8..56e1bd7809e73e 100644 --- a/packages/vite/src/node/server/environment.ts +++ b/packages/vite/src/node/server/environment.ts @@ -133,6 +133,9 @@ export class DevEnvironment extends BaseEnvironment { fetchModule: (id, importer, options) => { return this.fetchModule(id, importer, options) }, + getBuiltins: () => { + return Promise.resolve(this.config.resolve.builtins) + }, }) this.hot.on( diff --git a/packages/vite/src/node/ssr/runtime/serverModuleRunner.ts b/packages/vite/src/node/ssr/runtime/serverModuleRunner.ts index 0d31101b788c9b..828ea96ad58a82 100644 --- a/packages/vite/src/node/ssr/runtime/serverModuleRunner.ts +++ b/packages/vite/src/node/ssr/runtime/serverModuleRunner.ts @@ -130,7 +130,6 @@ export function createServerModuleRunner( channel: environment.hot as NormalizedServerHotChannel, }), hmr, - builtins: environment.config.resolve.builtins, createImportMeta: createNodeImportMeta, sourcemapInterceptor: resolveSourceMapOptions(options), }, diff --git a/packages/vite/src/shared/invokeMethods.ts b/packages/vite/src/shared/invokeMethods.ts index 7a6f3f02ef8e04..ffa45b7be6f773 100644 --- a/packages/vite/src/shared/invokeMethods.ts +++ b/packages/vite/src/shared/invokeMethods.ts @@ -82,4 +82,6 @@ export type InvokeMethods = { importer?: string, options?: FetchFunctionOptions, ) => Promise + + getBuiltins: () => Promise<(string | RegExp)[]> } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 671976673b5e89..45ac31161c30e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2988,8 +2988,8 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.0.0-beta.42': - resolution: {integrity: sha512-W5ZKF3TP3bOWuBfotAGp+UGjxOkGV7jRmIRbBA7NFjggx7Oi6vOmGDqpHEIX7kDCiry1cnIsWQaxNvWbMdkvzQ==} + '@rolldown/binding-android-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-TP8bcPOb1s6UmY5syhXrDn9k0XkYcw+XaoylTN4cJxf0JOVS2j682I3aTcpfT51hOFGr2bRwNKN9RZ19XxeQbA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -3000,8 +3000,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-beta.42': - resolution: {integrity: sha512-abw/wtgJA8OCgaTlL+xJxnN/Z01BwV1rfzIp5Hh9x+IIO6xOBfPsQ0nzi0+rWx3TyZ9FZXyC7bbC+5NpQ9EaXQ==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-kuVWnZsE4vEjMF/10SbSUyzucIW2zmdsqFghYMqy+fsjXnRHg0luTU6qWF8IqJf4Cbpm9NEZRnjIEPpAbdiSNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -3012,8 +3012,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.42': - resolution: {integrity: sha512-Y/UrZIRVr8CvXVEB88t6PeC46r1K9/QdPEo2ASE/b/KBEyXIx+QbM6kv9QfQVWU2Atly2+SVsQzxQsIvuk3lZQ==} + '@rolldown/binding-darwin-x64@1.0.0-beta.43': + resolution: {integrity: sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -3024,8 +3024,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-beta.42': - resolution: {integrity: sha512-zRM0oOk7BZiy6DoWBvdV4hyEg+j6+WcBZIMHVirMEZRu8hd18kZdJkg+bjVMfCEhwpWeFUfBfZ1qcaZ5UdYzlQ==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': + resolution: {integrity: sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -3036,8 +3036,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': - resolution: {integrity: sha512-6RjFaC52QNwo7ilU8C5H7swbGlgfTkG9pudXwzr3VYyT18s0C9gLg3mvc7OMPIGqNxnQ0M5lU8j6aQCk2DTRVg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': + resolution: {integrity: sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -3048,8 +3048,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': - resolution: {integrity: sha512-LMYHM5Sf6ROq+VUwHMDVX2IAuEsWTv4SnlFEedBnMGpvRuQ14lCmD4m5Q8sjyAQCgyha9oghdGoK8AEg1sXZKg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': + resolution: {integrity: sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -3060,8 +3060,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': - resolution: {integrity: sha512-/bNTYb9aKNhzdbPn3O4MK2aLv55AlrkUKPE4KNfBYjkoZUfDr4jWp7gsSlvTc5A/99V1RCm9axvt616ZzeXGyA==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': + resolution: {integrity: sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -3072,8 +3072,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': - resolution: {integrity: sha512-n/SLa4h342oyeGykZdch7Y3GNCNliRPL4k5wkeZ/5eQZs+c6/ZG1SHCJQoy7bZcmxiMyaXs9HoFmv1PEKrZgWg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': + resolution: {integrity: sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -3084,8 +3084,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': - resolution: {integrity: sha512-4PSd46sFzqpLHSGdaSViAb1mk55sCUMpJg+X8ittXaVocQsV3QLG/uydSH8RyL0ngHX5fy3D70LcCzlB15AgHw==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': + resolution: {integrity: sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -3096,8 +3096,8 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': - resolution: {integrity: sha512-BmWoeJJyeZXmZBcfoxG6J9+rl2G7eO47qdTkAzEegj4n3aC6CBIHOuDcbE8BvhZaEjQR0nh0nJrtEDlt65Q7Sw==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -3107,8 +3107,8 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': - resolution: {integrity: sha512-2Ft32F7uiDTrGZUKws6CLNTlvTWHC33l4vpXrzUucf9rYtUThAdPCOt89Pmn13tNX6AulxjGEP2R0nZjTSW3eQ==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': + resolution: {integrity: sha512-3M+2DmorXvDuAIGYQ9Z93Oy1G9ETkejLwdXXb1uRTgKN9pMcu7N+KG2zDrJwqyxeeLIFE22AZGtSJm3PJbNu9Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] @@ -3118,8 +3118,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': - resolution: {integrity: sha512-hC1kShXW/z221eG+WzQMN06KepvPbMBknF0iGR3VMYJLOe9gwnSTfGxFT5hf8XrPv7CEZqTWRd0GQpkSHRbGsw==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -3130,8 +3130,8 @@ packages: cpu: [ia32] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': - resolution: {integrity: sha512-AICBYromawouGjj+GS33369E8Vwhy6UwhQEhQ5evfS8jPCsyVvoICJatbDGDGH01dwtVGLD5eDFzPicUOVpe4g==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] @@ -3142,8 +3142,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': - resolution: {integrity: sha512-XpZ0M+tjoEiSc9c+uZR7FCnOI0uxDRNs1elGOMjeB0pUP1QmvVbZGYNsyLbLoP4u7e3VQN8rie1OQ8/mB6rcJg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -3154,8 +3154,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.41': resolution: {integrity: sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==} - '@rolldown/pluginutils@1.0.0-beta.42': - resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==} + '@rolldown/pluginutils@1.0.0-beta.43': + resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -6662,8 +6662,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.0.0-beta.42: - resolution: {integrity: sha512-xaPcckj+BbJhYLsv8gOqezc8EdMcKKe/gk8v47B0KPvgABDrQ0qmNPAiT/gh9n9Foe0bUkEv2qzj42uU5q1WRg==} + rolldown@1.0.0-beta.43: + resolution: {integrity: sha512-6RcqyRx0tY1MlRLnjXPp/849Rl/CPFhzpGGwNPEPjKwqBMqPq/Rbbkxasa8s0x+IkUk46ty4jazb5skZ/Vgdhw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -8954,61 +8954,61 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.41': optional: true - '@rolldown/binding-android-arm64@1.0.0-beta.42': + '@rolldown/binding-android-arm64@1.0.0-beta.43': optional: true '@rolldown/binding-darwin-arm64@1.0.0-beta.41': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.42': + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.41': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.42': + '@rolldown/binding-darwin-x64@1.0.0-beta.43': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.41': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.42': + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': @@ -9016,7 +9016,7 @@ snapshots: '@napi-rs/wasm-runtime': 1.0.5 optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true @@ -9024,26 +9024,26 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': optional: true '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': optional: true '@rolldown/pluginutils@1.0.0-beta.29': {} '@rolldown/pluginutils@1.0.0-beta.41': {} - '@rolldown/pluginutils@1.0.0-beta.42': {} + '@rolldown/pluginutils@1.0.0-beta.43': {} '@rollup/plugin-alias@5.1.1(rollup@4.43.0)': optionalDependencies: @@ -12687,7 +12687,7 @@ snapshots: - oxc-resolver - supports-color - rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.42)(typescript@5.9.2)(vue-tsc@3.1.0(typescript@5.9.2)): + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.43)(typescript@5.9.2)(vue-tsc@3.1.0(typescript@5.9.2)): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -12698,7 +12698,7 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.10.1 magic-string: 0.30.19 - rolldown: 1.0.0-beta.42 + rolldown: 1.0.0-beta.43 optionalDependencies: typescript: 5.9.2 vue-tsc: 3.1.0(typescript@5.9.2) @@ -12727,26 +12727,26 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.41 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.41 - rolldown@1.0.0-beta.42: + rolldown@1.0.0-beta.43: dependencies: '@oxc-project/types': 0.94.0 - '@rolldown/pluginutils': 1.0.0-beta.42 + '@rolldown/pluginutils': 1.0.0-beta.43 ansis: 4.2.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.42 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.42 - '@rolldown/binding-darwin-x64': 1.0.0-beta.42 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.42 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.42 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.42 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.42 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.42 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.42 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.42 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.42 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.42 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 + '@rolldown/binding-android-arm64': 1.0.0-beta.43 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.43 + '@rolldown/binding-darwin-x64': 1.0.0-beta.43 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.43 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.43 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.43 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.43 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.43 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.43 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.43 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.43 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.43 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.43 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.43 rollup-plugin-license@3.6.0(picomatch@4.0.3)(rollup@4.43.0): dependencies: @@ -13371,8 +13371,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.42 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.42)(typescript@5.9.2)(vue-tsc@3.1.0(typescript@5.9.2)) + rolldown: 1.0.0-beta.43 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.43)(typescript@5.9.2)(vue-tsc@3.1.0(typescript@5.9.2)) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 From d29340a5299aed8b14b3d365565038b5acebae7f Mon Sep 17 00:00:00 2001 From: JIHOON LEE Date: Mon, 20 Oct 2025 09:54:55 +0900 Subject: [PATCH 03/11] refactor: remove unused builtins option from ModuleRunner --- packages/vite/src/module-runner/runner.ts | 3 --- packages/vite/src/module-runner/types.ts | 6 ------ 2 files changed, 9 deletions(-) diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index e197156b68194c..6c0352ee4f94c7 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -61,9 +61,6 @@ export class ModuleRunner { ) { this.evaluatedModules = options.evaluatedModules ?? new EvaluatedModules() this.transport = normalizeModuleRunnerTransport(options.transport) - if (options.builtins) { - this.isBuiltin = createIsBuiltin(options.builtins) - } if (options.hmr !== false) { const optionsHmr = options.hmr ?? true const resolvedHmrLogger: HMRLogger = diff --git a/packages/vite/src/module-runner/types.ts b/packages/vite/src/module-runner/types.ts index 026f831ea34827..f4ff25b47aab74 100644 --- a/packages/vite/src/module-runner/types.ts +++ b/packages/vite/src/module-runner/types.ts @@ -117,12 +117,6 @@ export interface ModuleRunnerOptions { * Custom module cache. If not provided, creates a separate module cache for each ModuleRunner instance. */ evaluatedModules?: EvaluatedModules - /** - * List of builtin modules to check on the client side. - * If not provided, will be automatically fetched from the server via transport.invoke('getBuiltins'). - * This option is primarily for backward compatibility or when you need to override server configuration. - */ - builtins?: (string | RegExp)[] } export interface ImportMetaEnv { From 822c4ee506736fb741d0f99c371a3c32db2b8c02 Mon Sep 17 00:00:00 2001 From: JIHOON LEE Date: Mon, 20 Oct 2025 09:59:59 +0900 Subject: [PATCH 04/11] test: add test for resolving builtin modules without server round-trip in SSR --- .../ssr/runtime/__tests__/fixtures/builtin-import.ts | 3 +++ .../__tests__/server-worker-runner.invoke.spec.ts | 9 +++++++++ 2 files changed, 12 insertions(+) create mode 100644 packages/vite/src/node/ssr/runtime/__tests__/fixtures/builtin-import.ts diff --git a/packages/vite/src/node/ssr/runtime/__tests__/fixtures/builtin-import.ts b/packages/vite/src/node/ssr/runtime/__tests__/fixtures/builtin-import.ts new file mode 100644 index 00000000000000..b69715a2a29383 --- /dev/null +++ b/packages/vite/src/node/ssr/runtime/__tests__/fixtures/builtin-import.ts @@ -0,0 +1,3 @@ +import { basename } from 'node:path' + +export default basename('/foo/bar/baz.txt') diff --git a/packages/vite/src/node/ssr/runtime/__tests__/server-worker-runner.invoke.spec.ts b/packages/vite/src/node/ssr/runtime/__tests__/server-worker-runner.invoke.spec.ts index 4d4c3ff7a7cf3c..33a9ed9130f5a1 100644 --- a/packages/vite/src/node/ssr/runtime/__tests__/server-worker-runner.invoke.spec.ts +++ b/packages/vite/src/node/ssr/runtime/__tests__/server-worker-runner.invoke.spec.ts @@ -98,4 +98,13 @@ describe('running module runner inside a worker and using the ModuleRunnerTransp expect(output).not.toHaveProperty('result') expect(output.error).toContain('Error: Unknown invoke error') }) + + it('resolves builtin module without server round-trip', async () => { + handleInvoke = (data: any) => server.environments.ssr.hot.handleInvoke(data) + + const output = await run('./fixtures/builtin-import.ts') + expect(output).toHaveProperty('result') + expect(output.result).toBe('baz.txt') + expect(output.error).toBeUndefined() + }) }) From 5ebe9fd10b3aae6bf4a53815e83ba5a913ddb2e8 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:14:01 +0900 Subject: [PATCH 05/11] chore: fix merge --- pnpm-lock.yaml | 204 +++---------------------------------------------- 1 file changed, 9 insertions(+), 195 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58f8394dbdc1b6..2b843d49d9bd6c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2709,9 +2709,6 @@ packages: '@napi-rs/wasm-runtime@1.0.7': resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@napi-rs/wasm-runtime@1.0.7': - resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@node-rs/bcrypt-android-arm-eabi@1.10.7': resolution: {integrity: sha512-8dO6/PcbeMZXS3VXGEtct9pDYdShp2WBOWlDvSbcRwVqyB580aCBh0BEFmKYtXLzLvUK8Wf+CG3U6sCdILW1lA==} engines: {node: '>= 10'} @@ -2817,9 +2814,6 @@ packages: '@oxc-project/types@0.94.0': resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} - '@oxc-project/types@0.94.0': - resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} - '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -2935,160 +2929,77 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.0.0-beta.43': - resolution: {integrity: sha512-TP8bcPOb1s6UmY5syhXrDn9k0XkYcw+XaoylTN4cJxf0JOVS2j682I3aTcpfT51hOFGr2bRwNKN9RZ19XxeQbA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-darwin-arm64@1.0.0-beta.41': - resolution: {integrity: sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-beta.43': resolution: {integrity: sha512-kuVWnZsE4vEjMF/10SbSUyzucIW2zmdsqFghYMqy+fsjXnRHg0luTU6qWF8IqJf4Cbpm9NEZRnjIEPpAbdiSNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.41': - resolution: {integrity: sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.43': resolution: {integrity: sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.41': - resolution: {integrity: sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-beta.43': resolution: {integrity: sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': - resolution: {integrity: sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': resolution: {integrity: sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': - resolution: {integrity: sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': resolution: {integrity: sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': - resolution: {integrity: sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': resolution: {integrity: sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': - resolution: {integrity: sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': resolution: {integrity: sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': - resolution: {integrity: sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': resolution: {integrity: sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': - resolution: {integrity: sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': resolution: {integrity: sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': - resolution: {integrity: sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': resolution: {integrity: sha512-3M+2DmorXvDuAIGYQ9Z93Oy1G9ETkejLwdXXb1uRTgKN9pMcu7N+KG2zDrJwqyxeeLIFE22AZGtSJm3PJbNu9Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': - resolution: {integrity: sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': resolution: {integrity: sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': - resolution: {integrity: sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ia32] - os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': resolution: {integrity: sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': - resolution: {integrity: sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': resolution: {integrity: sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3101,9 +3012,6 @@ packages: '@rolldown/pluginutils@1.0.0-beta.43': resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} - '@rolldown/pluginutils@1.0.0-beta.43': - resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} - '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} engines: {node: '>=14.0.0'} @@ -4310,6 +4218,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + baseline-browser-mapping@2.8.16: + resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} + hasBin: true + baseline-browser-mapping@2.8.18: resolution: {integrity: sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==} hasBin: true @@ -6505,11 +6417,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.0.0-beta.43: - resolution: {integrity: sha512-6RcqyRx0tY1MlRLnjXPp/849Rl/CPFhzpGGwNPEPjKwqBMqPq/Rbbkxasa8s0x+IkUk46ty4jazb5skZ/Vgdhw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - rollup-plugin-license@3.6.0: resolution: {integrity: sha512-1ieLxTCaigI5xokIfszVDRoy6c/Wmlot1fDEnea7Q/WXSR8AqOjYljHDLObAx7nFxHC2mbxT3QnTSPhaic2IYw==} engines: {node: '>=14.0.0'} @@ -8521,13 +8428,6 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.0.7': - dependencies: - '@emnapi/core': 1.5.0 - '@emnapi/runtime': 1.5.0 - '@tybys/wasm-util': 0.10.1 - optional: true - '@node-rs/bcrypt-android-arm-eabi@1.10.7': optional: true @@ -8605,8 +8505,6 @@ snapshots: '@oxc-project/types@0.94.0': {} - '@oxc-project/types@0.94.0': {} - '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -8696,88 +8594,44 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.43': optional: true - '@rolldown/binding-android-arm64@1.0.0-beta.43': - optional: true - - '@rolldown/binding-darwin-arm64@1.0.0-beta.41': - optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.43': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.41': - optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.43': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.41': - optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': - optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': - optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': - optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': - optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': - optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': - optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': - dependencies: - '@napi-rs/wasm-runtime': 1.0.7 - optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': dependencies: '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': - optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': - optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': - optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': optional: true @@ -8785,8 +8639,6 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.43': {} - '@rolldown/pluginutils@1.0.0-beta.43': {} - '@rollup/plugin-alias@5.1.1(rollup@4.43.0)': optionalDependencies: rollup: 4.43.0 @@ -9975,6 +9827,8 @@ snapshots: balanced-match@1.0.2: {} + baseline-browser-mapping@2.8.16: {} + baseline-browser-mapping@2.8.18: {} bignumber.js@9.3.1: {} @@ -10019,7 +9873,7 @@ snapshots: browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.18 + baseline-browser-mapping: 2.8.16 caniuse-lite: 1.0.30001748 electron-to-chromium: 1.5.230 node-releases: 2.0.21 @@ -12296,46 +12150,6 @@ snapshots: - oxc-resolver - supports-color - rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.43)(typescript@5.9.2)(vue-tsc@3.1.0(typescript@5.9.2)): - dependencies: - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - ast-kit: 2.1.2 - birpc: 2.6.1 - debug: 4.4.3 - dts-resolver: 2.1.2 - get-tsconfig: 4.10.1 - magic-string: 0.30.19 - rolldown: 1.0.0-beta.43 - optionalDependencies: - typescript: 5.9.2 - vue-tsc: 3.1.0(typescript@5.9.2) - transitivePeerDependencies: - - oxc-resolver - - supports-color - - rolldown@1.0.0-beta.41: - dependencies: - '@oxc-project/types': 0.94.0 - '@rolldown/pluginutils': 1.0.0-beta.43 - ansis: 4.2.0 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.43 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.43 - '@rolldown/binding-darwin-x64': 1.0.0-beta.43 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.43 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.43 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.43 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.43 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.43 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.43 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.43 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.43 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.43 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.43 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.43 - rolldown@1.0.0-beta.43: dependencies: '@oxc-project/types': 0.94.0 @@ -12965,8 +12779,8 @@ snapshots: empathic: 2.0.0 hookable: 5.5.3 rolldown: 1.0.0-beta.43 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.43)(typescript@5.9.2)(vue-tsc@3.1.0(typescript@5.9.2)) - semver: 7.7.2 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.43)(typescript@5.9.2)(vue-tsc@3.1.1(typescript@5.9.2)) + semver: 7.7.3 tinyexec: 1.0.1 tinyglobby: 0.2.15 tree-kill: 1.2.2 From b9b2de4c6cfbce29ba3f2d74c9cae6a99e69aee2 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:14:35 +0900 Subject: [PATCH 06/11] refactor: share createIsBuiltin --- packages/vite/src/module-runner/runner.ts | 8 ++------ packages/vite/src/module-runner/utils.ts | 16 ---------------- packages/vite/src/node/utils.ts | 15 +-------------- packages/vite/src/shared/builtin.ts | 15 +++++++++++++++ 4 files changed, 18 insertions(+), 36 deletions(-) create mode 100644 packages/vite/src/shared/builtin.ts diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index 4da805a522c9bb..63672539c77d87 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -6,6 +6,7 @@ import { type NormalizedModuleRunnerTransport, normalizeModuleRunnerTransport, } from '../shared/moduleRunnerTransport' +import { createIsBuiltin } from '../shared/builtin' import type { EvaluatedModuleNode } from './evaluatedModules' import { EvaluatedModules } from './evaluatedModules' import type { @@ -15,12 +16,7 @@ import type { ResolvedResult, SSRImportMetadata, } from './types' -import { - createIsBuiltin, - posixDirname, - posixPathToFileHref, - posixResolve, -} from './utils' +import { posixDirname, posixPathToFileHref, posixResolve } from './utils' import { ssrDynamicImportKey, ssrExportAllKey, diff --git a/packages/vite/src/module-runner/utils.ts b/packages/vite/src/module-runner/utils.ts index bb37a34e844ac1..d5829e1b43272b 100644 --- a/packages/vite/src/module-runner/utils.ts +++ b/packages/vite/src/module-runner/utils.ts @@ -63,19 +63,3 @@ export function posixPathToFileHref(posixPath: string): string { export function toWindowsPath(path: string): string { return path.replace(/\//g, '\\') } - -export function createIsBuiltin( - builtins: (string | RegExp)[], -): (id: string) => boolean { - const plainBuiltinsSet = new Set( - builtins.filter( - (builtin): builtin is string => typeof builtin === 'string', - ), - ) - const regexBuiltins = builtins.filter( - (builtin): builtin is RegExp => builtin instanceof RegExp, - ) - - return (id: string) => - plainBuiltinsSet.has(id) || regexBuiltins.some((regexp) => regexp.test(id)) -} diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index 4e291d202e5b91..5f7f11edab6029 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -30,6 +30,7 @@ import { withTrailingSlash, } from '../shared/utils' import { VALID_ID_PREFIX } from '../shared/constants' +import { createIsBuiltin } from '../shared/builtin' import { CLIENT_ENTRY, CLIENT_PUBLIC_PATH, @@ -117,20 +118,6 @@ export function isBuiltin(builtins: (string | RegExp)[], id: string): boolean { return isBuiltin(id) } -export function createIsBuiltin( - builtins: (string | RegExp)[], -): (id: string) => boolean { - const plainBuiltinsSet = new Set( - builtins.filter((builtin) => typeof builtin === 'string'), - ) - const regexBuiltins = builtins.filter( - (builtin) => typeof builtin !== 'string', - ) - - return (id) => - plainBuiltinsSet.has(id) || regexBuiltins.some((regexp) => regexp.test(id)) -} - export const nodeLikeBuiltins = [ ...nodeBuiltins, new RegExp(`^${NODE_BUILTIN_NAMESPACE}`), diff --git a/packages/vite/src/shared/builtin.ts b/packages/vite/src/shared/builtin.ts new file mode 100644 index 00000000000000..9489b2d9505088 --- /dev/null +++ b/packages/vite/src/shared/builtin.ts @@ -0,0 +1,15 @@ +export function createIsBuiltin( + builtins: (string | RegExp)[], +): (id: string) => boolean { + const plainBuiltinsSet = new Set( + builtins.filter( + (builtin): builtin is string => typeof builtin === 'string', + ), + ) + const regexBuiltins = builtins.filter( + (builtin): builtin is RegExp => builtin instanceof RegExp, + ) + + return (id: string) => + plainBuiltinsSet.has(id) || regexBuiltins.some((regexp) => regexp.test(id)) +} From 993331b159c34082991f3e12c6f153140fe8bb55 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:15:58 +0900 Subject: [PATCH 07/11] fix: avoid memory leak and retry on error --- packages/vite/src/module-runner/runner.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index 63672539c77d87..d26f5e9114e003 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -252,9 +252,8 @@ export class ModuleRunner { const builtins = await this.transport.invoke('getBuiltins', []) this.isBuiltin = createIsBuiltin(builtins) this.debug?.('[module runner] builtins loaded:', builtins) - } catch (error) { - this.debug?.('[module runner] failed to load builtins:', error) - this.isBuiltin = () => false + } finally { + this.builtinsPromise = undefined } })() From e3e26ee7f35203da5f8bba78a4229a39e915e27a Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:16:21 +0900 Subject: [PATCH 08/11] chore: minor refactor --- packages/vite/src/module-runner/runner.ts | 6 ++---- packages/vite/src/node/server/environment.ts | 4 ++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index d26f5e9114e003..4e7e7a379271e4 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -241,12 +241,10 @@ export class ModuleRunner { return cached } - private async ensureBuiltins(): Promise { + private ensureBuiltins(): Promise | undefined { if (this.isBuiltin) return - if (this.builtinsPromise) return this.builtinsPromise - - this.builtinsPromise = (async () => { + this.builtinsPromise ??= (async () => { try { this.debug?.('[module runner] fetching builtins from server') const builtins = await this.transport.invoke('getBuiltins', []) diff --git a/packages/vite/src/node/server/environment.ts b/packages/vite/src/node/server/environment.ts index e336c0fd5745a9..9f4b25c09531c0 100644 --- a/packages/vite/src/node/server/environment.ts +++ b/packages/vite/src/node/server/environment.ts @@ -133,8 +133,8 @@ export class DevEnvironment extends BaseEnvironment { fetchModule: (id, importer, options) => { return this.fetchModule(id, importer, options) }, - getBuiltins: () => { - return Promise.resolve(this.config.resolve.builtins) + getBuiltins: async () => { + return this.config.resolve.builtins }, }) From 410efa1cae81af15ce16d34e7469a9ca5b39a9ff Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:17:53 +0900 Subject: [PATCH 09/11] chore: minor refactor --- packages/vite/src/module-runner/runner.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index 4e7e7a379271e4..158d1e0d43efd1 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -275,18 +275,16 @@ export class ModuleRunner { const fetchedModule = // fast return for established externalized pattern ( - url.startsWith('data:') + url.startsWith('data:') || this.isBuiltin?.(url) ? { externalize: url, type: 'builtin' } - : this.isBuiltin?.(url) - ? { externalize: url, type: 'builtin' } - : await this.transport.invoke('fetchModule', [ - url, - importer, - { - cached: isCached, - startOffset: this.evaluator.startOffset, - }, - ]) + : await this.transport.invoke('fetchModule', [ + url, + importer, + { + cached: isCached, + startOffset: this.evaluator.startOffset, + }, + ]) ) as ResolvedResult if ('cache' in fetchedModule) { From 763e1ed2689a7c5280a74a81e9da2d9c2eabd717 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:18:38 +0900 Subject: [PATCH 10/11] chore: fix merge --- pnpm-lock.yaml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b843d49d9bd6c..61949aa020d723 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4218,10 +4218,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.8.16: - resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} - hasBin: true - baseline-browser-mapping@2.8.18: resolution: {integrity: sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==} hasBin: true @@ -9827,8 +9823,6 @@ snapshots: balanced-match@1.0.2: {} - baseline-browser-mapping@2.8.16: {} - baseline-browser-mapping@2.8.18: {} bignumber.js@9.3.1: {} @@ -9873,7 +9867,7 @@ snapshots: browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.16 + baseline-browser-mapping: 2.8.18 caniuse-lite: 1.0.30001748 electron-to-chromium: 1.5.230 node-releases: 2.0.21 From 39a3aa5a486bc05fb3242cede44c06b833601b5a Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Mon, 20 Oct 2025 15:22:14 +0900 Subject: [PATCH 11/11] chore: revert unnecessary change --- packages/vite/src/shared/builtin.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/vite/src/shared/builtin.ts b/packages/vite/src/shared/builtin.ts index 9489b2d9505088..70e637e85230f5 100644 --- a/packages/vite/src/shared/builtin.ts +++ b/packages/vite/src/shared/builtin.ts @@ -2,12 +2,10 @@ export function createIsBuiltin( builtins: (string | RegExp)[], ): (id: string) => boolean { const plainBuiltinsSet = new Set( - builtins.filter( - (builtin): builtin is string => typeof builtin === 'string', - ), + builtins.filter((builtin) => typeof builtin === 'string'), ) const regexBuiltins = builtins.filter( - (builtin): builtin is RegExp => builtin instanceof RegExp, + (builtin) => typeof builtin !== 'string', ) return (id: string) =>