common.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. const TerserPlugin = require('terser-webpack-plugin');
  2. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  3. const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
  4. const { isProd, styleRule, resolve, DIST } = require('../util');
  5. module.exports = options => config => {
  6. const { style } = options;
  7. const defaultStyleOptions = {
  8. loaders: ['postcss-loader'],
  9. };
  10. config.mode = isProd ? 'production' : 'development';
  11. if (!isProd) config.devtool = 'inline-source-map';
  12. config.output = {
  13. path: resolve(DIST),
  14. publicPath: '/',
  15. filename: '[name].js',
  16. ...config.output,
  17. };
  18. config.resolve = {
  19. // Tell webpack to look for peer dependencies in `node_modules`
  20. // when packages are linked from outside directories
  21. modules: [resolve('node_modules')],
  22. extensions: ['.js'],
  23. ...config.resolve,
  24. },
  25. config.module = {
  26. ...config.module,
  27. };
  28. config.module.rules = [
  29. ...config.module.rules || [],
  30. {
  31. test: /\.js$/,
  32. use: 'babel-loader',
  33. include: [resolve('src'), resolve('test')],
  34. },
  35. // CSS modules: src/**/*.module.css
  36. styleRule({
  37. ...defaultStyleOptions,
  38. ...style,
  39. modules: true,
  40. }, {
  41. test: /\.module\.css$/,
  42. exclude: [resolve('node_modules')],
  43. }),
  44. // normal CSS files: src/**/*.css
  45. styleRule({ ...defaultStyleOptions, ...style }, {
  46. exclude: [
  47. /\.module\.css$/,
  48. resolve('node_modules'),
  49. ],
  50. }),
  51. // library CSS files: node_modules/**/*.css
  52. styleRule(style, {
  53. include: [resolve('node_modules')],
  54. }),
  55. ];
  56. config.optimization = {
  57. ...config.optimization,
  58. };
  59. config.optimization.minimizer = (config.optimization.minimizer || [
  60. isProd && new TerserPlugin({
  61. cache: true,
  62. parallel: true,
  63. sourceMap: true // set to true if you want JS source maps
  64. }),
  65. isProd && new OptimizeCSSAssetsPlugin(),
  66. ]).filter(Boolean);
  67. config.plugins = [
  68. ...config.plugins || [],
  69. isProd && new MiniCssExtractPlugin(),
  70. ].filter(Boolean);
  71. };