ai / dual-publish

Publish JS project as dual ES modules and CommonJS package to npm
MIT License
187 stars 11 forks source link

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'

<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Sponsored by Evil Martians" width="236" height="54">

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