Plugin `transformIndexHtml` called with a `*.html` id that's `import`ed and not an entrypoint during `vite build`.

#20308

Issue Details

28 days ago
miguel-leonmiguel-leon
pending triage
miguel-leonmiguel-leon
opened 28 days ago
Author

Describe the bug

I expect transformIndexHtml to be called only with entrypoints .html files, and it is like so during vite dev. But during vite build, other .html that is not an entrypoint.

Reproduction

https://stackblitz.com/edit/vitejs-vite-bqwee1at?file=vite.config.js

Steps to reproduce

Run npm install followed by npm run dev.

Only the entrypoint index.html printed to the console.

Run npm run build.

Non-entrypoints .html printed to the console.

System Info

System: OS: Linux 5.0 undefined CPU: (8) x64 Intel(R) Core(TM) i9-9880H CPU @ 2.30GHz Memory: 0 Bytes / 0 Bytes Shell: 1.0 - /bin/jsh Binaries: Node: 20.19.1 - /usr/local/bin/node Yarn: 1.22.19 - /usr/local/bin/yarn npm: 10.8.2 - /usr/local/bin/npm pnpm: 8.15.6 - /usr/local/bin/pnpm npmPackages: vite: ^7.0.0 => 7.0.0

Used Package Manager

npm

Logs

