rollup-plugin-es-module-interop
v2.1.0
Published
change the rollup commonjs output for external imports to check `module.__esModule`
Downloads
23
Readme
rollup-plugin-es-module-interop
change the rollup commonjs output for external imports to check module.__esModule
What?
By default, when rollup is configured to output format: 'cjs'
code, its require
calls look like this:
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var external = _interopDefault(require('external'));
That is, if the imported CommonJS module has a .default
property, external
will be equal to require('external').default
. Else, it will be equal to require('external')
.
This makes ES modules that were compiled to CommonJS and then published to npm work transparently, because they put their default exports on a .default
property.
But some CommonJS modules also use the .default
property as an actual exported value, and not as a "default export". joi
is one example.
Babel uses a different check than Rollup does; it checks for the __esModule
property, and if it exists, uses require('external').default
. Else, it will use require('external')
. The __esModule
property is added by every compiler that I know of, and CommonJS modules that have a .default
property will not be falsely detected as compiled ES modules.
This plugin swaps the Rollup version of _interopDefault
for Babel's version.
So, with this plugin you can import joi from 'joi'
and it'll work!
Install
npm install rollup-plugin-es-module-interop
Usage
// rollup.config.js
import esModuleInterop from 'rollup-plugin-es-module-interop'
export default {
plugins: [
esModuleInterop()
]
}
There are no options. rollup-plugin-es-module-interop
will replace the _interopDefault
implementation in all format: 'cjs'
outputs.