blob: 4c25ce98ef2e3ba3a341456b87af277ca714072d [file] [view]
# Bazel rules for js
**EXPERIMENTAL** this code is currently pre-release and not subject to any stability guarantee.
It could be archived or there could be major breaking changes.
Our goal is to eventually have rough feature parity with rules_nodejs "builtin", but probably not until mid 2022 at the earliest.
This ruleset is a high-performance alternative to rules_nodejs.
The primary difference is that we don't run `npm install` or `yarn install`, instead
we use a Bazel-idiomatic approach to managing the third-party dependencies.
Features include:
- Only downloads packages from npm which are needed for the requested targets to be built/tested. (https://github.com/bazelbuild/rules_nodejs/issues/2121)
- Bazel downloader caches the npm package files,
so no fetches are required when the repository rule is cache-busted.
- Always represents npm packages as directories (TreeArtifact's in Bazel terminology) so there are few inputs to Bazel actions,
making I/O operations much faster for setting up execroot/runfiles trees.
- Uses the new "core" rules_nodejs which only downloads node.js for the requested platform and allows multiple versions.
See the [design doc](https://hackmd.io/gu2Nj0TKS068LKAf8KanuA)
In addition, as a clean rewrite many of the bugs in rules_nodejs are naturally resolved:
- Drop four years of accumulated complexity.
- No Bash dependency on Windows, (https://github.com/bazelbuild/rules_nodejs/issues/1102)
- nodejs_binary can be used as the `tool` in a genrule (https://github.com/bazelbuild/rules_nodejs/issues/1553, https://github.com/bazelbuild/rules_nodejs/issues/2600)
- Repository layout matches the distribution so you can trivially patch or point to sources.
- We use gazelle to generate bzl_library targets so users can always generate documentation
for rules that reference these. (https://github.com/bazelbuild/rules_nodejs/issues/2874)
## Installation
Include this in your WORKSPACE file:
```starlark
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "aspect_rules_js",
url = "https://github.com/aspect-dev/rules_js/releases/download/0.0.0/rules_js-0.0.0.tar.gz",
sha256 = "",
)
load("@aspect_rules_js//js:repositories.bzl", "js_rules_dependencies")
# This fetches the aspect_rules_js dependencies, which are:
# - bazel_skylib
# - rules_nodejs
# If you want to have a different version of some dependency,
# you should fetch it *before* calling this.
# Alternatively, you can skip calling this function, so long as you've
# already fetched these dependencies.
rules_js_dependencies()
```
> note, in the above, replace the version and sha256 with the one indicated
> in the release notes for aspect_rules_js
> In the future, our release automation should take care of this.
## Usage
See the API documentation in the </docs> folder and the example usage in the </test> folder.