Skip to content

rolldown-vite crashing with vite-plugin-pwa used in Yarn PnP #324

@wojtekmaj

Description

@wojtekmaj

Describe the regression

Builds consistently fail when using Yarn PnP when import from virtual:pwa-register is present.

Reproduction

I'm unable to provide Stackblitz playground - corepack not enabled in Stackblitz.

repro.zip

Expected Behavior

Builds not crashing

Actual Behavior

Build crashing (see logs)

Steps to Reproduce

  1. Install a project using Yarn (tested: 4.9.1) using PnP mode
  2. Build the app

System Info

System:
    OS: macOS 15.5
    CPU: (10) arm64 Apple M1 Max
    Memory: 535.63 MB / 64.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 24.3.0 - /private/var/folders/9x/22rs089d2t31txstbb0vnl1r0000gp/T/xfs-35d15554/node
    Yarn: 4.9.1 - /private/var/folders/9x/22rs089d2t31txstbb0vnl1r0000gp/T/xfs-35d15554/yarn
    npm: 11.4.2 - /usr/local/bin/npm
  Browsers:
    Chrome: 138.0.7204.101
    Safari: 18.5

Used Package Manager

yarn

Logs

Click to expand! ```shell vite:config config file loaded in 16.19ms +0ms vite:env loading env files: [ vite:env '/Users/wojciech.maj/Downloads/repro/.env', vite:env '/Users/wojciech.maj/Downloads/repro/.env.local', vite:env '/Users/wojciech.maj/Downloads/repro/.env.production', vite:env '/Users/wojciech.maj/Downloads/repro/.env.production.local' vite:env ] +0ms vite:env env files loaded in 0.28ms +0ms vite:env using resolved env: {} +1ms vite:config using resolved config: { vite:config plugins: [ vite:config 'vite:watch-package-data', vite:config 'alias', vite:config 'vite-plugin-pwa', vite:config 'vite:modulepreload-polyfill', vite:config 'vite:resolve', vite:config 'vite:html-inline-proxy', vite:config 'vite:css', vite:config 'vite:oxc', vite:config 'vite:json', vite:config 'vite:wasm-helper', vite:config 'vite:worker', vite:config 'vite:asset', 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 'vite:rollup-options-plugins', vite:config 'vite:dynamic-import-vars', vite:config 'vite:import-glob', vite:config 'vite-plugin-pwa:info', vite:config 'vite-plugin-pwa:build', vite:config 'vite-plugin-pwa:pwa-assets', vite:config 'vite:build-import-analysis', vite:config 'vite:oxc-transpile', vite:config 'vite:terser', vite:config 'vite:manifest', vite:config 'vite:ssr-manifest', vite:config 'vite:reporter', vite:config 'builtin: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: { platform: 'browser' }, 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: 'oxc', 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 ssr: { vite:config target: 'node', vite:config optimizeDeps: { vite:config esbuildOptions: { preserveSymlinks: false }, vite:config include: [], vite:config exclude: [], vite:config needsInterop: [], vite:config rollupOptions: { resolve: { symlinks: true } }, vite:config extensions: [], vite:config holdUntilCrawlEnd: true, vite:config force: false, vite:config noDiscovery: true vite:config }, vite:config noExternal: [ 'workbox-window' ], vite:config external: [], vite:config resolve: { vite:config conditions: [ 'module', 'node', 'development|production' ], vite:config externalConditions: [ 'node' ] vite:config } 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 tsconfigPaths: false, vite:config alias: [ vite:config { vite:config find: /^\/?@Vite\/env/, vite:config replacement: '/@fs/Users/wojciech.maj/Downloads/repro/.yarn/__virtual__/rolldown-vite-virtual-0b8e2a0bcf/3/.yarn/berry/cache/rolldown-vite-npm-7.0.7-be200401d1-10c0.zip/node_modules/rolldown-vite/dist/client/env.mjs' vite:config }, vite:config { vite:config find: /^\/?@Vite\/client/, vite:config replacement: '/@fs/Users/wojciech.maj/Downloads/repro/.yarn/__virtual__/rolldown-vite-virtual-0b8e2a0bcf/3/.yarn/berry/cache/rolldown-vite-npm-7.0.7-be200401d1-10c0.zip/node_modules/rolldown-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 rollupOptions: { resolve: { symlinks: true } }, 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: { platform: 'browser' }, 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: 'oxc', 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: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-plugin-pwa', vite:config enforce: 'pre', vite:config config: [Function: config], vite:config configResolved: [AsyncFunction: configResolved], vite:config resolveId: [Function: resolveId], vite:config load: [Function: load], vite:config api: { vite:config disabled: [Getter], vite:config pwaInDevEnvironment: [Getter], vite:config webManifestData: [Function: webManifestData], vite:config registerSWData: [Function: registerSWData], vite:config generateBundle: [Function: generateBundle], vite:config generateSW: [AsyncFunction: generateSW], vite:config extendManifestEntries: [Function: extendManifestEntries], vite:config pwaAssetsGenerator: [Function: pwaAssetsGenerator] vite:config } vite:config }, vite:config { vite:config name: 'vite:modulepreload-polyfill', vite:config resolveId: { vite:config filter: { id: /^vite\/modulepreload\-polyfill$/ }, vite:config handler: [Function: handler] vite:config }, vite:config load: { vite:config filter: { id: /^vite\/modulepreload\-polyfill\.js$/ }, vite:config handler: [Function: handler] vite:config } vite:config }, vite:config { vite:config name: 'vite:resolve', vite:config resolveId: [AsyncFunction: resolveId], vite:config load: { vite:config filter: { vite:config id: [ vite:config /^__vite\-browser\-external/, vite:config /^__vite\-optional\-peer\-dep/ vite:config ] vite:config }, vite:config handler: [Function: handler] vite:config } vite:config }, vite:config { vite:config name: 'vite:html-inline-proxy', vite:config resolveId: { vite:config filter: { id: /[?&]html-proxy\b/ }, vite:config handler: [Function: handler] vite:config }, vite:config load: { vite:config filter: { id: /[?&]html-proxy\b/ }, vite:config handler: [Function: handler] vite:config } vite:config }, vite:config { vite:config name: 'vite:css', vite:config buildStart: [Function: buildStart], vite:config buildEnd: [Function: buildEnd], vite:config load: { vite:config filter: { vite:config id: /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/ vite:config }, vite:config handler: [AsyncFunction: handler] vite:config }, vite:config transform: { vite:config filter: { vite:config id: { vite:config include: /\.(css|less|sass|scss|styl|stylus|pcss|postcss|sss)(?:$|\?)/, vite:config exclude: [ vite:config /[?&]commonjs-proxy/, vite:config /[?&](?:worker|sharedworker|raw|url)\b/ vite:config ] vite:config } vite:config }, vite:config handler: [AsyncFunction: handler] vite:config } vite:config }, vite:config { vite:config name: 'vite:oxc', vite:config configureServer: [Function: configureServer], vite:config resolveId: { vite:config filter: { id: /^@oxc\-project\/runtime\// }, vite:config handler: [AsyncFunction: handler] vite:config }, vite:config transform: [AsyncFunction: transform] vite:config }, vite:config { vite:config name: 'vite:json', vite:config transform: { vite:config filter: { vite:config id: { vite:config include: /\.json(?:$|\?)(?!commonjs-(?:proxy|external))/, vite:config exclude: /[?&](?:worker|sharedworker|raw|url)\b/ vite:config }, vite:config moduleType: [ 'json' ] vite:config }, vite:config handler: [Function: handler] vite:config } vite:config }, vite:config { vite:config name: 'vite:wasm-helper', vite:config resolveId: { vite:config filter: { id: /^vite\/wasm\-helper\.js$/ }, vite:config handler: [Function: handler] vite:config }, vite:config load: { vite:config filter: { vite:config id: [ vite:config /^vite\/wasm\-helper\.js$/, vite:config /(? { vite:config dir: '/Users/wojciech.maj/Downloads/repro', vite:config data: { vite:config name: 'repro', vite:config scripts: { build: 'vite build', dev: 'vite' }, vite:config dependencies: { vite:config vite: 'npm:[email protected]', vite:config 'vite-plugin-pwa': '^1.0.1' vite:config }, vite:config packageManager: '[email protected]' 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 enableNativePlugin: false vite:config }, vite:config future: undefined, vite:config optimizeDeps: { vite:config include: [], vite:config exclude: [], vite:config needsInterop: [], vite:config rollupOptions: { resolve: { symlinks: true } }, 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: '5PYah386ng3b', 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 } +654ms rolldown-vite v7.0.7 building for production... ✓ 5 modules transformed. dist/manifest.webmanifest 0.15 kB dist/index.html 0.24 kB │ gzip: 0.20 kB dist/assets/index-voRYvffs.js 2.96 kB │ gzip: 1.40 kB :0

Error: [vite]: Rollup failed to resolve import "workbox-window" from "/@vite-plugin-pwa/virtual:pwa-register".
This is most likely unintended because it can break your application at runtime.
If you do want to externalize this module explicitly add it to
build.rollupOptions.external
at viteLog (file:///Users/wojciech.maj/Downloads/repro/.yarn/virtual/rolldown-vite-virtual-0b8e2a0bcf/3/.yarn/berry/cache/rolldown-vite-npm-7.0.7-be200401d1-10c0.zip/node_modules/rolldown-vite/dist/node/chunks/dep-DnpJBiTH.js:33465:57)
at onRollupLog (file:///Users/wojciech.maj/Downloads/repro/.yarn/virtual/rolldown-vite-virtual-0b8e2a0bcf/3/.yarn/berry/cache/rolldown-vite-npm-7.0.7-be200401d1-10c0.zip/node_modules/rolldown-vite/dist/node/chunks/dep-DnpJBiTH.js:33501:9)
at onLog (file:///Users/wojciech.maj/Downloads/repro/.yarn/virtual/rolldown-vite-virtual-0b8e2a0bcf/3/.yarn/berry/cache/rolldown-vite-npm-7.0.7-be200401d1-10c0.zip/node_modules/rolldown-vite/dist/node/chunks/dep-DnpJBiTH.js:33269:4)
at file:///Users/wojciech.maj/.yarn/berry/cache/rolldown-npm-1.0.0-beta.25-62fd694bda-10c0.zip/node_modules/rolldown/dist/shared/src-BS7SHs-K.mjs:192:26
at logger (file:///Users/wojciech.maj/.yarn/berry/cache/rolldown-npm-1.0.0-beta.25-62fd694bda-10c0.zip/node_modules/rolldown/dist/shared/src-BS7SHs-K.mjs:183:3)

Node.js v24.3.0

</details>

### Validations

- [x] Follow our [Code of Conduct](https://github.com/vitejs/rolldown-vite/blob/main/CODE_OF_CONDUCT.md)
- [x] Read the [Contributing Guidelines](https://github.com/vitejs/rolldown-vite/blob/main/CONTRIBUTING.md).
- [x] Read the [docs](https://vite.dev/guide) and the [Rolldown-related guide](https://main.vite.dev/guide/rolldown.html).
- [x] Check that there isn't [already an issue](https://github.com/vitejs/rolldown-vite/issues) that reports the same regression to avoid creating a duplicate.
- [x] Check that this is a concrete regression. For Q&A open a [GitHub Discussion](https://github.com/vitejs/rolldown-vite/discussions) or join our [Discord Chat Server](https://chat.vite.dev/).
- [x] The provided reproduction is a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) of the regression.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions