Previously, all "bare imports" (e.g. `import './foo';`) were moved to the end of the array of sources. I presume this was done to remove needless variables in the callback signature. Unfortunately, doing this actually changes the intent of the program. Modules should be evaluated in the order that they were in the source. In the case of a bare import, it is quite possible that the bare import has side effects that a later required module should see. With the current implementation the later imported modules are evaluated before that "side effecty" module has been evaluated. Obviously, it is better to avoid these sorts of side effect ridden modules but even still you could imagine a similar issue with cycles. This change ensures that module source order is preserved in the AMD dependencies list, and avoids making needless variables as much as possible.
babel-plugin-transform-es2015-modules-commonjs
This plugin transforms ES2015 modules to CommonJS.
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
// without options
{
"plugins": ["transform-es2015-modules-commonjs"]
}
// with options
{
"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-es20150-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).