-
Notifications
You must be signed in to change notification settings - Fork 2
Home
Using babel-loader
without babel-plugin-external-helpers
in Webpack
// webpack.config.js
module.exports = {
entry: './main.js',
module: {
rules: [{
test: /\.js$/i,
loader: 'babel-loader?presets[]=env',
}],
}
};
results in a bundle in which almost every module has additional helper functions defined:
// ...
var _navigation2 = _interopRequireDefault(_navigation);
// "babel-loader" defines some helper functions inside every module
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
// ...
Which seems kind of excessive in case of many modules in the project.
Use babel-plugin-external-helpers
with babel-loader
:
// webpack.config.js
module.exports = {
entry: './main.js',
module: {
rules: [{
test: /\.js$/i,
loader: 'babel-loader?presets[]=env&plugins[]=babel-plugin-external-helpers',
}],
}
};
In this case babel-loader
doesn't create any helper functions inside modules, it just uses methods of babelHelpers
object:
var _navigation2 = babelHelpers.interopRequireDefault(_navigation);
babelHelpers.classCallCheck(this, SomeClass);
Not so fast. Using babel-plugin-external-helpers
just makes babel-loader
use babelHelpers
methods inside modules, it doesn't define it. Running the bundle will raise ReferenceError
if no code defined babelHelpers
object earlier. This could be fixed by creating babel-helpers.js
file (babel-cli
npm package should be installed) and using it in Webpack configuration.
./node_modules/.bin/babel-external-helpers [options] > babel-helpers.js
// webpack.config.js
module.exports = {
entry: ['./babel-helpers.js', './main.js'],
module: {
rules: [{
test: /\.js$/i,
loader: 'babel-loader?presets[]=env&plugins[]=babel-plugin-external-helpers',
}],
}
};
Use webpack-babel-external-helpers-2
plugin! It modifies Webpack configuration after Webpack processed all arguments and loaded all configuration files. The plugin processes all rules in module.rules
and configures babel-loader
to use babel-plugin-external-helpers
, also it injects module containing definition of babelHelpers
object with all its methods (or methods specified in whitelist
option) to the resulting bundle.
// webpack.config.js
const WebpackBabelExternalsPlugin = require('webpack-babel-external-helpers-2');
module.exports = {
entry: './main.js',
module: {
rules: [{
test: /\.js$/i,
loader: 'babel-loader?presets[]=env',
}],
},
plugins: [
new WebpackBabelExternalsPlugin(/* plugin options object */),
],
};