-
Add more information about skipping
"main"
inpackage.json
(#1754)Configuring
mainFields: []
breaks most npm packages since it tells esbuild to ignore the"main"
field inpackage.json
, which most npm packages use to specify their entry point. This is not a bug with esbuild because esbuild is just doing what it was told to do. However, people may do this without understanding how npm packages work, and then be confused about why it doesn't work. This release now includes additional information in the error message:> foo.js:1:27: error: Could not resolve "events" (use "--platform=node" when building for node) 1 │ var EventEmitter = require('events') ╵ ~~~~~~~~ node_modules/events/package.json:20:2: note: The "main" field was ignored because the list of main fields to use is currently set to [] 20 │ "main": "./events.js", ╵ ~~~~~~
-
Fix a tree-shaking bug with
var exports
(#1739)This release fixes a bug where a variable named
var exports = {}
was incorrectly removed by tree-shaking (i.e. dead code elimination). Theexports
variable is a special variable in CommonJS modules that is automatically provided by the CommonJS runtime. CommonJS modules are transformed into something like this before being run:function(exports, module, require) { var exports = {} }
So using
var exports = {}
should have the same effect asexports = {}
because the variableexports
should already be defined. However, esbuild was incorrectly overwriting the definition of theexports
variable with the one provided by CommonJS. This release merges the definitions together so both are included, which fixes the bug. -
Merge adjacent CSS selector rules with duplicate content (#1755)
With this release, esbuild will now merge adjacent selectors when minifying if they have the same content:
/* Original code */ a { color: red } b { color: red } /* Old output (with --minify) */ a{color:red}b{color:red} /* New output (with --minify) */ a,b{color:red}
-
Shorten
top
,right
,bottom
,left
CSS property intoinset
when it is supported (#1758)This release enables collapsing of
inset
related properties:/* Original code */ div { top: 0; right: 0; bottom: 0; left: 0; } /* Output with "--minify-syntax" */ div { inset: 0; }
This minification rule is only enabled when
inset
property is supported by the target environment. Make sure to set esbuild'starget
setting correctly when minifying if the code will be running in an older environment (e.g. earlier than Chrome 87).This feature was contributed by @sapphi-red.