This updates our JavaScript bundling process in Review Board to use the
new @beanbag/frontend-buildkit
Node package, bringing with it
rollup.js as a JavaScript bundler. This allows us to use modern
JavaScript module support, which can help us better organize our code
and move away from setting everything directly in the RB
namespace.
Ultimately, anything exported by our bundles will be set in the RB
namespace, but this is now controlled at bundle-time instead of being
assumed in code.
Configuration files for Babel, Rollup, ESLint, and TypeScript have been
set up to ensure we have a working build configuration. These specify
include paths, mappings of import paths to global namespaces (like
djblets/*
to Djblets
), and lint rules.
A .djblets
directory is now set up during setup.py develop
to point
to the Djblets package directory, to ensure static media paths to
Djblets are correct. It will be required to run setup.py develop
once
after this change, and any time the target Djblets has moved/changed.
Going forward, the plan is to work toward each Pipeline bundle mapping
to a single index.ts
file, which would then import and re-export
anything that should be public. This would give rollup.js full control
of all JavaScript bundling, and let Pipeline take that result and make
it compatible with the Django static media system.
In the meantime, we'll continue to have plenty of legacy JavaScript
sitting around modifying RB
directly. This is fine, and will not
conflict. We'll need to be thoughtful in migrating this code. We don't
want to just rename and add exports. Instead, for many of these, we
should think about where the modules should truly live first.
A few modules did get updated in this change, due to necessity.
rb/js/common/index.ts
was introduced to set some default exports
(Product
and EnabledFeatures
), so that we could guarantee that RB
was set to something by default during bundle. This replaces the old
window.RB = {}
line. Similarly, some nested namespaces have been
exported by other modules (for, e.g., RB.Admin
).