I’ve been working on a way to make it easier to push content into my static site
and it’s been a fun little exercise that I will share more in another post. In
this post I want to share the rollup config that I used to import nearly any
npm module in to a frontend project using JavaScript modules.
I needed a quick way import a simple module get-urls into my project. The
module is well tested and it does what I needed … ignore the fact that it’s
pretty easy to implement in a couple of lines of JavaScript. The problem I had
is that my project is built in ES6, uses modules and I didn’t want to have to
bundle up using CommonJS (require).
I couldn’t find a lot of guidance on what to do here, so I went to experiement and this solution is the solution I came across:
- Create a file that imports the npm module I needed. 
module.exports = require('get-urls');This module will be what’s converted to ES6 style. - Create a rollup config that
- Imports the node globals, and builtins.
 - Resolves all npm modules required for my usage of this module.
 - Pass the results through the 
commonjsplugin so that it’s now in JavaScript module format. - Compress the output, because it’s huge :
 
 - Include the bundled file in your project and rejoice.
 
import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import builtins from 'rollup-plugin-node-builtins';
import globals from 'rollup-plugin-node-globals';
import closure from 'rollup-plugin-closure-compiler-js';
export default {
  input: 'static/javascripts/get-urls.js',
  output: {
      file: 'static/javascripts/get-urls.bundle.mjs',
      format: 'es',
      browser: true
    },
  plugins: [
    globals(),
    builtins(),
    resolve({
      preferBuiltins: false,
      browser: true,
      // pass custom options to the resolve plugin
      customResolveOptions: {
        moduleDirectory: 'node_modules'
      }
    }),
    commonjs(),
    closure({
      compilationLevel: 'WHITESPACE',
      languageIn: 'ES6',
      languageOut: 'ES6'
    })
  ]
};
I think there are probably better ways than this, the output for what is a relatively simple function is huge (70kb), but it now means that I can use modules from npm directly in my page.
<script type="module">
    import getUrls from '/javascripts/get-urls.bundle.mjs';
    ...Neat…

  



