vite
vite copied to clipboard
Vite does not treeshake async imports
Describe the bug
I am trying to import a module asynchronously and have it be treeshaken, but this does not work in vite. If I try the same thing in rollup (repl link) or use a static import statement at module-level, treeshaking works as expected
Reproduction
https://stackblitz.com/edit/vitejs-vite-s8sxppz8?file=src%2Fbar.js
Steps to reproduce
run pnpm build
open dist/assets/bar-[some hash].js
notice someRandomExport is in the final bundle
System Info
System:
OS: Linux 6.17 cpe:/o:nixos:nixos:25.11 25.11 (Xantusia)
CPU: (20) x64 13th Gen Intel(R) Core(TM) i5-13600KF
Memory: 48.68 GB / 62.63 GB
Container: Yes
Shell: 5.9 - /run/current-system/sw/bin/zsh
Binaries:
Node: 24.10.0 - /etc/profiles/per-user/meyer/bin/node
npm: 11.6.1 - /etc/profiles/per-user/meyer/bin/npm
pnpm: 9.15.2 - /etc/profiles/per-user/meyer/bin/pnpm
bun: 1.3.1 - /etc/profiles/per-user/meyer/bin/bun
Deno: 2.5.3 - /etc/profiles/per-user/meyer/bin/deno
Browsers:
Brave Browser: 141.1.83.120
Chromium: 141.0.7390.122
Firefox: 144.0
Firefox Developer Edition: 144.0
npmPackages:
@vitejs/plugin-react: ^5.0.4 => 5.0.4
vite: ^7.1.10 => 7.1.10
Used Package Manager
pnpm
Logs
Debug Log
> [email protected] build /home/projects/vitejs-vite-s8sxppz8
> vite build "--debug"
2025-11-15T02:52:35.616Z vite:config no config file found.
2025-11-15T02:52:35.618Z vite:env loading env files: [
'/home/projects/vitejs-vite-s8sxppz8/.env',
'/home/projects/vitejs-vite-s8sxppz8/.env.local',
'/home/projects/vitejs-vite-s8sxppz8/.env.production',
'/home/projects/vitejs-vite-s8sxppz8/.env.production.local'
]
2025-11-15T02:52:35.618Z vite:env env files loaded in 0.69ms
2025-11-15T02:52:35.618Z vite:env using resolved env: {}
2025-11-15T02:52:35.625Z vite:config using resolved config: {
root: '/home/projects/vitejs-vite-s8sxppz8',
base: '/',
mode: 'production',
configFile: undefined,
configLoader: undefined,
logLevel: undefined,
clearScreen: undefined,
build: {
target: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
polyfillModulePreload: true,
modulePreload: { polyfill: true },
outDir: 'dist',
assetsDir: 'assets',
assetsInlineLimit: 4096,
sourcemap: false,
terserOptions: {},
rollupOptions: {},
commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
write: true,
emptyOutDir: null,
copyPublicDir: true,
license: false,
manifest: false,
lib: false,
ssrManifest: false,
ssrEmitAssets: false,
reportCompressedSize: true,
chunkSizeWarningLimit: 500,
watch: null,
cssCodeSplit: true,
minify: 'esbuild',
ssr: false,
emitAssets: true,
createEnvironment: [Function: createEnvironment],
cssTarget: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
cssMinify: true
},
environments: {
client: {
define: undefined,
resolve: {
externalConditions: [ 'node', 'module-sync' ],
extensions: [
'.mjs', '.js',
'.mts', '.ts',
'.jsx', '.tsx',
'.json'
],
dedupe: [],
noExternal: [],
external: [],
preserveSymlinks: false,
alias: [
{
find: /^\/?@vite\/env/,
replacement: '/@fs/home/projects/vitejs-vite-s8sxppz8/node_modules/vite/dist/client/env.mjs'
},
{
find: /^\/?@vite\/client/,
replacement: '/@fs/home/projects/vitejs-vite-s8sxppz8/node_modules/vite/dist/client/client.mjs'
}
],
mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
conditions: [ 'module', 'browser', 'development|production' ],
builtins: []
},
keepProcessEnv: false,
consumer: 'client',
optimizeDeps: {
include: [],
exclude: [],
needsInterop: [],
extensions: [],
disabled: undefined,
holdUntilCrawlEnd: true,
force: false,
noDiscovery: false,
esbuildOptions: { preserveSymlinks: false }
},
dev: {
warmup: [],
sourcemap: { js: true },
sourcemapIgnoreList: [Function: isInNodeModules],
preTransformRequests: true,
createEnvironment: [Function: defaultCreateClientDevEnvironment],
recoverable: true,
moduleRunnerTransform: false
},
build: {
target: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
polyfillModulePreload: true,
modulePreload: { polyfill: true },
outDir: 'dist',
assetsDir: 'assets',
assetsInlineLimit: 4096,
sourcemap: false,
terserOptions: {},
rollupOptions: {},
commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
write: true,
emptyOutDir: null,
copyPublicDir: true,
license: false,
manifest: false,
lib: false,
ssrManifest: false,
ssrEmitAssets: false,
reportCompressedSize: true,
chunkSizeWarningLimit: 500,
watch: null,
cssCodeSplit: true,
minify: 'esbuild',
ssr: false,
emitAssets: true,
createEnvironment: [Function: createEnvironment],
cssTarget: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
cssMinify: true
},
plugins: [
{
name: 'vite:build-metadata',
renderChunk: [AsyncFunction: renderChunk]
},
{
name: 'vite:watch-package-data',
buildStart: [Function: buildStart],
buildEnd: [Function: buildEnd],
watchChange: [Function: watchChange]
},
{
name: 'alias',
buildStart: [AsyncFunction: buildStart],
resolveId: [Function: resolveId]
},
{
name: 'vite:modulepreload-polyfill',
resolveId: {
filter: { id: /^vite\/modulepreload\-polyfill$/ },
handler: [Function: handler]
},
load: {
filter: { id: /^�vite\/modulepreload\-polyfill\.js$/ },
handler: [Function: handler]
}
},
{
name: 'vite:resolve',
resolveId: {
filter: { id: { exclude: /^(?:\0|\/?virtual:)/ } },
handler: [AsyncFunction: handler]
},
load: {
filter: {
id: [
/^__vite\-browser\-external/,
/^__vite\-optional\-peer\-dep/
]
},
handler: [Function: handler]
}
},
{
name: 'vite:html-inline-proxy',
resolveId: {
filter: { id: /[?&]html-proxy\b/ },
handler: [Function: handler]
},
load: {
filter: { id: /[?&]html-proxy\b/ },
handler: [Function: handler]
}
},
{
name: 'vite:css',
buildStart: [Function: buildStart],
buildEnd: [Function: buildEnd],
load: {
filter: {
id: /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/
},
handler: [AsyncFunction: handler]
},
transform: {
filter: {
id: {
include: /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/,
exclude: [
/[?&]commonjs-proxy/,
/[?&](?:worker|sharedworker|raw|url)\b/
]
}
},
handler: [AsyncFunction: handler]
}
},
{
name: 'vite:esbuild',
configureServer: [Function: configureServer],
transform: [AsyncFunction: transform]
},
{
name: 'vite:json',
transform: {
filter: {
id: {
include: /\.json(?:$|\?)(?!commonjs-(?:proxy|external))/,
exclude: /[?&](?:worker|sharedworker|raw|url)\b/
}
},
handler: [Function: handler]
}
},
{
name: 'vite:wasm-helper',
resolveId: {
filter: { id: /^�vite\/wasm\-helper\.js$/ },
handler: [Function: handler]
},
load: {
filter: {
id: [
/^�vite\/wasm\-helper\.js$/,
/(?<![?#].*)\.wasm\?init/
]
},
handler: [AsyncFunction: handler]
}
},
{
name: 'vite:worker',
buildStart: [Function: buildStart],
load: {
filter: { id: /(?:\?|&)(worker|sharedworker)(?:&|$)/ },
handler: [AsyncFunction: handler]
},
transform: {
filter: { id: /(?:\?|&)worker_file&type=(\w+)(?:&|$)/ },
handler: [AsyncFunction: handler]
},
renderChunk: [Function: renderChunk],
generateBundle: [Function: generateBundle],
watchChange: [Function: watchChange]
},
{
name: 'vite:asset',
perEnvironmentStartEndDuringDev: true,
buildStart: [Function: buildStart],
resolveId: { handler: [Function: handler] },
load: {
filter: { id: { exclude: /^\0/ } },
handler: [AsyncFunction: handler]
},
renderChunk: [Function: renderChunk],
generateBundle: [Function: generateBundle]
},
{
name: 'vite:wasm-fallback',
load: { filter: { id: /\.wasm$/ }, handler: [Function: handler] }
},
{
name: 'vite:define',
transform: { handler: [AsyncFunction: handler] }
},
{
name: 'vite:css-post',
renderStart: [Function: renderStart],
transform: {
filter: {
id: {
include: /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/,
exclude: [
/[?&]commonjs-proxy/,
/[?&](?:worker|sharedworker|raw|url)\b/
]
}
},
handler: [AsyncFunction: handler]
},
renderChunk: [AsyncFunction: renderChunk],
augmentChunkHash: [Function: augmentChunkHash],
generateBundle: [AsyncFunction: generateBundle]
},
{
name: 'vite:build-html',
transform: {
filter: { id: /\.html$/ },
handler: [AsyncFunction: handler]
},
generateBundle: [AsyncFunction: generateBundle]
},
{
name: 'vite:worker-import-meta-url',
applyToEnvironment: [Function: applyToEnvironment],
transform: {
filter: {
code: /new\s+(?:Worker|SharedWorker)\s*\(\s*new\s+URL.+?import\.meta\.url/s
},
handler: [AsyncFunction: handler]
}
},
{
name: 'vite:asset-import-meta-url',
applyToEnvironment: [Function: applyToEnvironment],
transform: {
filter: {
id: {
exclude: [
/^�vite\/preload\-helper\.js$/,
/^\/home\/projects\/vitejs\-vite\-s8sxppz8\/node_modules\/vite\/dist\/client\/client\.mjs$/
]
},
code: /new\s+URL.+import\.meta\.url/s
},
handler: [AsyncFunction: handler]
}
},
{
name: 'vite:force-amd-wrap-require',
renderChunk: [Function: renderChunk]
},
{
name: 'vite:force-systemjs-wrap-complete',
renderChunk: [Function: renderChunk]
},
{
name: 'vite:prepare-out-dir',
options: [Function: options],
renderStart: { order: 'pre', handler: [Function: handler] }
},
{
name: 'commonjs',
version: '28.0.6',
options: [Function: options],
buildStart: [Function: buildStart],
buildEnd: [Function: buildEnd],
load: [AsyncFunction: load],
shouldTransformCachedModule: [Function: shouldTransformCachedModule],
transform: [Function: transform]
},
{
name: 'vite:data-uri',
buildStart: [Function: buildStart],
resolveId: [Function: resolveId],
load: [Function: load]
},
{
name: 'vite:dynamic-import-vars',
resolveId: {
filter: { id: /^�vite\/dynamic\-import\-helper\.js$/ },
handler: [Function: handler]
},
load: {
filter: { id: /^�vite\/dynamic\-import\-helper\.js$/ },
handler: [Function: handler]
},
transform: {
filter: {
id: {
exclude: /^\/home\/projects\/vitejs\-vite\-s8sxppz8\/node_modules\/vite\/dist\/client\/client\.mjs$/
},
code: /\bimport\s*[(/]/
},
handler: [AsyncFunction: handler]
}
},
{
name: 'vite:import-glob',
buildStart: [Function: buildStart],
transform: {
filter: { code: 'import.meta.glob' },
handler: [AsyncFunction: handler]
},
hotUpdate: [Function: hotUpdate]
},
{
name: 'vite:build-import-analysis',
resolveId: {
filter: { id: /^�vite\/preload\-helper\.js$/ },
handler: [Function: handler]
},
load: {
filter: { id: /^�vite\/preload\-helper\.js$/ },
handler: [Function: handler]
},
transform: {
filter: { code: /import\s*\(/ },
handler: [AsyncFunction: handler]
},
renderChunk: [Function: renderChunk],
generateBundle: [Function: generateBundle]
},
{
name: 'vite:esbuild-transpile',
applyToEnvironment: [Function: applyToEnvironment],
renderChunk: [AsyncFunction: renderChunk]
},
{
name: 'vite:terser',
applyToEnvironment: [Function: applyToEnvironment],
renderChunk: [AsyncFunction: renderChunk],
closeBundle: [Function: closeBundle]
},
{
name: 'vite:license',
generateBundle: [AsyncFunction: generateBundle]
},
{
name: 'vite:reporter',
sharedDuringBuild: true,
perEnvironmentStartEndDuringDev: true,
transform: [Function: transform],
buildStart: [Function: buildStart],
buildEnd: [Function: buildEnd],
renderStart: [Function: renderStart],
renderChunk: [Function: renderChunk],
generateBundle: [Function: generateBundle],
writeBundle: [AsyncFunction: writeBundle]
},
{
name: 'vite:load-fallback',
load: { handler: [AsyncFunction: handler] }
}
]
}
},
resolve: {
externalConditions: [ 'node', 'module-sync' ],
extensions: [
'.mjs', '.js',
'.mts', '.ts',
'.jsx', '.tsx',
'.json'
],
dedupe: [],
noExternal: [],
external: [],
preserveSymlinks: false,
alias: [
{
find: /^\/?@vite\/env/,
replacement: '/@fs/home/projects/vitejs-vite-s8sxppz8/node_modules/vite/dist/client/env.mjs'
},
{
find: /^\/?@vite\/client/,
replacement: '/@fs/home/projects/vitejs-vite-s8sxppz8/node_modules/vite/dist/client/client.mjs'
}
],
mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
conditions: [ 'module', 'browser', 'development|production' ],
builtins: []
},
configFileDependencies: [],
inlineConfig: {
root: undefined,
base: undefined,
mode: undefined,
configFile: undefined,
configLoader: undefined,
logLevel: undefined,
clearScreen: undefined,
build: {},
environments: {
client: {
define: undefined,
resolve: undefined,
dev: {},
build: {},
optimizeDeps: undefined
}
},
resolve: { conditions: undefined, mainFields: undefined }
},
decodedBase: '/',
rawBase: '/',
publicDir: '/home/projects/vitejs-vite-s8sxppz8/public',
cacheDir: '/home/projects/vitejs-vite-s8sxppz8/node_modules/.vite',
command: 'build',
isWorker: false,
mainConfig: null,
bundleChain: [],
isProduction: true,
plugins: [
'vite:build-metadata',
'vite:watch-package-data',
'alias',
'vite:modulepreload-polyfill',
'vite:resolve',
'vite:html-inline-proxy',
'vite:css',
'vite:esbuild',
'vite:json',
'vite:wasm-helper',
'vite:worker',
'vite:asset',
'vite:wasm-fallback',
'vite:define',
'vite:css-post',
'vite:build-html',
'vite:worker-import-meta-url',
'vite:asset-import-meta-url',
'vite:force-amd-wrap-require',
'vite:force-systemjs-wrap-complete',
'vite:prepare-out-dir',
'commonjs',
'vite:data-uri',
'vite:rollup-options-plugins',
'vite:dynamic-import-vars',
'vite:import-glob',
'vite:build-import-analysis',
'vite:esbuild-transpile',
'vite:terser',
'vite:license',
'vite:manifest',
'vite:ssr-manifest',
'vite:reporter',
'vite:load-fallback'
],
css: {
transformer: 'postcss',
preprocessorMaxWorkers: true,
devSourcemap: false
},
json: { namedExports: true, stringify: 'auto' },
esbuild: { jsxDev: false, charset: 'utf8', legalComments: 'none' },
server: {
port: 5173,
strictPort: false,
host: undefined,
allowedHosts: [],
https: undefined,
open: false,
proxy: undefined,
cors: {
origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
},
headers: {},
warmup: { clientFiles: [], ssrFiles: [] },
middlewareMode: false,
fs: {
strict: true,
deny: [ '.env', '.env.*', '*.{crt,pem}', '**/.git/**' ],
allow: [ '/home/projects/vitejs-vite-s8sxppz8' ]
},
preTransformRequests: true,
perEnvironmentStartEndDuringDev: false,
perEnvironmentWatchChangeDuringDev: false,
sourcemapIgnoreList: [Function: isInNodeModules]
},
builder: undefined,
preview: {
port: 4173,
strictPort: false,
host: undefined,
allowedHosts: [],
https: undefined,
open: false,
proxy: undefined,
cors: {
origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
},
headers: {}
},
envDir: '/home/projects/vitejs-vite-s8sxppz8',
env: { BASE_URL: '/', MODE: 'production', DEV: false, PROD: true },
assetsInclude: [Function: assetsInclude],
logger: {
hasWarned: false,
info: [Function: info],
warn: [Function: warn],
warnOnce: [Function: warnOnce],
error: [Function: error],
clearScreen: [Function: clearScreen],
hasErrorLogged: [Function: hasErrorLogged]
},
packageCache: Map(1) {
'fnpd_/home/projects/vitejs-vite-s8sxppz8' => {
dir: '/home/projects/vitejs-vite-s8sxppz8',
data: {
name: 'vite-starter',
private: true,
version: '0.0.0',
type: 'module',
scripts: { dev: 'vite', build: 'vite build', preview: 'vite preview' },
devDependencies: { vite: '^7.2.2' }
},
hasSideEffects: [Function: hasSideEffects],
setResolvedCache: [Function: setResolvedCache],
getResolvedCache: [Function: getResolvedCache]
},
set: [Function (anonymous)]
},
worker: { format: 'iife', plugins: '() => plugins', rollupOptions: {} },
appType: 'spa',
experimental: {
importGlobRestoreExtension: false,
renderBuiltUrl: undefined,
hmrPartialAccept: false
},
future: undefined,
ssr: {
target: 'node',
optimizeDeps: { esbuildOptions: { preserveSymlinks: false } },
resolve: { conditions: undefined, externalConditions: undefined }
},
optimizeDeps: {
include: [],
exclude: [],
needsInterop: [],
extensions: [],
disabled: undefined,
holdUntilCrawlEnd: true,
force: false,
noDiscovery: false,
esbuildOptions: { preserveSymlinks: false }
},
dev: {
warmup: [],
sourcemap: { js: true },
sourcemapIgnoreList: [Function: isInNodeModules],
preTransformRequests: false,
createEnvironment: [Function: defaultCreateDevEnvironment],
recoverable: false,
moduleRunnerTransform: false
},
webSocketToken: 'yAlg1F-WqBHd',
getSortedPlugins: [Function: getSortedPlugins],
getSortedPluginHooks: [Function: getSortedPluginHooks],
createResolver: [Function: createResolver],
fsDenyGlob: [Function: arrayMatcher],
safeModulePaths: Set(0) {},
[Symbol(vite:resolved-config)]: true
}
vite v7.2.2 building client environment for production...
transforming...
✓ 5 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html 0.38 kB │ gzip: 0.26 kB
dist/assets/bar-oBx0fX0J.js 0.12 kB │ gzip: 0.10 kB
dist/assets/index-e8MY-Wi-.js 1.91 kB │ gzip: 0.98 kB
✓ built in 362ms
Validations
- [x] Follow our Code of Conduct
- [x] Read the Contributing Guidelines.
- [x] Read the docs.
- [x] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
- [x] 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.
- [x] Check that this is a concrete bug. For Q&A open a GitHub Discussion or join our Discord Chat Server.
- [x] The provided reproduction is a minimal reproducible example of the bug.