Skip to content

Tree-shaking removes default import binding but keeps property accesses, causing ReferenceError #10099

Description

@BenightedJester

Describe the bug

When building a project that imports element-plus, Rolldown's tree-shaking incorrectly removes the import defaults_default from "./defaults.mjs" statement but keeps the code that references defaults_default, causing a ReferenceError: defaults_default is not defined at runtime.

Reproduction

Minimal source pattern that triggers the bug:

Module defaults.mjs:

var defaults_default = makeInstaller([...components]);
export { defaults_default as default };

Module index.mjs (element-plus/es/index.mjs):

import defaults_default from "./defaults.mjs";
const install = defaults_default.install;
const version = defaults_default.version;
var element_plus_default = defaults_default;
export { /* ... many named exports ... */ install, version, element_plus_default as default };

When a consumer imports only a named export (e.g. import { ElNotification } from 'element-plus'), Rolldown tree-shakes the module and produces output like:

// defaults_default is NOT defined/imported anywhere in the output
defaults_default.install, defaults_default.version;  // ← ReferenceError!

The import binding and the variable assignment (var element_plus_default = defaults_default) are removed, but the property access expressions (defaults_default.install, defaults_default.version) are retained as dead side-effects.

System Info

Rolldown: 1.1.3 (via Vite 8.0.16)
Node: v22.21.0
OS: Windows 11

Used Package Manager

pnpm

Metadata

Metadata

Type

No type

Fields

Priority

None yet

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions