| --- | |
| title: esbuild | |
| layout: default | |
| toc: true | |
| nav: rule | |
| --- | |
| <!-- ********************* | |
| DO NOT EDIT THIS FILE | |
| It is a generated build output from Stardoc. | |
| Instead you must edit the .bzl file where the rules are declared, | |
| or possibly a markdown file next to the .bzl file | |
| ********************* --> | |
| # esbuild rules for Bazel | |
| The esbuild rules runs the [esbuild](https://github.com/evanw/esbuild) bundler tool with Bazel. | |
| esbuild is an extremely fast JavaScript bundler written in Go, its [current benchmarks](https://esbuild.github.io/faq/#benchmark-details) show it can be 320x faster that other bundlers | |
| ## Installation | |
| Add the `@bazel/esbuild` npm packages to your `devDependencies` in `package.json`. | |
| ``` | |
| npm install --save-dev @bazel/esbuild | |
| ``` | |
| or using yarn | |
| ``` | |
| yarn add -D @bazel/esbuild | |
| ``` | |
| Add an `http_archive` fetching the esbuild binary for each platform that you need to support. | |
| ```python | |
| _ESBUILD_VERSION = "0.12.1" # reminder: update SHAs below when changing this value | |
| http_archive( | |
| name = "esbuild_darwin", | |
| urls = [ | |
| "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-%s.tgz" % _ESBUILD_VERSION, | |
| ], | |
| strip_prefix = "package", | |
| build_file_content = """exports_files(["bin/esbuild"])""", | |
| sha256 = "efb34692bfa34db61139eb8e46cd6cf767a42048f41c8108267279aaf58a948f", | |
| ) | |
| http_archive( | |
| name = "esbuild_windows", | |
| urls = [ | |
| "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-%s.tgz" % _ESBUILD_VERSION, | |
| ], | |
| strip_prefix = "package", | |
| build_file_content = """exports_files(["esbuild.exe"])""", | |
| sha256 = "10439647b11c7fd1d9647fd98d022fe2188b4877d2d0b4acbe857f4e764b17a9", | |
| ) | |
| http_archive( | |
| name = "esbuild_linux", | |
| urls = [ | |
| "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-%s.tgz" % _ESBUILD_VERSION, | |
| ], | |
| strip_prefix = "package", | |
| build_file_content = """exports_files(["bin/esbuild"])""", | |
| sha256 = "de8409b90ec3c018ffd899b49ed5fc462c61b8c702ea0f9da013e0e1cd71549a", | |
| ) | |
| ``` | |
| These can then be referenced on the `tool` attribute of the `esbuild` rule. | |
| ```python | |
| esbuild( | |
| name = "bundle", | |
| ... | |
| tool = select({ | |
| "@bazel_tools//src/conditions:darwin": "@esbuild_darwin//:bin/esbuild", | |
| "@bazel_tools//src/conditions:windows": "@esbuild_windows//:esbuild.exe", | |
| "@bazel_tools//src/conditions:linux_x86_64": "@esbuild_linux//:bin/esbuild", | |
| }), | |
| ) | |
| ``` | |
| It might be useful to wrap this locally in a macro for better reuseability, see `packages/esbuild/test/tests.bzl` for an example. | |
| The `esbuild` rule can take a JS or TS dependency tree and bundle it to a single file, or split across multiple files, outputting a directory. | |
| ```python | |
| load("@npm//@bazel/esbuild:index.bzl", "esbuild") | |
| load("@npm//@bazel/typescript:index.bzl", "ts_library") | |
| ts_library( | |
| name = "lib", | |
| srcs = ["a.ts"], | |
| ) | |
| esbuild( | |
| name = "bundle", | |
| entry_point = "a.ts", | |
| deps = [":lib"], | |
| ) | |
| ``` | |
| The above will create three output files, `bundle.js`, `bundle.js.map` and `bundle_metadata.json` which contains the bundle metadata to aid in debugging and resoloution tracing. | |
| To create a code split bundle, set `splitting = True` on the `esbuild` rule. | |
| ```python | |
| load("@npm//@bazel/esbuild:index.bzl", "esbuild") | |
| load("@npm//@bazel/typescript:index.bzl", "ts_library") | |
| ts_library( | |
| name = "lib", | |
| srcs = ["a.ts"], | |
| deps = [ | |
| "@npm//foo", | |
| ], | |
| ) | |
| esbuild( | |
| name = "bundle", | |
| entry_point = "a.ts", | |
| deps = [":lib"], | |
| splitting = True, | |
| ) | |
| ``` | |
| This will create an output directory containing all the code split chunks, along with their sourcemaps files | |
| ## esbuild | |
| **USAGE** | |
| <pre> | |
| esbuild(<a href="#esbuild-name">name</a>, <a href="#esbuild-args">args</a>, <a href="#esbuild-define">define</a>, <a href="#esbuild-deps">deps</a>, <a href="#esbuild-entry_point">entry_point</a>, <a href="#esbuild-entry_points">entry_points</a>, <a href="#esbuild-external">external</a>, <a href="#esbuild-format">format</a>, <a href="#esbuild-launcher">launcher</a>, | |
| <a href="#esbuild-link_workspace_root">link_workspace_root</a>, <a href="#esbuild-max_threads">max_threads</a>, <a href="#esbuild-minify">minify</a>, <a href="#esbuild-output">output</a>, <a href="#esbuild-output_css">output_css</a>, <a href="#esbuild-output_dir">output_dir</a>, <a href="#esbuild-output_map">output_map</a>, | |
| <a href="#esbuild-platform">platform</a>, <a href="#esbuild-sourcemap">sourcemap</a>, <a href="#esbuild-sources_content">sources_content</a>, <a href="#esbuild-srcs">srcs</a>, <a href="#esbuild-target">target</a>, <a href="#esbuild-tool">tool</a>) | |
| </pre> | |
| Runs the esbuild bundler under Bazel | |
| For further information about esbuild, see https://esbuild.github.io/ | |
| **ATTRIBUTES** | |
| <h4 id="esbuild-name">name</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#name">Name</a>, mandatory*): A unique name for this target. | |
| <h4 id="esbuild-args">args</h4> | |
| (*List of strings*): A list of extra arguments that are included in the call to esbuild. | |
| $(location ...) can be used to resolve the path to a Bazel target. | |
| Defaults to `[]` | |
| <h4 id="esbuild-define">define</h4> | |
| (*List of strings*): A list of global identifier replacements. | |
| Example: | |
| ```python | |
| esbuild( | |
| name = "bundle", | |
| define = [ | |
| "process.env.NODE_ENV=\"production\"" | |
| ], | |
| ) | |
| ``` | |
| See https://esbuild.github.io/api/#define for more details | |
| Defaults to `[]` | |
| <h4 id="esbuild-deps">deps</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a>*): A list of direct dependencies that are required to build the bundle | |
| Defaults to `[]` | |
| <h4 id="esbuild-entry_point">entry_point</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#labels">Label</a>*): The bundle's entry point (e.g. your main.js or app.js or index.js) | |
| This is a shortcut for the `entry_points` attribute with a single entry. | |
| Specify either this attribute or `entry_point`, but not both. | |
| Defaults to `None` | |
| <h4 id="esbuild-entry_points">entry_points</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a>*): The bundle's entry points (e.g. your main.js or app.js or index.js) | |
| Specify either this attribute or `entry_point`, but not both. | |
| Defaults to `[]` | |
| <h4 id="esbuild-external">external</h4> | |
| (*List of strings*): A list of module names that are treated as external and not included in the resulting bundle | |
| See https://esbuild.github.io/api/#external for more details | |
| Defaults to `[]` | |
| <h4 id="esbuild-format">format</h4> | |
| (*String*): The output format of the bundle, defaults to iife when platform is browser | |
| and cjs when platform is node. If performing code splitting or multiple entry_points are specified, defaults to esm. | |
| See https://esbuild.github.io/api/#format for more details | |
| Defaults to `""` | |
| <h4 id="esbuild-launcher">launcher</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#labels">Label</a>, mandatory*): Internal use only | |
| <h4 id="esbuild-link_workspace_root">link_workspace_root</h4> | |
| (*Boolean*): Link the workspace root to the bin_dir to support absolute requires like 'my_wksp/path/to/file'. | |
| If source files need to be required then they can be copied to the bin_dir with copy_to_bin. | |
| Defaults to `False` | |
| <h4 id="esbuild-max_threads">max_threads</h4> | |
| (*Integer*): Sets the `GOMAXPROCS` variable to limit the number of threads that esbuild can run with. | |
| This can be useful if running many esbuild rule invocations in parallel, which has the potential to cause slowdown. | |
| For general use, leave this attribute unset. | |
| Defaults to `0` | |
| <h4 id="esbuild-minify">minify</h4> | |
| (*Boolean*): Minifies the bundle with the built in minification. | |
| Removes whitespace, shortens identifieres and uses equivalent but shorter syntax. | |
| Sets all --minify-* flags | |
| See https://esbuild.github.io/api/#minify for more details | |
| Defaults to `False` | |
| <h4 id="esbuild-output">output</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#labels">Label</a>*): Name of the output file when bundling | |
| <h4 id="esbuild-output_css">output_css</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#labels">Label</a>*): Declare a .css file will be output next to output bundle. | |
| If your JS code contains import statements that import .css files, esbuild will place the | |
| content in a file next to the main output file, which you'll need to declare. If your output | |
| file is named 'foo.js', you should set this to 'foo.css'. | |
| <h4 id="esbuild-output_dir">output_dir</h4> | |
| (*Boolean*): If true, esbuild produces an output directory containing all the output files from code splitting for multiple entry points | |
| See https://esbuild.github.io/api/#splitting and https://esbuild.github.io/api/#entry-points for more details | |
| Defaults to `False` | |
| <h4 id="esbuild-output_map">output_map</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#labels">Label</a>*): Name of the output source map when bundling | |
| <h4 id="esbuild-platform">platform</h4> | |
| (*String*): The platform to bundle for. | |
| See https://esbuild.github.io/api/#platform for more details | |
| Defaults to `"browser"` | |
| <h4 id="esbuild-sourcemap">sourcemap</h4> | |
| (*String*): Defines where sourcemaps are output and how they are included in the bundle. By default, a separate `.js.map` file is generated and referenced by the bundle. If 'external', a separate `.js.map` file is generated but not referenced by the bundle. If 'inline', a sourcemap is generated and its contents are inlined into the bundle (and no external sourcemap file is created). If 'both', a sourcemap is inlined and a `.js.map` file is created. | |
| See https://esbuild.github.io/api/#sourcemap for more details | |
| Defaults to `""` | |
| <h4 id="esbuild-sources_content">sources_content</h4> | |
| (*Boolean*): If False, omits the `sourcesContent` field from generated source maps | |
| See https://esbuild.github.io/api/#sources-content for more details | |
| Defaults to `False` | |
| <h4 id="esbuild-srcs">srcs</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#labels">List of labels</a>*): Source files to be made available to esbuild | |
| Defaults to `[]` | |
| <h4 id="esbuild-target">target</h4> | |
| (*String*): Environment target (e.g. es2017, chrome58, firefox57, safari11, | |
| edge16, node10, esnext). Default es2015. | |
| See https://esbuild.github.io/api/#target for more details | |
| Defaults to `"es2015"` | |
| <h4 id="esbuild-tool">tool</h4> | |
| (*<a href="https://bazel.build/docs/build-ref.html#labels">Label</a>, mandatory*): An executable for the esbuild binary | |