-
-
Notifications
You must be signed in to change notification settings - Fork 7k
Description
Describe the bug
I am building a plugin that prerenders static pages from markdown/react components.
I am programmatically setting the entrypoints, provide the resolveId
and load
hooks to load the content.
In the reproduction code you will see that I first load load.html
file and then, when I load
the load.html
I am also trying to load some-code?proxy
module and get it's code.
In the build mode it works fine. With the dev mode, the load
for proxy does not return code.
While debugging, I have noticed that build mode goes directly to rollup, however, in dev mode there is a PluginContext
instead.
I have pinpointed the execution to the load
method inside of PluginContext
. It loads the source-code, however, the last call to this.getModuleInfo
does not return the code. And the resulting ModueInfo
does not contain anything except id
and empty meta
.

Reproduction
https://github.com/vladmiller/vite-context-issue
Steps to reproduce
pnpm install
# Build works fine
pnpm vite build
# Dev
pnpm vite
# Navigate to http://localhost:5173/home
System Info
System:
OS: macOS 15.3.2
CPU: (8) arm64 Apple M2
Memory: 476.53 MB / 24.00 GB
Shell: 5.9 - /bin/zsh
Binaries:
Node: 23.3.0 - ~/.nvm/versions/node/v23.3.0/bin/node
npm: 10.9.0 - ~/.nvm/versions/node/v23.3.0/bin/npm
pnpm: 9.15.4 - ~/.nvm/versions/node/v23.3.0/bin/pnpm
Browsers:
Chrome: 133.0.6943.143
Safari: 18.3.1
npmPackages:
vite: ^6.2.2 => 6.2.2
Used Package Manager
pnpm
Logs
Click to expand!
vite:config config file loaded in 12.82ms +0ms
vite:env loading env files: [
vite:env '/Users/johndoe/Projects/vite-context-issue/.env',
vite:env '/Users/johndoe/Projects/vite-context-issue/.env.local',
vite:env '/Users/johndoe/Projects/vite-context-issue/.env.development',
vite:env '/Users/johndoe/Projects/vite-context-issue/.env.development.local'
vite:env ] +0ms
vite:env env files loaded in 0.21ms +0ms
vite:env using resolved env: {} +0ms
vite:config using resolved config: {
vite:config plugins: [
vite:config 'vite:optimized-deps',
vite:config 'vite:watch-package-data',
vite:config 'vite:pre-alias',
vite:config 'alias',
vite:config 'vite:modulepreload-polyfill',
vite:config 'vite:resolve',
vite:config 'vite:html-inline-proxy',
vite:config 'vite:css',
vite:config 'vite:esbuild',
vite:config 'vite:json',
vite:config 'vite:wasm-helper',
vite:config 'vite:worker',
vite:config 'vite:asset',
vite:config 'vite-plugin-index-html',
vite:config 'vite:wasm-fallback',
vite:config 'vite:define',
vite:config 'vite:css-post',
vite:config 'vite:worker-import-meta-url',
vite:config 'vite:asset-import-meta-url',
vite:config 'vite:dynamic-import-vars',
vite:config 'vite:import-glob',
vite:config 'vite:client-inject',
vite:config 'vite:css-analysis',
vite:config 'vite:import-analysis'
vite:config ],
vite:config server: {
vite:config port: 5173,
vite:config strictPort: false,
vite:config host: undefined,
vite:config allowedHosts: [],
vite:config https: undefined,
vite:config open: false,
vite:config proxy: undefined,
vite:config cors: {
vite:config origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
vite:config },
vite:config headers: {},
vite:config warmup: { clientFiles: [], ssrFiles: [] },
vite:config middlewareMode: false,
vite:config fs: {
vite:config strict: true,
vite:config deny: [ '.env', '.env.*', '*.{crt,pem}', '**/.git/**' ],
vite:config allow: [ '/Users/johndoe/Projects/vite-context-issue' ]
vite:config },
vite:config preTransformRequests: true,
vite:config perEnvironmentStartEndDuringDev: false,
vite:config sourcemapIgnoreList: [Function: isInNodeModules$1]
vite:config },
vite:config environments: {
vite:config client: {
vite:config define: undefined,
vite:config resolve: {
vite:config externalConditions: [ 'node' ],
vite:config extensions: [ '.mjs', '.js', '.ts', '.jsx', '.tsx', '.json' ],
vite:config dedupe: [],
vite:config noExternal: [],
vite:config external: [],
vite:config preserveSymlinks: false,
vite:config alias: [
vite:config {
vite:config find: /^\/?@vite\/env/,
vite:config replacement: '/@fs/Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/client/env.mjs'
vite:config },
vite:config {
vite:config find: /^\/?@vite\/client/,
vite:config replacement: '/@fs/Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/client/client.mjs'
vite:config }
vite:config ],
vite:config mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
vite:config conditions: [ 'module', 'browser', 'development|production' ],
vite:config builtins: []
vite:config },
vite:config keepProcessEnv: false,
vite:config consumer: 'client',
vite:config optimizeDeps: {
vite:config include: [],
vite:config exclude: [],
vite:config needsInterop: [],
vite:config extensions: [],
vite:config disabled: undefined,
vite:config holdUntilCrawlEnd: true,
vite:config force: false,
vite:config noDiscovery: false,
vite:config esbuildOptions: { preserveSymlinks: false }
vite:config },
vite:config dev: {
vite:config warmup: [],
vite:config sourcemap: { js: true },
vite:config sourcemapIgnoreList: [Function: isInNodeModules$1],
vite:config preTransformRequests: true,
vite:config createEnvironment: [Function: defaultCreateClientDevEnvironment],
vite:config recoverable: true,
vite:config moduleRunnerTransform: false
vite:config },
vite:config build: {
vite:config target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
vite:config polyfillModulePreload: true,
vite:config modulePreload: { polyfill: true },
vite:config outDir: 'dist',
vite:config assetsDir: 'assets',
vite:config assetsInlineLimit: 4096,
vite:config sourcemap: false,
vite:config terserOptions: {},
vite:config rollupOptions: {},
vite:config commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
vite:config dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
vite:config write: true,
vite:config emptyOutDir: null,
vite:config copyPublicDir: true,
vite:config manifest: false,
vite:config lib: false,
vite:config ssrManifest: false,
vite:config ssrEmitAssets: false,
vite:config reportCompressedSize: true,
vite:config chunkSizeWarningLimit: 500,
vite:config watch: null,
vite:config cssCodeSplit: true,
vite:config minify: 'esbuild',
vite:config ssr: false,
vite:config emitAssets: true,
vite:config createEnvironment: [Function: createEnvironment],
vite:config cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
vite:config cssMinify: true
vite:config }
vite:config },
vite:config ssr: {
vite:config define: undefined,
vite:config resolve: {
vite:config externalConditions: [ 'node' ],
vite:config extensions: [ '.mjs', '.js', '.ts', '.jsx', '.tsx', '.json' ],
vite:config dedupe: [],
vite:config noExternal: [],
vite:config external: [],
vite:config preserveSymlinks: false,
vite:config alias: [
vite:config {
vite:config find: /^\/?@vite\/env/,
vite:config replacement: '/@fs/Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/client/env.mjs'
vite:config },
vite:config {
vite:config find: /^\/?@vite\/client/,
vite:config replacement: '/@fs/Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/client/client.mjs'
vite:config }
vite:config ],
vite:config mainFields: [ 'module', 'jsnext:main', 'jsnext' ],
vite:config conditions: [ 'module', 'node', 'development|production' ],
vite:config builtins: [
vite:config '_http_agent', '_http_client', '_http_common',
vite:config '_http_incoming', '_http_outgoing', '_http_server',
vite:config '_stream_duplex', '_stream_passthrough', '_stream_readable',
vite:config '_stream_transform', '_stream_wrap', '_stream_writable',
vite:config '_tls_common', '_tls_wrap', 'assert',
vite:config 'assert/strict', 'async_hooks', 'buffer',
vite:config 'child_process', 'cluster', 'console',
vite:config 'constants', 'crypto', 'dgram',
vite:config 'diagnostics_channel', 'dns', 'dns/promises',
vite:config 'domain', 'events', 'fs',
vite:config 'fs/promises', 'http', 'http2',
vite:config 'https', 'inspector', 'inspector/promises',
vite:config 'module', 'net', 'os',
vite:config 'path', 'path/posix', 'path/win32',
vite:config 'perf_hooks', 'process', 'punycode',
vite:config 'querystring', 'readline', 'readline/promises',
vite:config 'repl', 'stream', 'stream/consumers',
vite:config 'stream/promises', 'stream/web', 'string_decoder',
vite:config 'sys', 'timers', 'timers/promises',
vite:config 'tls', 'trace_events', 'tty',
vite:config 'url', 'util', 'util/types',
vite:config 'v8', 'vm', 'wasi',
vite:config 'worker_threads', 'zlib', /^node:/,
vite:config /^npm:/, /^bun:/
vite:config ]
vite:config },
vite:config keepProcessEnv: true,
vite:config consumer: 'server',
vite:config optimizeDeps: {
vite:config include: [],
vite:config exclude: [],
vite:config needsInterop: [],
vite:config extensions: [],
vite:config disabled: undefined,
vite:config holdUntilCrawlEnd: true,
vite:config force: false,
vite:config noDiscovery: true,
vite:config esbuildOptions: { preserveSymlinks: false }
vite:config },
vite:config dev: {
vite:config warmup: [],
vite:config sourcemap: { js: true },
vite:config sourcemapIgnoreList: [Function: isInNodeModules$1],
vite:config preTransformRequests: false,
vite:config createEnvironment: [Function: defaultCreateDevEnvironment],
vite:config recoverable: false,
vite:config moduleRunnerTransform: true
vite:config },
vite:config build: {
vite:config target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
vite:config polyfillModulePreload: true,
vite:config modulePreload: { polyfill: true },
vite:config outDir: 'dist',
vite:config assetsDir: 'assets',
vite:config assetsInlineLimit: 4096,
vite:config sourcemap: false,
vite:config terserOptions: {},
vite:config rollupOptions: {},
vite:config commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
vite:config dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
vite:config write: true,
vite:config emptyOutDir: null,
vite:config copyPublicDir: true,
vite:config manifest: false,
vite:config lib: false,
vite:config ssrManifest: false,
vite:config ssrEmitAssets: false,
vite:config reportCompressedSize: true,
vite:config chunkSizeWarningLimit: 500,
vite:config watch: null,
vite:config cssCodeSplit: true,
vite:config minify: false,
vite:config ssr: true,
vite:config emitAssets: false,
vite:config createEnvironment: [Function: createEnvironment],
vite:config cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
vite:config cssMinify: 'esbuild'
vite:config }
vite:config }
vite:config },
vite:config resolve: {
vite:config externalConditions: [ 'node' ],
vite:config extensions: [ '.mjs', '.js', '.ts', '.jsx', '.tsx', '.json' ],
vite:config dedupe: [],
vite:config noExternal: [],
vite:config external: [],
vite:config preserveSymlinks: false,
vite:config alias: [
vite:config {
vite:config find: /^\/?@vite\/env/,
vite:config replacement: '/@fs/Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/client/env.mjs'
vite:config },
vite:config {
vite:config find: /^\/?@vite\/client/,
vite:config replacement: '/@fs/Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/client/client.mjs'
vite:config }
vite:config ],
vite:config mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
vite:config conditions: [ 'module', 'browser', 'development|production' ],
vite:config builtins: []
vite:config },
vite:config configFile: '/Users/johndoe/Projects/vite-context-issue/vite.config.ts',
vite:config configFileDependencies: [ '/Users/johndoe/Projects/vite-context-issue/vite.config.ts' ],
vite:config inlineConfig: {
vite:config root: undefined,
vite:config base: undefined,
vite:config mode: undefined,
vite:config configFile: undefined,
vite:config configLoader: undefined,
vite:config logLevel: undefined,
vite:config clearScreen: undefined,
vite:config server: { host: undefined },
vite:config forceOptimizeDeps: undefined
vite:config },
vite:config root: '/Users/johndoe/Projects/vite-context-issue',
vite:config base: '/',
vite:config decodedBase: '/',
vite:config rawBase: '/',
vite:config publicDir: '/Users/johndoe/Projects/vite-context-issue/public',
vite:config cacheDir: '/Users/johndoe/Projects/vite-context-issue/node_modules/.vite',
vite:config command: 'serve',
vite:config mode: 'development',
vite:config isWorker: false,
vite:config mainConfig: null,
vite:config bundleChain: [],
vite:config isProduction: false,
vite:config css: {
vite:config transformer: 'postcss',
vite:config preprocessorMaxWorkers: 0,
vite:config devSourcemap: false,
vite:config lightningcss: undefined
vite:config },
vite:config json: { namedExports: true, stringify: 'auto' },
vite:config esbuild: { jsxDev: true },
vite:config builder: undefined,
vite:config preview: {
vite:config port: 4173,
vite:config strictPort: false,
vite:config host: undefined,
vite:config allowedHosts: [],
vite:config https: undefined,
vite:config open: false,
vite:config proxy: undefined,
vite:config cors: {
vite:config origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
vite:config },
vite:config headers: {}
vite:config },
vite:config envDir: '/Users/johndoe/Projects/vite-context-issue',
vite:config env: { BASE_URL: '/', MODE: 'development', DEV: true, PROD: false },
vite:config assetsInclude: [Function: assetsInclude],
vite:config logger: {
vite:config hasWarned: false,
vite:config info: [Function: info],
vite:config warn: [Function: warn],
vite:config warnOnce: [Function: warnOnce],
vite:config error: [Function: error],
vite:config clearScreen: [Function: clearScreen],
vite:config hasErrorLogged: [Function: hasErrorLogged]
vite:config },
vite:config packageCache: Map(1) {
vite:config 'fnpd_/Users/johndoe/Projects/vite-context-issue' => {
vite:config dir: '/Users/johndoe/Projects/vite-context-issue',
vite:config data: {
vite:config name: 'vite-context-issue',
vite:config version: '1.0.0',
vite:config description: '',
vite:config main: 'index.js',
vite:config scripts: { test: 'echo "Error: no test specified" && exit 1' },
vite:config keywords: [],
vite:config author: '',
vite:config license: 'ISC',
vite:config packageManager: 'pnpm@9.15.4+sha512.b2dc20e2fc72b3e18848459b37359a32064663e5627a51e4c74b2c29dd8e8e0491483c3abb40789cfd578bf362fb6ba8261b05f0387d76792ed6e23ea3b1b6a0',
vite:config dependencies: { vite: '^6.2.2' }
vite:config },
vite:config hasSideEffects: [Function: hasSideEffects],
vite:config setResolvedCache: [Function: setResolvedCache],
vite:config getResolvedCache: [Function: getResolvedCache]
vite:config },
vite:config set: [Function (anonymous)]
vite:config },
vite:config worker: { format: 'iife', plugins: '() => plugins', rollupOptions: {} },
vite:config appType: 'spa',
vite:config experimental: { importGlobRestoreExtension: false, hmrPartialAccept: false },
vite:config future: undefined,
vite:config ssr: {
vite:config target: 'node',
vite:config optimizeDeps: {
vite:config esbuildOptions: { preserveSymlinks: false },
vite:config include: [],
vite:config exclude: [],
vite:config needsInterop: [],
vite:config extensions: [],
vite:config holdUntilCrawlEnd: true,
vite:config force: false,
vite:config noDiscovery: true
vite:config },
vite:config external: [],
vite:config noExternal: [],
vite:config resolve: {
vite:config conditions: [ 'module', 'node', 'development|production' ],
vite:config externalConditions: [ 'node' ]
vite:config }
vite:config },
vite:config optimizeDeps: {
vite:config include: [],
vite:config exclude: [],
vite:config needsInterop: [],
vite:config extensions: [],
vite:config disabled: undefined,
vite:config holdUntilCrawlEnd: true,
vite:config force: false,
vite:config noDiscovery: false,
vite:config esbuildOptions: { preserveSymlinks: false }
vite:config },
vite:config dev: {
vite:config warmup: [],
vite:config sourcemap: { js: true },
vite:config sourcemapIgnoreList: [Function: isInNodeModules$1],
vite:config preTransformRequests: false,
vite:config createEnvironment: [Function: defaultCreateDevEnvironment],
vite:config recoverable: false,
vite:config moduleRunnerTransform: false
vite:config },
vite:config build: {
vite:config target: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
vite:config polyfillModulePreload: true,
vite:config modulePreload: { polyfill: true },
vite:config outDir: 'dist',
vite:config assetsDir: 'assets',
vite:config assetsInlineLimit: 4096,
vite:config sourcemap: false,
vite:config terserOptions: {},
vite:config rollupOptions: { input: { home: 'home.html' } },
vite:config commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
vite:config dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
vite:config write: true,
vite:config emptyOutDir: null,
vite:config copyPublicDir: true,
vite:config manifest: false,
vite:config lib: false,
vite:config ssrManifest: false,
vite:config ssrEmitAssets: false,
vite:config reportCompressedSize: true,
vite:config chunkSizeWarningLimit: 500,
vite:config watch: null,
vite:config cssCodeSplit: true,
vite:config minify: 'esbuild',
vite:config ssr: false,
vite:config emitAssets: false,
vite:config createEnvironment: [Function: createEnvironment],
vite:config cssTarget: [ 'es2020', 'edge88', 'firefox78', 'chrome87', 'safari14' ],
vite:config cssMinify: true
vite:config },
vite:config webSocketToken: 'M7nbqrIT8xPZ',
vite:config getSortedPlugins: [Function: getSortedPlugins],
vite:config getSortedPluginHooks: [Function: getSortedPluginHooks],
vite:config createResolver: [Function: createResolver],
vite:config fsDenyGlob: [Function: arrayMatcher],
vite:config safeModulePaths: Set(0) {},
vite:config additionalAllowedHosts: []
vite:config } +5ms
(node:48844) ExperimentalWarning: CommonJS module /Users/johndoe/Projects/vite-context-issue/vite.config.ts is loading ES Module /Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/node/index.js using require().
Support for loading ES Module in require() is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
vite:deps (client) Hash is consistent. Skipping. Use --force to override. +0ms
Port 5173 is in use, trying another one...
VITE v6.2.2 ready in 82 ms
➜ Local: http://localhost:5174/
➜ Network: use --host to expose
➜ press h + enter to show help
vite:import-analysis 0.93ms [no imports] some-code?proxy +0ms
file:///Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/node/chunks/dep-B0fRCRkQ.js:47463
throw Error(
^
Error: [vite] The "code" property of ModuleInfo is not supported.
at Object.get (file:///Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/node/chunks/dep-B0fRCRkQ.js:47463:19)
at LoadPluginContext.load (/Users/johndoe/Projects/vite-context-issue/vite.config.ts:71:59)
at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
at async EnvironmentPluginContainer.load (file:///Users/johndoe/Projects/vite-context-issue/node_modules/.pnpm/vite@6.2.2/node_modules/vite/dist/node/chunks/dep-B0fRCRkQ.js:47621:22)
at async /Users/johndoe/Projects/vite-context-issue/vite.config.ts:38:30
Node.js v23.3.0
Validations
- Follow our Code of ConductRead the Contributing Guidelines.Read the docs.Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.Make sure this is a Vite issue and not a framework-specific issue. For example, if it's a Vue SFC related bug, it should likely be reported to vuejs/core instead.Check that this is a concrete bug. For Q&A open a GitHub Discussion or join our Discord Chat Server.The provided reproduction is a minimal reproducible example of the bug.To pick up a draggable item, press the space bar. While dragging, use the arrow keys to move the item. Press space again to drop the item in its new position, or press escape to cancel.
Activity
[-]Incompatibility between Rollup and ViteDevServer contexts[/-][+]`this.getModuleInfo().code` support in dev[/+]magne4000 commentedon Apr 3, 2025
I stumbled upon the same issue.
I'd like to add that, in this case, in dev, the failing
this.load
only returns{ id: '...' }
(so noimportedIdResolutions
for instance).I feel that this is more a bug than a nice-to-have.
vladmiller commentedon Apr 3, 2025
@magne4000 I feel the same, as right now this prevents me from proceeding with the plugin development.
Vite team is working on RollDown, that should in theory replace Rollup/eslint combination with a single environment – which, I suspect, in turn will resolve all these incompatibility issues between build & dev environments.
Rolldown is already at
v1.0.0-beta.6
and there is a Vite fork that already uses Rolldown: https://github.com/vitejs/rolldown-viteIt's still early, but I guess it's already possible to give it a test-run for smaller non-critical projects.
magne4000 commentedon Apr 3, 2025
Related issue: #15411
magne4000 commentedon Apr 4, 2025
sapphi-red response on this subject with some insights: