Skip to content

topLevelVar true by default - breaks dead code elimination #22363

Description

@dangreen

Describe the bug

Currently in Vite 8 rolldown's topLevelVar options is true by default.

Variables defined with var are not "inlined" during dead code elimination, which breaks dead code elimination.

Reproduction

https://repl.rolldown.rs/#eNptUcFuwjAM/RUrF4pUFQG3TjvtuvNOuaStC9lCUjUOY6r677NTxhiaVDWx/Z79/DKpXtWTsr7DS0VR7l7Vv3GpWglPQxgJJiCMBDP0YzjBqto426y0174NPgaHlQuHQiDFeq09c1HVNCacSzUG57rw6SuG9vZwN+qfysPQDnvr8SWXb8N/aHk+XjKUgSa5fN4IxaQ9QEg0JKohBwAUhlc8o3szYw2iUNJzKX/rM3AZXp2QTJVTJWw2QEeE3jqMENFhS9hB85WzTSIKHvhD0x6BTCPNmBIGsuyO9rNYwk4Mpv0wB6zeY+D1Fw/+5Jbts1KtOhyQ38K3FqNWvMDMnZZGbP6djddoITskSJHVPUNvXMSnm0V98q0IknKxFj80XZHiAwO5+yN2edIFbHsohLCGESmNHra7PbM0XcP9bitN1MwKzyLFCFvN30sw0+k=

Steps to reproduce

// lib.ts
let used = false;
export function use() {
	used = true;
}
export function test() {
	if (used) return 123;
	return 321;
}
// index.ts
import { test } from './lib'

console.log(test())

expected output (with topLevelVar: false)

function test() {
	return 321;
}
//#endregion
//#region index.ts
console.log(test());
//#endregion

actual Vite 8 output (topLevelVar: true)

//#region lib.ts
var used = false;
function test() {
	if (used) return 123;
	return 321;
}
//#endregion
//#region index.ts
console.log(test());
//#endregion

Rolldown Repl example with topLevelVar: true

Rolldown Repl example with topLevelVar: false

System Info

Rolldown Repl

Used Package Manager

npm

Logs

No response

Validations

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug: upstreamBug in a dependency of Vitep3-minor-bugAn edge case that only affects very specific usage (priority)

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions