A minimal, promise-based implementation to require asynchronous module definitions (AMD). This implementation is about 50 lines of code and supports a strict subset of AMD. It is designed to work with browser-targeting libraries that implement one of the recommended UMD patterns. The constraints of this implementation are:
-
The
define
method must be called synchronously by the library on load. -
Only anonymous module definitions are allowed; no named modules.
-
Only the built-in
exports
dependency is allowed; norequire
ormodule
as in CommonJS.
By default, d3.require loads modules from unpkg; the module name can be any package (or scoped package) name optionally followed by the at sign (@) and a semver range. For example, d3.require("d3@4")
loads the highest version of D3 4.x. You can change this behavior using d3.requireFrom.
If you use NPM, npm install d3-require
. Otherwise, download the latest release. You can also load directly from unpkg.com. AMD, CommonJS, and vanilla environments are supported. In vanilla, d3
and define
globals are exported:
<script src="https://unpkg.com/d3-require@0"></script>
<script>
d3.require("d3-array").then(d3 => {
console.log(d3.range(100));
});
</script>
To load a module:
d3.require("d3-array").then(d3 => {
console.log(d3.range(100));
});
To load two modules and merge them into a single object:
d3.require("d3-array", "d3-color").then(d3 => {
console.log(d3.range(360).map(h => d3.hsl(h, 1, 0.5)));
});
To load a module within a version range:
d3.require("d3-array@1").then(d3 => {
console.log(d3.range(100));
});
Returns a new require function which loads modules from the specified source, which is a function that takes a module name and returns the corresponding URL. For example, the default implementation works something like this:
var requireUnpkg = d3.requireFrom(name => `https://unpkg.com/${name}`);
requireUnpkg("d3-array").then(d3 => {
console.log(d3.range(100));
});