-
Fix an incorrect minification transformation (#1121)
This release removes an incorrect substitution rule in esbuild's peephole optimizer, which is run when minification is enabled. The incorrect rule transformed
if(a && falsy)
intoif(a, falsy)
which is equivalent iffalsy
has no side effects (such as the literalfalse
). However, the rule didn't check that the expression is side-effect free first which could result in miscompiled code. I have removed the rule instead of modifying it to check for the lack of side effects first because while the code is slightly smaller, it may also be more expensive at run-time which is undesirable. The size savings are also very insignificant. -
Change how
NODE_PATH
works to match node (#1117)Node searches for packages in nearby
node_modules
directories, but it also allows you to inject extra directories to search for packages in using theNODE_PATH
environment variable. This is supported when using esbuild's CLI as well as via thenodePaths
option when using esbuild's API.Node's module resolution algorithm is well-documented, and esbuild's path resolution is designed to follow it. The full algorithm is here: https://nodejs.org/api/modules.html#modules_all_together. However, it appears that the documented algorithm is incorrect with regard to
NODE_PATH
. The documentation saysNODE_PATH
directories should take precedence overnode_modules
directories, and so that's how esbuild worked. However, in practice node actually does it the other way around.Starting with this release, esbuild will now allow
node_modules
directories to take precedence overNODE_PATH
directories. This is a deviation from the published algorithm. -
Provide a better error message for incorrectly-quoted JSX attributes (#959, #1115)
People sometimes try to use the output of
JSON.stringify()
as a JSX attribute when automatically-generating JSX code. Doing so is incorrect because JSX strings work like XML instead of like JS (since JSX is XML-in-JS). Specifically, using a backslash before a quote does not cause it to be escaped:// JSX ends the "content" attribute here and sets "content" to 'some so-called \\' // v let button = <Button content="some so-called \"button text\"" /> // ^ // There is no "=" after the JSX attribute "text", so we expect a ">"
It's not just esbuild; Babel and TypeScript also treat this as a syntax error. All of these JSX parsers are just following the JSX specification. This has come up twice now so it could be worth having a dedicated error message. Previously esbuild had a generic syntax error like this:
> example.jsx:1:58: error: Expected ">" but found "\\" 1 │ let button = <Button content="some so-called \"button text\"" /> ╵ ^
Now esbuild will provide more information if it detects this case:
> example.jsx:1:58: error: Unexpected backslash in JSX element 1 │ let button = <Button content="some so-called \"button text\"" /> ╵ ^ example.jsx:1:45: note: Quoted JSX attributes use XML-style escapes instead of JavaScript-style escapes 1 │ let button = <Button content="some so-called \"button text\"" /> │ ~~ ╵ " example.jsx:1:29: note: Consider using a JavaScript string inside {...} instead of a quoted JSX attribute 1 │ let button = <Button content="some so-called \"button text\"" /> │ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ╵ {"some so-called \"button text\""}