ES2015 modules to CommonJS transform

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.

This plugin transforms ES2015 modules to CommonJS.

CommonJS (CJS) Modules/1.1



export default 42;


Object.defineProperty(exports, "__esModule", {
  value: true

exports.default = 42;


npm install --save-dev babel-plugin-transform-es2015-modules-commonjs



// without options
  "plugins": ["transform-es2015-modules-commonjs"]

// with options
  "plugins": [
    ["transform-es2015-modules-commonjs", {
      "allowTopLevelThis": true


babel --plugins transform-es2015-modules-commonjs script.js

Via Node API

require("babel-core").transform("code", {
  plugins: ["transform-es2015-modules-commonjs"]



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 = = 5;

Object.defineProperty(exports, "__esModule", {
  value: true

In environments that don’t support this you can enable loose mode on es6.modules and instead of using Object.defineProperty an assignment will be used instead.

var foo = = 5;
exports.__esModule = true;