vite icon indicating copy to clipboard operation
vite copied to clipboard

Vite does not treeshake async imports

Open sadan4 opened this issue 1 month ago • 0 comments

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

sadan4 avatar Nov 15 '25 02:11 sadan4