-
Support chunk and asset file name templates (#733, #888)
This release introduces the
--chunk-names=
and--asset-names=
flags. These flags let you customize the output paths for chunks and assets within the output directory. Each output path is a template and currently supports these placeholders:[name]
: The original name of the file. This will bechunk
for chunks and will be the original file name (without the extension) for assets.[hash]
: The content hash of the file. This is not necessarily stable across different esbuild versions but will be stable within the same esbuild version.
For example, if you want to move all chunks and assets into separate subdirectories, you could use
--chunk-names=chunks/[name]-[hash]
and--asset-names=assets/[name]-[hash]
. Note that the path template should not include the file extension since the file extension is always automatically added to the end of the path template.Additional name template features are planned in the future including a
[dir]
placeholder for the relative path from theoutbase
directory to the original input directory as well as an--entry-names=
flag, but these extra features have not been implemented yet. -
Handle
this
in class static field initializers (#885)When you use
this
in a static field initializer inside aclass
statement or expression, it references the class object itself:class Foo { static Bar = class extends this { } } assert(new Foo.Bar() instanceof Foo)
This case previously wasn't handled because doing this is a compile error in TypeScript code. However, JavaScript does allow this so esbuild needs to be able to handle this. This edge case should now work correctly with this release.
-
Do not warn about dynamic imports when
.catch()
is detected (#893)Previously esbuild avoids warning about unbundled
import()
expressions when using thetry { await import(_) }
pattern, since presumably thetry
block is there to handle the run-time failure of theimport()
expression failing. This release adds some new patterns that will also suppress the warning:import(_).catch(_)
,import(_).then(_).catch(_)
, andimport(_).then(_, _)
. -
CSS namespaces are no longer supported
CSS namespaces are a weird feature that appears to only really be useful for styling XML. And the world has moved on from XHTML to HTML5 so pretty much no one uses CSS namespaces anymore. They are also complicated to support in a bundler because CSS namespaces are file-scoped, which means:
-
Default namespaces can be different in different files, in which case some default namespaces would have to be converted to prefixed namespaces to avoid collisions.
-
Prefixed namespaces from different files can use the same name, in which case some prefixed namespaces would need to be renamed to avoid collisions.
Instead of implementing all of that for an extremely obscure feature, CSS namespaces are now just explicitly not supported. The code to handle
@namespace
has been removed from esbuild. This will likely not affect anyone, especially because bundling code using CSS namespaces with esbuild didn't even work correctly in the first place. -