Click to expand!
vite:config config file loaded in 2253.71ms +0ms vite:env loading env files: [ vite:env '/home/projects/vitejs-vite-bqwee1at/.env', vite:env '/home/projects/vitejs-vite-bqwee1at/.env.local', vite:env '/home/projects/vitejs-vite-bqwee1at/.env.production', vite:env '/home/projects/vitejs-vite-bqwee1at/.env.production.local' vite:env ] +0ms vite:env env files loaded in 8.78ms +8ms vite:env using resolved env: {} +2ms vite:config using resolved config: { vite:config plugins: [ vite:config 'vite:build-metadata', vite:config 'vite:watch-package-data', 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 'foo', vite:config 'vite:wasm-fallback', vite:config 'vite:define', vite:config 'vite:css-post', vite:config 'vite:build-html', vite:config 'vite:worker-import-meta-url', vite:config 'vite:asset-import-meta-url', vite:config 'vite:force-systemjs-wrap-complete', vite:config 'commonjs', vite:config 'vite:data-uri', vite:config 'vite:rollup-options-plugins', vite:config 'vite:dynamic-import-vars', vite:config 'vite:import-glob', vite:config 'vite:build-import-analysis', vite:config 'vite:esbuild-transpile', vite:config 'vite:terser', vite:config 'vite:manifest', vite:config 'vite:ssr-manifest', vite:config 'vite:reporter', vite:config 'vite:load-fallback' vite:config ], vite:config build: { vite:config target: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ], 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: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ], vite:config cssMinify: true vite:config }, vite:config environments: { vite:config client: { vite:config define: undefined, vite:config resolve: { vite:config externalConditions: [ 'node' ], vite:config extensions: [ vite:config '.mjs', '.js', vite:config '.mts', '.ts', vite:config '.jsx', '.tsx', vite:config '.json' vite:config ], 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/home/projects/vitejs-vite-bqwee1at/node_modules/vite/dist/client/env.mjs' vite:config }, vite:config { vite:config find: /^\/?@vite\/client/, vite:config replacement: '/@fs/home/projects/vitejs-vite-bqwee1at/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], 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: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ], 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: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ], vite:config cssMinify: true vite:config }, vite:config plugins: [ vite:config { vite:config name: 'vite:build-metadata', vite:config renderChunk: [AsyncFunction: renderChunk] vite:config }, vite:config { vite:config name: 'vite:watch-package-data', vite:config buildStart: [Function: buildStart], vite:config buildEnd: [Function: buildEnd], vite:config watchChange: [Function: watchChange] vite:config }, vite:config { vite:config name: 'alias', vite:config buildStart: [AsyncFunction: buildStart], vite:config resolveId: [Function: resolveId] vite:config }, vite:config { vite:config name: 'vite:modulepreload-polyfill', vite:config resolveId: { handler: [Function: handler] }, vite:config load: { handler: [Function: handler] } vite:config }, vite:config { vite:config name: 'vite:resolve', vite:config resolveId: [AsyncFunction: resolveId], vite:config load: { handler: [Function: handler] } vite:config }, vite:config { vite:config name: 'vite:html-inline-proxy', vite:config resolveId: { handler: [Function: handler] }, vite:config load: { handler: [Function: handler] } vite:config }, vite:config { vite:config name: 'vite:css', vite:config buildStart: [Function: buildStart], vite:config buildEnd: [Function: buildEnd], vite:config load: { handler: [AsyncFunction: handler] }, vite:config transform: { handler: [AsyncFunction: handler] } vite:config }, vite:config { vite:config name: 'vite:esbuild', vite:config configureServer: [Function: configureServer], vite:config transform: [AsyncFunction: transform] vite:config }, vite:config { vite:config name: 'vite:json', vite:config transform: { handler: [Function: handler] } vite:config }, vite:config { vite:config name: 'vite:wasm-helper', vite:config resolveId: { handler: [Function: handler] }, vite:config load: { handler: [AsyncFunction: handler] } vite:config }, vite:config { vite:config name: 'vite:worker', vite:config buildStart: [Function: buildStart], vite:config load: { handler: [AsyncFunction: handler] }, vite:config shouldTransformCachedModule: [Function: shouldTransformCachedModule], vite:config transform: { handler: [AsyncFunction: handler] }, vite:config renderChunk: [Function: renderChunk], vite:config generateBundle: [Function: generateBundle] vite:config }, vite:config { vite:config name: 'vite:asset', vite:config perEnvironmentStartEndDuringDev: true, vite:config buildStart: [Function: buildStart], vite:config resolveId: { handler: [Function: handler] }, vite:config load: { handler: [AsyncFunction: handler] }, vite:config renderChunk: [Function: renderChunk], vite:config generateBundle: [Function: generateBundle] vite:config }, vite:config { vite:config name: 'foo', vite:config transformIndexHtml: { order: 'pre', handler: [Function: handler] }, vite:config load: [Function: load] vite:config }, vite:config { vite:config name: 'vite:wasm-fallback', vite:config load: { handler: [Function: handler] } vite:config }, vite:config { vite:config name: 'vite:define', vite:config transform: { handler: [AsyncFunction: handler] } vite:config }, vite:config { vite:config name: 'vite:css-post', vite:config renderStart: [Function: renderStart], vite:config transform: { handler: [AsyncFunction: handler] }, vite:config renderChunk: [AsyncFunction: renderChunk], vite:config augmentChunkHash: [Function: augmentChunkHash], vite:config generateBundle: [AsyncFunction: generateBundle] vite:config }, vite:config { vite:config name: 'vite:build-html', vite:config transform: { handler: [AsyncFunction: handler] }, vite:config generateBundle: [AsyncFunction: generateBundle] vite:config }, vite:config { vite:config name: 'vite:worker-import-meta-url', vite:config applyToEnvironment: [Function: applyToEnvironment], vite:config shouldTransformCachedModule: [Function: shouldTransformCachedModule], vite:config transform: { handler: [AsyncFunction: handler] } vite:config }, vite:config { vite:config name: 'vite:asset-import-meta-url', vite:config applyToEnvironment: [Function: applyToEnvironment], vite:config transform: { handler: [AsyncFunction: handler] } vite:config }, vite:config { vite:config name: 'vite:force-systemjs-wrap-complete', vite:config renderChunk: [Function: renderChunk] vite:config }, vite:config { vite:config name: 'commonjs', vite:config version: '28.0.6', vite:config options: [Function: options], vite:config buildStart: [Function: buildStart], vite:config buildEnd: [Function: buildEnd], vite:config load: [AsyncFunction: load], vite:config shouldTransformCachedModule: [Function: shouldTransformCachedModule], vite:config transform: [Function: transform] vite:config }, vite:config { vite:config name: 'vite:data-uri', vite:config buildStart: [Function: buildStart], vite:config resolveId: [Function: resolveId], vite:config load: [Function: load] vite:config }, vite:config { vite:config name: 'vite:dynamic-import-vars', vite:config resolveId: { handler: [Function: handler] }, vite:config load: { handler: [Function: handler] }, vite:config transform: { handler: [AsyncFunction: handler] } vite:config }, vite:config { vite:config name: 'vite:import-glob', vite:config buildStart: [Function: buildStart], vite:config transform: { handler: [AsyncFunction: handler] }, vite:config hotUpdate: [Function: hotUpdate] vite:config }, vite:config { vite:config name: 'vite:build-import-analysis', vite:config resolveId: { handler: [Function: handler] }, vite:config load: { handler: [Function: handler] }, vite:config transform: { handler: [AsyncFunction: handler] }, vite:config renderChunk: [Function: renderChunk], vite:config generateBundle: [Function: generateBundle] vite:config }, vite:config { vite:config name: 'vite:esbuild-transpile', vite:config applyToEnvironment: [Function: applyToEnvironment], vite:config renderChunk: [AsyncFunction: renderChunk] vite:config }, vite:config { vite:config name: 'vite:terser', vite:config applyToEnvironment: [Function: applyToEnvironment], vite:config renderChunk: [AsyncFunction: renderChunk], vite:config closeBundle: [Function: closeBundle] vite:config }, vite:config { vite:config name: 'vite:reporter', vite:config sharedDuringBuild: true, vite:config perEnvironmentStartEndDuringDev: true, vite:config transform: [Function: transform], vite:config buildStart: [Function: buildStart], vite:config buildEnd: [Function: buildEnd], vite:config renderStart: [Function: renderStart], vite:config renderChunk: [Function: renderChunk], vite:config generateBundle: [Function: generateBundle], vite:config writeBundle: [AsyncFunction: writeBundle] vite:config }, vite:config { vite:config name: 'vite:load-fallback', vite:config load: { handler: [AsyncFunction: handler] } vite:config } vite:config ] vite:config } vite:config }, vite:config resolve: { vite:config externalConditions: [ 'node' ], vite:config extensions: [ vite:config '.mjs', '.js', vite:config '.mts', '.ts', vite:config '.jsx', '.tsx', vite:config '.json' vite:config ], 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/home/projects/vitejs-vite-bqwee1at/node_modules/vite/dist/client/env.mjs' vite:config }, vite:config { vite:config find: /^\/?@vite\/client/, vite:config replacement: '/@fs/home/projects/vitejs-vite-bqwee1at/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: '/home/projects/vitejs-vite-bqwee1at/vite.config.js', vite:config configFileDependencies: [ '/home/projects/vitejs-vite-bqwee1at/vite.config.js' ], 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 build: {} vite:config }, vite:config root: '/home/projects/vitejs-vite-bqwee1at', vite:config base: '/', vite:config decodedBase: '/', vite:config rawBase: '/', vite:config publicDir: '/home/projects/vitejs-vite-bqwee1at/public', vite:config cacheDir: '/home/projects/vitejs-vite-bqwee1at/node_modules/.vite', vite:config command: 'build', vite:config mode: 'production', vite:config isWorker: false, vite:config mainConfig: null, vite:config bundleChain: [], vite:config isProduction: true, vite:config css: { vite:config transformer: 'postcss', vite:config preprocessorMaxWorkers: true, vite:config devSourcemap: false vite:config }, vite:config json: { namedExports: true, stringify: 'auto' }, vite:config esbuild: { jsxDev: false }, 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: [ '/home/projects/vitejs-vite-bqwee1at' ] vite:config }, vite:config preTransformRequests: true, vite:config perEnvironmentStartEndDuringDev: false, vite:config sourcemapIgnoreList: [Function: isInNodeModules] vite:config }, 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: '/home/projects/vitejs-vite-bqwee1at', vite:config env: { BASE_URL: '/', MODE: 'production', DEV: false, PROD: true }, 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_/home/projects/vitejs-vite-bqwee1at' => { vite:config dir: '/home/projects/vitejs-vite-bqwee1at', vite:config data: { vite:config name: 'vite-starter', vite:config private: true, vite:config version: '0.0.0', vite:config type: 'module', vite:config scripts: { vite:config dev: 'vite', vite:config build: 'vite build --debug', vite:config preview: 'vite preview' vite:config }, vite:config devDependencies: { vite: '^7.0.0' } 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: { vite:config importGlobRestoreExtension: false, vite:config renderBuiltUrl: undefined, vite:config hmrPartialAccept: false vite:config }, vite:config future: undefined, vite:config ssr: { vite:config target: 'node', vite:config optimizeDeps: { esbuildOptions: { preserveSymlinks: false } }, vite:config resolve: { conditions: undefined, externalConditions: undefined } 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], vite:config preTransformRequests: false, vite:config createEnvironment: [Function: defaultCreateDevEnvironment], vite:config recoverable: false, vite:config moduleRunnerTransform: false vite:config }, vite:config webSocketToken: 'yNF86zYHQFC6', 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 [Symbol(vite:resolved-config)]: true vite:config } +102ms vite v7.0.0 building for production... { entrypoint: '/home/projects/vitejs-vite-bqwee1at/index.html' } transforming (5) src/counter.js{ entrypoint: '/home/projects/vitejs-vite-bqwee1at/src/foo.html' } 8 modules transformed. dist/src/foo.html 0.03 kB │ gzip: 0.05 kB dist/index.html 0.45 kB │ gzip: 0.29 kB dist/assets/index-CrYBktwj.css 1.20 kB │ gzip: 0.62 kB dist/assets/index-DwXTHeoX.js 2.70 kB │ gzip: 1.45 kB ✓ built in 1.76s

Validations