esbuild icon indicating copy to clipboard operation
esbuild copied to clipboard

`minify` cannot remove unused branch

Open ocavue opened this issue 10 months ago • 2 comments

Reproduction link:

https://esbuild.github.io/try/#YgAwLjI1LjIAeyAgICAKICAgIGZvcm1hdDogImVzbSIsCiAgICBtaW5pZnk6IHRydWUsCiAgICB0cmVlU2hha2luZzogdHJ1ZSwKfQBlAGVudHJ5LmpzAHZhciBmb28gPSAxOwpjb25zdCBmYWxzZV9kZWZhdWx0ID0gZmFsc2U7CgpleHBvcnQgZnVuY3Rpb24gZm4oKSB7CiAgaWYgKGZhbHNlX2RlZmF1bHQpIHsKICAgIGNvbnNvbGUud2FybigiSSBleHBlY3QgdGhpcyBzdHJpbmcgdG8gYmUgcmVtb3ZlZCIpCiAgfQoKICBjb25zb2xlLmxvZyhmb28pCn0

Expected output:

var e=1;function o(){console.log(e)}export{o as fn};

Actual output:

var o=1;const e=!1;function n(){e&&console.warn("I expect this string to be removed"),console.log(o)}export{n as fn};

For unknown reason, if I move var foo = 1; below const false_default = false;, I can get the expected output.

ocavue avatar Apr 17 '25 17:04 ocavue

As a special case, esbuild supports some limited inlining of constants if they are declared at the top of the file. It doesn't contain a more advanced symbolic evaluator though and doesn't attempt to evaluate code once non-constants are involved.

evanw avatar Apr 17 '25 20:04 evanw

Thanks for the explanation.

To provide some more context, I first found this issue when I try to import a const value from another file. Below is a simple example:

https://esbuild.github.io/try/#YgAwLjI1LjIAeyAgICAKICAgIGZvcm1hdDogImVzbSIsCiAgICBtaW5pZnk6IHRydWUsCiAgICB0cmVlU2hha2luZzogdHJ1ZSwKICAgIGJ1bmRsZTogdHJ1ZSwKfQBlAGVudHJ5LmpzAGltcG9ydCB7IGZvbyB9IGZyb20gJy4vZm9vJzsKCi8vIFRoaXMgd29ya3MgYXMgZXhwZWN0ZWQ6Ci8vIGltcG9ydCB7IGZhbHNlX2RlZmF1bHQgfSBmcm9tICcuL2ZhbHNlX2RlZmF1bHQnOwoKLy8gVGhpcyBkb2Vzbid0IHdvcms6CmltcG9ydCBmYWxzZV9kZWZhdWx0IGZyb20gJy4vZmFsc2VfZGVmYXVsdCc7CgpleHBvcnQgZnVuY3Rpb24gZm4oKSB7CiAgaWYgKGZhbHNlX2RlZmF1bHQpIHsKICAgIGNvbnNvbGUud2FybigiSSBleHBlY3QgdGhpcyBzdHJpbmcgdG8gYmUgcmVtb3ZlZCIpCiAgfQogIGNvbnNvbGUubG9nKGZvbykKfQAAZm9vLmpzAGV4cG9ydCBjb25zdCBmb28gPSAxOwAAZmFsc2VfZGVmYXVsdC5qcwBjb25zdCBmYWxzZV9kZWZhdWx0ID0gZmFsc2U7CmV4cG9ydCBkZWZhdWx0IGZhbHNlX2RlZmF1bHQ7CmV4cG9ydCB7IGZhbHNlX2RlZmF1bHQgfSA

In this example, there is not var in my source code. But maybe the Top-level var added by esbuild somehow breaks it.

ocavue avatar Apr 18 '25 10:04 ocavue