Skip to content

fix(bundled-dev): properly disable inlineConst optimization#21865

Merged
sapphi-red merged 1 commit intovitejs:mainfrom
cal-gooo:worktree-fix-bundled-dev-void0
Mar 16, 2026
Merged

fix(bundled-dev): properly disable inlineConst optimization#21865
sapphi-red merged 1 commit intovitejs:mainfrom
cal-gooo:worktree-fix-bundled-dev-void0

Conversation

@cal-gooo
Copy link
Copy Markdown
Contributor

Summary

  • Always disable rolldown's inlineConst optimization in bundledDev mode, regardless of whether the user has configured optimization options
  • Previously, the guard if (rolldownOptions.optimization) was falsy in the default case, so inlineConst ran unchecked and incorrectly replaced JSX factory references with (void 0) in conditional expressions (&&, ?:)

Fixes #21843

Test plan

  • All 726 existing unit tests pass
  • Verify with the reproduction repo that jsxDEV is no longer replaced with (void 0) in conditional expressions

🤖 Generated with Claude Code

The `inlineConst` optimization was only disabled when
`rolldownOptions.optimization` was already set by the user. In the
default case, the guard was falsy so rolldown's buggy `inlineConst`
ran unchecked, replacing JSX factory references with `(void 0)` in
conditional expressions (`&&`, `?:`).

Fixes vitejs#21843

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
@sapphi-red sapphi-red changed the title fix: always disable inlineConst optimization for bundledDev mode fix(bundled-dev): properly disable inlineConst optimization Mar 16, 2026
@sapphi-red
Copy link
Copy Markdown
Member

refs #21235 #21794

