/**
* @description - merge development webpack configuration
* @author - huang.jian <hjj491229492@hotmail.com>
*/
/**
* @typedef {object} ServerCliConfig
*
* @property {string} bootstrap
* @property {string} publicPath
* @property {boolean} react
* @property {boolean} sourceMap
* @property {boolean} disableHot
*/
// external
const _ = require('lodash');
const IP = require('ip');
/**
* @param {object} base
* @param {ServerCliConfig} cliConfig
*/
function develop(base, cliConfig) {
const config = _.cloneDeep(base);
const { bootstrap, publicPath, react, sourceMap, disableHot } = cliConfig;
const entrance = bootstrap || './src/main.js';
const HMR = [
`webpack-dev-server/client/?http://${IP.address()}:8100`,
'webpack/hot/dev-server'
];
config.entry = disableHot ? [entrance] : [...HMR, entrance];
if (publicPath) {
config.output.publicPath = publicPath;
}
// Support react-hot-loader
if (react && !disableHot) {
config.entry = ['react-hot-loader/patch', ...config.entry];
}
if (sourceMap) {
config.devtool = 'source-map';
}
return config;
}
/**
* @description - merge webpack-dev-server configuration
*
* @param base
* @param packager
* @param {ServerCliConfig} cliConfig
*/
function server(base, packager, cliConfig) {
const config = _.cloneDeep(base);
const proxy = Reflect.get(packager, 'proxy') || [];
const { disableHot } = cliConfig;
return Object.assign(
{},
config,
{
proxy,
hot: !disableHot,
host: IP.address()
}
);
}
const OptimizePluginNames = ['UglifyJsPlugin', 'ImageminPlugin', 'CompressionPlugin', 'HtmlMinifyPlugin'];
/**
* @param {object} base
* @param {object} options
*/
function production(base, options = {}) {
const { bootstrap, publicPath, plugins, disableCompress, sourceMap } = options;
const config = _.cloneDeep(base);
const entrance = bootstrap || './src/main.js';
config.entry = [entrance];
if (publicPath) {
config.output.publicPath = publicPath;
}
if (sourceMap) {
config.devtool = 'source-map';
}
if (plugins) {
config.plugins = [
...config.plugins.slice(0, -1),
...plugins,
...config.plugins.slice(-1)
];
}
if (disableCompress) {
config.plugins = config.plugins
.filter((plugin) => !OptimizePluginNames.includes(plugin.constructor.name));
}
return config;
}
module.exports = {
develop,
server,
production
};
|