-
Using direct
eval
now pulls inmodule
andexports
Use of direct
eval
forces the file to become a CommonJS module and disables dead code elimination in the entire file. The CommonJS closure is necessary to avoid name collisions with other modules, sinceeval
means symbols in the file can no longer be renamed to avoid collisions.However, the CommonJS
module
andexports
variables that are arguments to the closure previously weren't considered to be used in this scenario, meaning they may be omitted as dead code for size reasons. This could cause code insideeval
to behave incorrectly. Now use of directeval
automatically counts as a use of bothmodule
andexports
so these variables should now always be present in this case. -
Always remove all
"use asm"
directives (#856)The asm.js subset of JavaScript has complicated validation rules that are triggered by this directive. The parser and code generator in esbuild was not designed with asm.js in mind and round-tripping asm.js code through esbuild will very likely cause it to no longer validate as asm.js. When this happens, V8 prints a warning and people don't like seeing the warning. The warning looks like this:
(node:58335) V8: example.js:3 Invalid asm.js: Unexpected token (Use `node --trace-warnings ...` to show where the warning was created)
I am deliberately not attempting to preserve the validity of asm.js code because it's a complicated legacy format and it's obsolete now that WebAssembly exists. By removing all
"use asm"
directives, the code will just become normal JavaScript and work fine without generating a warning. -
Fix a variable hoisting edge case (#857)
It is allowed to use a nested
var
hoisted declaration with the same name as a top-level function declaration. In that case the two symbols should merge and be treated as the same symbol:async function x() {} { var x; }
The parser previously allowed this for regular functions but not for async or generator functions. Now with this release, this behavior is also allowed for these special kinds of functions too.
-
Remove empty CSS rules when minifying (#851)
Empty rules with no content such as
div {}
are now removed when CSS is minified. This change was contributed by @susiwen8.