0.1.1 • Published 2 years ago

rollup-plugin-bundle-esm v0.1.1

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

rollup-plugin-bundle-esm

A Rollup plugin that only bundles your project's ESM-only dependencies and marks CommonJS-compatible ones as external.

Installation

npm install --save-dev rollup-plugin-bundle-esm

Usage

Add rollup-plugin-bundle-esm to your rollup config:

import commonjs from '@rollup/plugin-commonjs';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import { defineConfig } from 'rollup';
import bundleESM from 'rollup-plugin-bundle-esm';

export default defineConfig({
  output: {
    format: 'commonjs',
    dir: 'dist',
  },
  input: 'index.js',
  plugins: [commonjs(), nodeResolve(), bundleESM()],
});

If you want to force some packages to be bundled regardless if they're ESM or CommonJS, you can use the forceBundle option:

import commonjs from '@rollup/plugin-commonjs';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import { defineConfig } from 'rollup';
import bundleESM from 'rollup-plugin-bundle-esm';

export default defineConfig({
  output: {
    format: 'commonjs',
    dir: 'dist',
  },
  input: 'index.js',
  plugins: [
    commonjs(),
    nodeResolve(),
    bundleESM({
      forceBundle: ['minimist', 'yargs'],
    }),
  ],
});

API

forceBundle

Type: (string | RegExp)[] | string | RegExp | ((source: string, importer: string | undefined, isResolved: boolean) => boolean | null | void); (same signature as the rollup.external option) \ Required: false

Force a package to be bundled regardless of its module format.

packageJson

Type: string \ Required: false

The path to the project's package.json file.

Why?

While using ESM whenever possible is preferred, there are some situations where ESM isn't supported and you have to fall back to CommonJS (e.g. Electron). However, I would still like to use ESM dependencies whenever possible (especially for the libraries I publish). Thus, a possible solution to this problem is dual-packaging by creating a CommonJS bundle where all the ESM packages are bundled into the library itself. However, the bundling should only be done with the ESM packages in order to minimize bundle size and edge-cases with dependency bundling. Thus, I created rollup-plugin-bundle-esm to ensure that only the ESM packages get bundled and CommonJS packages get marked as external.