Home

Awesome

Dual Publish

Publish JS project as dual ES modules and CommonJS package to npm.

You write CommonJS in your npm library sources:

// index.js
module.exports = { lib }

npx dual-publish compiles your library during publishing to npm:

// index.js
export { lib }

// index.cjs
module.exports = { lib }

// package.json
{
  …
  "type": "module",
  "module": "index.js",
  "main": "index.cjs",
  "exports": {
    "require": "./index.cjs",
    "import": "./index.js"
  }
}

Now your library can be imported natively as ESM or CommonJS:

// CommonJS
let { lib } = require('lib')

// ESM in Node.js, webpack, Parcel, and Rollup
import { lib } from 'lib'

// ESM in browser
import { lib } from 'https://cdn.jsdelivr.net/npm/lib/index.js'
<a href="https://evilmartians.com/?utm_source=dual-publish"> <img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54"> </a>

Limits

Usage

  1. Take a normal CommonJS project with require() and module.exports =.

  2. Because of bug in webpack we recommend to use only named exports:

    const NAME = 'a'
    function change {
      …
    }
    
    module.exports = { NAME, change }
    
  3. Move all files into separated dirs. Rename lib.js to lib/index.js. Old require('./lib') will work.

  4. Add dual-publish to the project:

    npm i --save-dev dual-publish
    
  5. Test the result by calling npx dual-publish --check. It will create a folder in your project with converted files. Review them manually.

  6. Publish your project with npx dual-publish instead of npm publish.

    npx dual-publish