@sapphi-red sapphi-red added the p2-edge-case Bug, but has workaround or limited in scope (priority) label Mar 16, 2026
@sapphi-red sapphi-red merged commit 6d97142 into vitejs:main Mar 16, 2026
18 checks passed
graphite-app bot pushed a commit to rolldown/rolldown that referenced this pull request Mar 27, 2026
…shaking (#8925)

## Summary

When a CJS module conditionally re-exports from multiple sources (e.g., React's `jsx-dev-runtime.js`), the linker previously only followed the first import record. This could lead to incorrect inline const values and incomplete tree-shaking.

This PR:
- Records which import records correspond to `module.exports = require(...)` during scanning, rather than relying on `import_records.first()`
- Follows all CJS re-export targets when building `resolved_exports`
- Tracks conflicting CJS exports when multiple targets provide the same name
- Skips inline const for exports with CJS conflicts, since the runtime value depends on which branch executes
- Uses the recorded import record indices to simplify the tree-shaking bailout heuristic

## Background

```js
// jsx-dev-runtime.js
if (process.env.NODE_ENV === 'production') {
  module.exports = require('./production');   // exports.jsxDEV = void 0
} else {
  module.exports = require('./development');  // exports.jsxDEV = function() {...}
}
```

Previously, `add_exports_for_export_star` used `import_records.first()` to find the re-export target. This meant only the first `require()` target's exports entered `resolved_exports` — the rest were silently dropped. This caused `jsxDEV` to be incorrectly inlined as `void 0`.

## Related issues

- vitejs/vite#21884 — the `void 0` inlining case fixed by this PR
- #8345 (comment) — related discussion on the underlying issue
- vitejs/vite#21843 — related Vite issue, worked around by vitejs/vite#21865 (disabling `inlineConst` for affected packages). This PR fixes the root cause in rolldown so we can reenable `inlineConst` in Vite. cc @sapphi-red

## Test plan

- [x] New `inline_const_cjs_reexport` - validates inline const works with multiple cjs re-exports
- [x] New `tree_shaking/cjs_reexport_conditional` — validates ESM+CJS mixed re-export (ESM first, CJS second)
- [x] `just test-rust` all green
@h-a-n-a
Copy link
Copy Markdown
Member

h-a-n-a commented Mar 27, 2026

We may reenable optimization.inlineConst = true as soon as rolldown/rolldown#8925 gets merged. cc @sapphi-red

renovate bot added a commit to andrei-picus-tink/auto-renovate that referenced this pull request Mar 31, 2026
| datasource | package | from  | to    |
| ---------- | ------- | ----- | ----- |
| npm        | vite    | 7.3.1 | 8.0.3 |


## [v8.0.3](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-803-2026-03-26-small)

##### Features

- update rolldown to 1.0.0-rc.12 ([#22024](vitejs/vite#22024)) ([84164ef](vitejs/vite@84164ef))

##### Bug Fixes

- **html:** cache unfiltered CSS list to prevent missing styles across entries ([#22017](vitejs/vite#22017)) ([5464190](vitejs/vite@5464190))
- **module-runner:** handle non-ascii characters in base64 sourcemaps ([#21985](vitejs/vite#21985)) ([77c95bf](vitejs/vite@77c95bf))
- **module-runner:** skip re-import if the runner is closed ([#22020](vitejs/vite#22020)) ([ee2c2cd](vitejs/vite@ee2c2cd))
- **optimizer:** scan is not resolving sub path import if used in a glob import ([#22018](vitejs/vite#22018)) ([ddfe20d](vitejs/vite@ddfe20d))
- **ssr:** ssrTransform incorrectly rewrites `meta` identifier inside `import.meta` when a binding named `meta` exists ([#22019](vitejs/vite#22019)) ([cff5f0c](vitejs/vite@cff5f0c))

##### Miscellaneous Chores

- **deps:** bump picomatch from 4.0.3 to 4.0.4 ([#22027](vitejs/vite#22027)) ([7e56003](vitejs/vite@7e56003))

##### Tests

- **html:** add tests for `getCssFilesForChunk` ([#22016](vitejs/vite#22016)) ([43fbbf9](vitejs/vite@43fbbf9))


## [v8.0.2](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-802-2026-03-23-small)

##### Features

- update rolldown to 1.0.0-rc.11 ([#21998](vitejs/vite#21998)) ([ff91c31](vitejs/vite@ff91c31))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#21988](vitejs/vite#21988)) ([9b7d150](vitejs/vite@9b7d150))

##### Miscellaneous Chores

- **deps:** update dependency [@vitejs/devtools](https://github.com/vitejs/devtools) to ^0.1.5 ([#21992](vitejs/vite#21992)) ([b2dd65b](vitejs/vite@b2dd65b))


## [v8.0.1](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#small-801-2026-03-19-small)

##### Features

- update rolldown to 1.0.0-rc.10 ([#21932](vitejs/vite#21932)) ([b3c067d](vitejs/vite@b3c067d))

##### Bug Fixes

- **bundled-dev:** properly disable `inlineConst` optimization ([#21865](vitejs/vite#21865)) ([6d97142](vitejs/vite@6d97142))
- **css:** lightningcss minify failed when `build.target: 'es6'` ([#21933](vitejs/vite#21933)) ([5fcce46](vitejs/vite@5fcce46))
- **deps:** update all non-major dependencies ([#21878](vitejs/vite#21878)) ([6dbbd7f](vitejs/vite@6dbbd7f))
- **dev:** always use ESM Oxc runtime ([#21829](vitejs/vite#21829)) ([d323ed7](vitejs/vite@d323ed7))
- **dev:** handle concurrent restarts in `_createServer` ([#21810](vitejs/vite#21810)) ([40bc729](vitejs/vite@40bc729))
- handle `+` symbol in package subpath exports during dep optimization ([#21886](vitejs/vite#21886)) ([86db93d](vitejs/vite@86db93d))
- improve `no-cors` request block error ([#21902](vitejs/vite#21902)) ([5ba688b](vitejs/vite@5ba688b))
- use precise regexes for transform filter to avoid backtracking ([#21800](vitejs/vite#21800)) ([dbe41bd](vitejs/vite@dbe41bd))
- **worker:** `require(json)` result should not be wrapped ([#21847](vitejs/vite#21847)) ([0672fd2](vitejs/vite@0672fd2))
- **worker:** make worker output consistent with client and SSR ([#21871](vitejs/vite#21871)) ([69454d7](vitejs/vite@69454d7))

##### Miscellaneous Chores

- add changelog rearrange script ([#21835](vitejs/vite#21835)) ([efef073](vitejs/vite@efef073))
- **deps:** bump required `@vitejs/devtools` version to 0.1+ ([#21925](vitejs/vite#21925)) ([12932f5](vitejs/vite@12932f5))
- **deps:** update rolldown-related dependencies ([#21787](vitejs/vite#21787)) ([1af1d3a](vitejs/vite@1af1d3a))
- rearrange 8.0 changelog ([8e05b61](vitejs/vite@8e05b61))
- rearrange 8.0 changelog ([#21834](vitejs/vite#21834)) ([86edeee](vitejs/vite@86edeee))


## [v8.0.0](https://github.com/vitejs/vite/blob/HEAD/packages/vite/CHANGELOG.md#800-2026-03-12)

##### Features

- update rolldown to 1.0.0-rc.9 ([#21813](vitejs/vite#21813)) ([f05be0e](vitejs/vite@f05be0e))
- warn when `vite-tsconfig-paths` plugin is detected ([#21781](vitejs/vite#21781)) ([ada493e](vitejs/vite@ada493e))

##### Bug Fixes

- **deps:** update all non-major dependencies ([#21786](vitejs/vite#21786)) ([eaa4352](vitejs/vite@eaa4352))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

p2-edge-case Bug, but has workaround or limited in scope (priority)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bundledDev: true replaces jsxDEV factory with (void 0) for JSX in conditional expressions

3 participants