Skip to content

Instantly share code, notes, and snippets.

@Rich-Harris
Last active January 25, 2023 19:03
Show Gist options
  • Save Rich-Harris/d472c50732dab03efeb37472b08a3f32 to your computer and use it in GitHub Desktop.
Save Rich-Harris/d472c50732dab03efeb37472b08a3f32 to your computer and use it in GitHub Desktop.
Unifying Rollup options

Rollup 0.48 introduces a few changes to the options object, because the current options are confusingly different between the CLI and the options exported by your config file.

Changes to the config file

  • entry is now input
  • sourceMap and sourceMapFile are now sourcemap and sourcemapFile (note casing)
  • moduleName is now name
  • useStrict is now strict

The dest and format options are now grouped together as a single output: { file, format, ... } object. output can also be an array of { file, format, ... } objects, in which case it behaves similarly to the current targets. Other output options — exports, paths and so on — can be added to the output object (though they will fall back to their top-level namesakes, if unspecified).

So this...

// old rollup.config.js
export default {
  entry: 'src/main.js',
  dest: 'public/bundle.js',
  format: 'iife',
  moduleName: 'App',
  sourceMap: true
};

...would become this:

// new rollup.config.js
export default {
  input: 'src/main.js',
  output: {
    file: 'public/bundle.js',
    format: 'iife',
    name: 'App',
    sourcemap: true
  }
};

A config with multiple outputs (say, a CommonJS main and a ESM module output) might look like this:

import pkg from './package.json';

export default {
  input: 'src/index.js',
  output: [
    { file: pkg.main, format: 'umd', name: 'MyLibrary' },
    { file: pkg.module, format: 'es' }
  ],
  
  // other output options specified here will be shared by
  // all outputs, unless overridden
  sourcemap: true
};

Changes to the API

The same changes apply if you're using the API directly:

rollup.rollup({
  input: 'src/main.js'
}).then(bundle => {
  return bundle.write({
    file: 'public/bundle.js',
    format: 'iife',
    name: 'App',
    sourcemap: true
  });
});

Changes to the CLI

The --output and --format can now also be specified as --output.file and --output.format respectively. The shorthand -o and -f options are unchanged.

@ndraiman
Copy link

ndraiman commented Nov 26, 2018

@mAAdhaTTah
At the moment it seems inside every item in the output array, for example:

export default {
  output: [
    { file: pkg.main, format: 'umd', globals: {} }, 
    { file: pkg.module, format: 'es' , globals: {}}
  ],
  ...
}

To avoid duplicate code I do it as follows:

const globals = { };
const output = [
    { file: pkg.main, format: 'umd' }, 
    { file: pkg.module, format: 'es' }
  ].map(out => ({ ...out, globals}));

export default {
  output,
  ...
}

@aelbore
Copy link

aelbore commented Jan 26, 2019

@mAAdhaTTah
At the moment it seems inside every item in the output array, for example:

export default {
  output: [
    { file: pkg.main, format: 'umd', globals: {} }, 
    { file: pkg.module, format: 'es' , globals: {}}
  ],
  ...
}

To avoid duplicate code I do it as follows:

const globals = { };
const output = [
    { file: pkg.main, format: 'umd' }, 
    { file: pkg.module, format: 'es' }
  ].map(out => ({ ...out, globals}));

export default {
  output,
  ...
}

how do i pass output array to bundle.generate or bundle.write?

@lukastaegert
Copy link

@aelbore Arrays are only supported for the CLI. The CLI then maps the array to separate calls to bundle.write. If you use the JS API, you have to do it yourself, i.e. call bundle.generate or bundle.write once per output.

@javadbat
Copy link

@lukastaegert how you combine bundle.write with watch?

@lukastaegert
Copy link

watch accepts basically config files, i.e. arrays of configs etc.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment