Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automatically add the HMR plugin when hot or hotOnly is enabled #1612

Merged
merged 1 commit into from
Dec 27, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 8 additions & 0 deletions lib/utils/addEntries.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
array-bracket-spacing,
space-before-function-paren
*/
const webpack = require('webpack');
const createDomain = require('./createDomain');

function addEntries (config, options, server) {
Expand Down Expand Up @@ -48,6 +49,13 @@ function addEntries (config, options, server) {

[].concat(config).forEach((config) => {
config.entry = prependEntry(config.entry || './src');

if (options.hot || options.hotOnly) {
config.plugins = config.plugins || [];
if (!config.plugins.find(plugin => plugin.constructor === webpack.HotModuleReplacementPlugin)) {
config.plugins.push(new webpack.HotModuleReplacementPlugin());
}
}
});
}
}
Expand Down
73 changes: 73 additions & 0 deletions test/Entry.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
const path = require('path');
const assert = require('assert');

const webpack = require('webpack');

const addEntries = require('../lib/utils/addEntries');
const config = require('./fixtures/simple-config/webpack.config');

Expand Down Expand Up @@ -174,4 +176,75 @@ describe('Entry', () => {
);
assert.equal(hotClientScript, require.resolve(hotClientScript));
});

it('doesn\'t add the HMR plugin if not hot and no plugins', () => {
const webpackOptions = Object.assign({}, config);
const devServerOptions = { };

addEntries(webpackOptions, devServerOptions);

assert.equal('plugins' in webpackOptions, false);
});
it('doesn\'t add the HMR plugin if not hot and empty plugins', () => {
const webpackOptions = Object.assign({}, config, { plugins: [] });
const devServerOptions = { };

addEntries(webpackOptions, devServerOptions);

assert.deepStrictEqual(webpackOptions.plugins, []);
});
it('doesn\'t add the HMR plugin if not hot and some plugins', () => {
const existingPlugin1 = new webpack.BannerPlugin('happy birthday');
const existingPlugin2 = new webpack.DefinePlugin({ foo: 'bar' });
const webpackOptions = Object.assign({}, config, {
plugins: [existingPlugin1, existingPlugin2]
});
const devServerOptions = { };

addEntries(webpackOptions, devServerOptions);

assert.deepStrictEqual(
webpackOptions.plugins,
[existingPlugin1, existingPlugin2]
);
});
it('adds the HMR plugin if hot', () => {
const existingPlugin = new webpack.BannerPlugin('bruce');
const webpackOptions = Object.assign({}, config, {
plugins: [existingPlugin]
});
const devServerOptions = { hot: true };

addEntries(webpackOptions, devServerOptions);

assert.deepStrictEqual(
webpackOptions.plugins,
[existingPlugin, new webpack.HotModuleReplacementPlugin()]
);
});
it('adds the HMR plugin if hot-only', () => {
const webpackOptions = Object.assign({}, config);
const devServerOptions = { hotOnly: true };

addEntries(webpackOptions, devServerOptions);

assert.deepStrictEqual(
webpackOptions.plugins,
[new webpack.HotModuleReplacementPlugin()]
);
});
it('doesn\'t add the HMR plugin again if it\'s already there', () => {
const existingPlugin = new webpack.BannerPlugin('bruce');
const webpackOptions = Object.assign({}, config, {
plugins: [new webpack.HotModuleReplacementPlugin(), existingPlugin]
});
const devServerOptions = { hot: true };

addEntries(webpackOptions, devServerOptions);

assert.deepStrictEqual(
webpackOptions.plugins,
[new webpack.HotModuleReplacementPlugin(), existingPlugin]
);
});
});