What is babel-plugin-transform-es2015-modules-commonjs?
The babel-plugin-transform-es2015-modules-commonjs npm package is a plugin for Babel that transforms ECMAScript 2015 modules to CommonJS syntax. This allows developers to write their JavaScript code using the ES2015 module syntax and then compile it down to a format that is compatible with environments that only support CommonJS modules, such as Node.js.
What are babel-plugin-transform-es2015-modules-commonjs's main functionalities?
Transform ES2015 import statements to CommonJS require
This feature allows developers to use the ES2015 import syntax and have it compiled into CommonJS require statements.
import { square } from './math';
// Transforms to:
var _math = require('./math');
var square = _math.square;
Transform ES2015 export statements to CommonJS exports
This feature enables the use of ES2015 export syntax which is then compiled into CommonJS exports.
export const square = (n) => n * n;
// Transforms to:
exports.square = (n) => n * n;
Other packages similar to babel-plugin-transform-es2015-modules-commonjs
@babel/plugin-transform-modules-commonjs
This package is the evolution of babel-plugin-transform-es2015-modules-commonjs and is maintained by the Babel team. It provides similar functionality but is updated to work with newer versions of Babel and may include additional optimizations and features.
esm
The esm package is a lightweight runtime that allows you to load ES modules in Node.js without any compilation step. It differs from babel-plugin-transform-es2015-modules-commonjs in that it doesn't transform the code but rather enables an environment where ES modules can be used natively.
babel-plugin-transform-es2015-modules-commonjs
This plugin transforms ES2015 modules to CommonJS.
Babel 6 Changes
Babel 6 changed some behavior by not doing module.exports = exports['default']
anymore in the modules transforms.
There are some caveats, but you can use babel-plugin-add-module-exports, so that updating to Babel 6 isn't a breaking change since users that don't use ES modules don't have to do require("your-module").default
.
However, it may not match how Node eventually implements ES modules natively given the the current proposal.
Example
In
export default 42;
Out
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = 42;
Installation
npm install --save-dev babel-plugin-transform-es2015-modules-commonjs
Usage
Via .babelrc
(Recommended)
.babelrc
{
"plugins": ["transform-es2015-modules-commonjs"]
}
{
"plugins": [
["transform-es2015-modules-commonjs", {
"allowTopLevelThis": true
}]
]
}
Via CLI
babel --plugins transform-es2015-modules-commonjs script.js
Via Node API
require("babel-core").transform("code", {
plugins: ["transform-es2015-modules-commonjs"]
});
Options
loose
boolean
, defaults to false
.
As per the spec, import
and export
are only allowed to be used at the top
level. When in loose mode these are allowed to be used anywhere.
And by default, when using exports with babel a non-enumerable __esModule
property
is exported.
var foo = exports.foo = 5;
Object.defineProperty(exports, "__esModule", {
value: true
});
In environments that don't support this you can enable loose mode on babel-plugin-transform-es2015-modules-commonjs
and instead of using Object.defineProperty
an assignment will be used instead.
var foo = exports.foo = 5;
exports.__esModule = true;
strict
boolean
, defaults to false
By default, when using exports with babel a non-enumerable __esModule
property
is exported. In some cases this property is used to determine if the import is the
default export or if it contains the default export.
var foo = exports.foo = 5;
Object.defineProperty(exports, "__esModule", {
value: true
});
In order to prevent the __esModule
property from being exported, you can set
the strict
option to true
.
noInterop
boolean
, defaults to false
By default, when using exports with babel a non-enumerable __esModule
property
is exported. This property is then used to determine if the import is the default
export or if it contains the default export.
"use strict";
var _foo = require("foo");
var _foo2 = _interopRequireDefault(_foo);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : { default: obj };
}
In cases where the auto-unwrapping of default
is not needed, you can set the
noInterop
option to true
to avoid the usage of the interopRequireDefault
helper (shown in inline form above).