-
Auto-define
process.env.NODE_ENV
when platform is set tobrowser
All code in the React world has the requirement that the specific expression
process.env.NODE_ENV
must be replaced with a string at compile-time or your code will immediately crash at run-time. This is a common stumbling point for people when they start using esbuild with React. Previously bundling code with esbuild containingprocess.env.NODE_ENV
without defining a string replacement first was a warning that warned you about the lack of a define.With this release esbuild will now attempt to define
process.env.NODE_ENV
automatically instead of warning about it. This will be implicitly defined to"production"
if minification is enabled and"development"
otherwise. This automatic behavior only happens when the platform isbrowser
, sinceprocess
is not a valid browser API and will never exist in the browser. This is also only done if there are no existing defines forprocess
,process.env
, orprocess.env.NODE_ENV
so you can override the automatic value if necessary. If you need to disable this behavior, you can use theneutral
platform instead of thebrowser
platform. -
Retain side-effect free intermediate re-exporting files (#1088)
This fixes a subtle bug with esbuild's support for Webpack's
"sideEffects": false
annotation inpackage.json
when combined with re-export statements. A re-export is when you import something from one file and then export it again. You can re-export something withexport * from
orexport {foo} from
orimport {foo} from
followed byexport {foo}
.The bug was that files which only contain re-exports and that are marked as being side-effect free were not being included in the bundle if you import one of the re-exported symbols. This is because esbuild's implementation of re-export linking caused the original importing file to "short circuit" the re-export and just import straight from the file containing the final symbol, skipping the file containing the re-export entirely.
This was normally not observable since the intermediate file consisted entirely of re-exports, which have no side effects. However, a recent change to allow ESM files to be lazily-initialized relies on all intermediate files being included in the bundle to trigger the initialization of the lazy evaluation wrappers. So the behavior of skipping over re-export files is now causing the imported symbols to not be initialized if the re-exported file is marked as lazily-evaluated.
The fix is to track all re-exports in the import chain from the original file to the file containing the final symbol and then retain all of those statements if the import ends up being used.
-
Add a very verbose
debug
log levelThis log level is an experiment. Enabling it logs a lot of information (currently only about path resolution). The idea is that if you are having an obscure issue, the debug log level might contain some useful information. Unlike normal logs which are meant to mainly provide actionable information, these debug logs are intentionally mostly noise and are designed to be searched through instead.
Here is an example of debug-level log output:
> debug: Resolving import "react" in directory "src" of type "import-statement" note: Read 26 entries for directory "src" note: Searching for "react" in "node_modules" directories starting from "src" note: Attempting to load "src/react" as a file note: Failed to find file "src/react" note: Failed to find file "src/react.tsx" note: Failed to find file "src/react.ts" note: Failed to find file "src/react.js" note: Failed to find file "src/react.css" note: Failed to find file "src/react.svg" note: Attempting to load "src/react" as a directory note: Failed to read directory "src/react" note: Parsed package name "react" and package subpath "." note: Checking for a package in the directory "node_modules/react" note: Read 7 entries for directory "node_modules/react" note: Read 393 entries for directory "node_modules" note: Attempting to load "node_modules/react" as a file note: Failed to find file "node_modules/react" note: Failed to find file "node_modules/react.tsx" note: Failed to find file "node_modules/react.ts" note: Failed to find file "node_modules/react.js" note: Failed to find file "node_modules/react.css" note: Failed to find file "node_modules/react.svg" note: Attempting to load "node_modules/react" as a directory note: Read 7 entries for directory "node_modules/react" note: Resolved to "node_modules/react/index.js" using the "main" field in "node_modules/react/package.json" note: Read 7 entries for directory "node_modules/react" note: Read 7 entries for directory "node_modules/react" note: Primary path is "node_modules/react/index.js" in namespace "file"