117 lines
3.3 KiB
JavaScript
117 lines
3.3 KiB
JavaScript
const HTMLWebpackPlugin = require('html-webpack-plugin');
|
|
const CopyPlugin = require('copy-webpack-plugin');
|
|
const path = require('path');
|
|
const WebpackBar = require('webpackbar');
|
|
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
|
|
|
const merge = require('webpack-merge');
|
|
|
|
// Parent package
|
|
const package = require('../../../package.json');
|
|
|
|
const deploy = package && package.deploy;
|
|
|
|
// local
|
|
const parts = require('./parts');
|
|
const commonConfig = require('./common');
|
|
const paths = require('../paths');
|
|
|
|
const createConfig = config => {
|
|
const isProduction = config.mode === 'production';
|
|
// const isDevelopment = config.mode === 'development';
|
|
|
|
return merge([
|
|
// clean in prod
|
|
isProduction && parts.clean(paths.defaultBuild, paths.baseDir),
|
|
{
|
|
mode: config.mode,
|
|
name: 'app',
|
|
// Entries configuration
|
|
entry: {
|
|
main: [paths.main],
|
|
},
|
|
// Source mapping or not
|
|
devtool: isProduction ? 'none' : 'eval-source-map',
|
|
},
|
|
// default
|
|
parts.outputPath({
|
|
publicPath: (isProduction && deploy && deploy.publicPath) || paths.publicPath,
|
|
filename: isProduction ? '[name].[contenthash].js' : undefined,
|
|
}),
|
|
parts.loadJavaScript({
|
|
prod: isProduction,
|
|
}),
|
|
parts.loadCSS({
|
|
prod: isProduction,
|
|
}),
|
|
parts.setVariables({
|
|
__BROWSER__: true,
|
|
__SSR__: false,
|
|
__TEST__: false,
|
|
// used for application with different "mode"
|
|
__PLATFORM__: config.platform || 'default',
|
|
__PROVIDER__: config.provider || 'default',
|
|
// environment targeted (dev vs staging vs prod vs beta ...)
|
|
__ENV__: config.environment || 'default',
|
|
}),
|
|
// launch dev server
|
|
!isProduction && {
|
|
devServer: {
|
|
// Enable gzip compression for everything served:
|
|
compress: true,
|
|
port: config.port || 4000,
|
|
// When using the HTML5 History API, the index.html page will likely have to be served in place of any 404 r
|
|
historyApiFallback: true,
|
|
hot: true,
|
|
allowedHosts: ['.lvh.me'],
|
|
},
|
|
},
|
|
config.analyze && {
|
|
plugins: [
|
|
// analyze dependencies sizes
|
|
new BundleAnalyzerPlugin({
|
|
analyzerPort: config.port ? config.port + 1000 : 5000,
|
|
}),
|
|
],
|
|
},
|
|
// Common plugins
|
|
{
|
|
plugins: [
|
|
new CopyPlugin({
|
|
patterns: [
|
|
{
|
|
from: path.join(paths.baseDir, config.environment === 'staging' ? 'static-staging' : 'static'),
|
|
to: path.join(paths.defaultBuild, paths.publicPath),
|
|
noErrorOnMissing: true,
|
|
},
|
|
],
|
|
}),
|
|
new HTMLWebpackPlugin({
|
|
template: paths.inAppSrc('index.html'),
|
|
}),
|
|
new WebpackBar(),
|
|
],
|
|
},
|
|
// Prod plugins
|
|
isProduction && parts.imageOptimization(),
|
|
parts.optimize(),
|
|
]);
|
|
};
|
|
|
|
// env can be given with --env.variable
|
|
// other params will be in params
|
|
module.exports = (env, params) => {
|
|
params = params || {};
|
|
const config = createConfig({
|
|
mode: params.locale ? 'development' : 'production',
|
|
port: params.port,
|
|
analyze: params.analyze,
|
|
platform: params.platform,
|
|
provider: params.provider,
|
|
environment: params.environment,
|
|
});
|
|
|
|
// mode : Possible values for mode are: none, development or production(default).
|
|
return merge(config, commonConfig);
|
|
};
|