97 lines
2.8 KiB
JavaScript
97 lines
2.8 KiB
JavaScript
// libs
|
|
const merge = require('webpack-merge');
|
|
const webpack = require('webpack');
|
|
const path = require('path');
|
|
const CopyPlugin = require('copy-webpack-plugin');
|
|
const WebpackBar = require('webpackbar');
|
|
const ImageminPlugin = require('imagemin-webpack-plugin').default;
|
|
|
|
const ManifestPlugin = require('webpack-manifest-plugin');
|
|
// Forces webpack-dev-server program to write bundle files to the file system.
|
|
const WriteFileWebpackPlugin = require('write-file-webpack-plugin');
|
|
|
|
// 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
|
|
{
|
|
mode: config.mode,
|
|
name: 'client',
|
|
target: 'web',
|
|
// Entries configuration
|
|
entry: {
|
|
// bundle is the name used for the files!
|
|
bundle: [paths.main],
|
|
},
|
|
// Source mapping or not
|
|
devtool: isProduction ? 'none' : 'eval-source-map',
|
|
},
|
|
// default
|
|
parts.outputPath({
|
|
path: path.join(paths.clientBuild, paths.publicPath),
|
|
filename: isProduction ? '[name].[contenthash].js' : '[name].js',
|
|
}),
|
|
parts.loadJavaScript({
|
|
prod: isProduction,
|
|
}),
|
|
parts.loadCSS({
|
|
prod: isProduction,
|
|
}),
|
|
parts.setVariables({
|
|
__LOCALE__: isDevelopment,
|
|
__DEV__: config.dev || false,
|
|
__STAGING__: config.staging || false,
|
|
__BROWSER__: true,
|
|
__SSR__: true,
|
|
__TEST__: false,
|
|
}),
|
|
{
|
|
plugins: [
|
|
new CopyPlugin({
|
|
patterns: [
|
|
{
|
|
from: path.join(paths.baseDir, config.staging ? 'static-staging' : 'static'),
|
|
to: path.join(paths.clientBuild, paths.publicPath),
|
|
noErrorOnMissing: true,
|
|
},
|
|
],
|
|
}),
|
|
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
|
|
// create a manifest (needed)
|
|
new ManifestPlugin({ fileName: 'manifest.json' }),
|
|
new WebpackBar({
|
|
name: 'client',
|
|
}),
|
|
],
|
|
},
|
|
isProduction && parts.imageOptimization(),
|
|
isDevelopment && {
|
|
plugins: [
|
|
// Forces webpack-dev-server program to write bundle files to the file system. (even if dev server launched programatically)
|
|
new WriteFileWebpackPlugin(),
|
|
new webpack.NamedModulesPlugin(),
|
|
new webpack.HotModuleReplacementPlugin({
|
|
// Options...
|
|
}),
|
|
],
|
|
},
|
|
parts.optimize(),
|
|
]);
|
|
};
|
|
|
|
module.exports = env => {
|
|
const config = createConfig({
|
|
mode: env && env.prod ? 'production' : 'development',
|
|
...env,
|
|
});
|
|
// mode : Possible values for mode are: none, development or production(default).
|
|
return merge(config, commonConfig);
|
|
};
|