deno-rollup

Next-generation ES module bundler for Deno ported from Rollup.

Current version Current test status Deno docs PRs are welcome deno-rollup issues deno-rollup stars deno-rollup forks deno-rollup license deno-rollup is maintained

deno-rollup latest /x/ version Minimum supported Deno version deno-rollup dependency count deno-rollup dependency outdatedness deno-rollup cached size


Table of Contents

Overview

Deprecation Notice: Deno will soon support a --compat flag that will allow for the running of Node modules in Deno through the Node compatibility layer.

This renders the core and CLI parts of this module obsolete, it is to be if the rollup-plugin-deno-resolver module will continue to add value as a stand-alone plugin to use with Rollup in Deno.

Future efforts will be spent bolstering the Node compatibility layer instead of keeping this module aligned with Rollup for Node. PRs welcome for bugfixes.

Rollup is a module bundler for JavaScript which compiles small pieces of code into something larger and more complex, such as a library or application.

This library extends Rollup so that it can be used in Deno - supporting core Deno features out-of-the-box such as URL imports, Typescript and JSX.

Installation

deno-rollup can be used either through a command line interface (CLI) with an optional configuration file, or else through its JavaScript API.

CLI

To install the CLI run:

deno install -f -q --allow-read --allow-write --allow-net --allow-env --unstable https://deno.land/x/drollup@2.58.0+0.20.0/rollup.ts

And follow any suggestions to update your PATH environment variable.

You can then use the CLI to bundle your modules:

# compile to an ESM
rollup main.js --format es --name "myBundle" --file bundle.js

You can also rebuild the bundle when it's source or config files change on disk using the --watch flag:

# recompile based on `rollup.config.ts` when source files change
rollup -c --watch

JavaScript API

You can import deno-rollup straight into your project to bundle your modules:

import { rollup } from "https://deno.land/x/drollup@2.58.0+0.20.0/mod.ts";

const options = {
  input: "./mod.ts",
  output: {
    dir: "./dist",
    format: "es" as const,
    sourcemap: true,
  },
};

const bundle = await rollup(options);
await bundle.write(options.output);
await bundle.close();

Or using the watch API:

import { watch } from "https://deno.land/x/drollup@2.58.0+0.20.0/mod.ts";

const options = {
  input: "./src/mod.ts",
  output: {
    dir: "./dist",
    format: "es" as const,
    sourcemap: true,
  },
  watch: {
    include: ["src/**"],
  },
};

const watcher = await watch(options);

watcher.on("event", (event) => {
  // event.code can be one of:
  //   START        — the watcher is (re)starting
  //   BUNDLE_START — building an individual bundle
  //                  * event.input will be the input options object if present
  //                  * event.outputFiles contains an array of the "file" or
  //                    "dir" option values of the generated outputs
  //   BUNDLE_END   — finished building a bundle
  //                  * event.input will be the input options object if present
  //                  * event.outputFiles contains an array of the "file" or
  //                    "dir" option values of the generated outputs
  //                  * event.duration is the build duration in milliseconds
  //                  * event.result contains the bundle object that can be
  //                    used to generate additional outputs by calling
  //                    bundle.generate or bundle.write. This is especially
  //                    important when the watch.skipWrite option is used.
  //                  You should call "event.result.close()" once you are done
  //                  generating outputs, or if you do not generate outputs.
  //                  This will allow plugins to clean up resources via the
  //                  "closeBundle" hook.
  //   END          — finished building all bundles
  //   ERROR        — encountered an error while bundling
  //                  * event.error contains the error that was thrown
});

// This will make sure that bundles are properly closed after each run
watcher.on("event", (event) => {
  if (event.code === "BUNDLE_END") {
    event.result.close();
  }
});

// stop watching
watcher.close();

Documentation

Please refer to the official Rollup Documentation.

Known deviations from Rollup:

  • Deno code support: TypeScript and URL imports supported out-of-the-box.
  • CLI does not currently support some nested "dot" flags, namely: --no-treeshake.*, --watch.* and --no-watch.*.
  • CLI does not currently support the --plugin flag.
  • Some warnings have yet to be implemented.

Where further deviations / incompatibility are found, please raise an issue.

Plugins

A suite of deno-rollup compatible plugins are available in the plugins directory.

Examples

To run the examples you have a couple of options:

Direct from repository

  1. Run the deno-rollup helloDeno example directly from the repository:

    deno run --allow-read="./" --allow-write="./dist" --allow-net="deno.land" --allow-env --unstable https://deno.land/x/drollup@2.58.0+0.20.0/examples/helloDeno/rollup.build.ts

    This will create a ./dist directory with the bundled files in your current working directory.

Clone

  1. Clone the deno-rollup repo locally:

    git clone git://github.com/cmorten/deno-rollup.git --depth 1
    cd deno-rollup
  2. Then enter the desired examples directory and run the build script:

    cd examples/helloDeno
    deno run --allow-read="./" --allow-write="./dist" --allow-net="deno.land" --allow-env --unstable ./rollup.build.ts

    This will create a ./dist directory with the bundled files in the current directory.

  3. Further details are available in each example directory.

Contributing

Contributing guide


License

deno-rollup is licensed under the MIT License.

The license for the Rollup library, which this library adapts, is available at ROLLUP_LICENSE.

Derived works other than from Rollup are attributed with their license in source.