/* eslint-disable import/no-extraneous-dependencies */ const { HotModuleReplacementPlugin } = require('webpack'); const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer'); const HardSourceWebpackPlugin = require('hard-source-webpack-plugin'); const commonPaths = require('./paths'); module.exports = { devtool: 'cheap-eval-source-map', output: { filename: '[name].js', path: commonPaths.outputPath, chunkFilename: '[name].js', }, module: { rules: [ { test: /\.(js|jsx)$/, // allows both .jsx and .js exclude: /node_modules/, include: commonPaths.source, loader: 'babel-loader', options: { cacheDirectory: true, plugins: ['react-hot-loader/babel'], }, }, { test: /\.(sa|sc|c)ss$/, use: [{ loader: 'style-loader', }, { loader: 'css-loader', options: { modules: false, }, }, { loader: 'sass-loader', }, ], }, ], }, devServer: { contentBase: commonPaths.outputPath, compress: true, hot: true, port: 3001, }, plugins: [ new HotModuleReplacementPlugin(), new HardSourceWebpackPlugin({ // Either an absolute path or relative to webpack's options.context. cacheDirectory: commonPaths.cachePath, // Either a string of object hash function given a webpack config. // node-object-hash on npm can be used to build this. configHash: (webpackConfig) => require('node-object-hash')({ // eslint-disable-line sort: false, }).hash(webpackConfig), // Either false, a string, an object, or a project hashing function. environmentHash: { root: process.cwd(), directories: [], files: [ // Cache will get an unique hash based on those files // if either of them changes, new cache must be generated 'package-lock.json', '.babelrc.js', ], }, info: { mode: 'none', level: 'debug', }, // Clean up large, old caches automatically. cachePrune: { // Caches younger than `maxAge` are not considered for deletion. // They must be at least this old in milliseconds. maxAge: 3 * 60 * 60 * 1000, // 3 hours // All caches together must be larger than `sizeThreshold` before any // caches will be deleted. // Together they must be at least this big in bytes. sizeThreshold: 50 * 1024 * 1024, // 50 MB }, }), new BundleAnalyzerPlugin({ analyzerPort: 8888, openAnalyzer: false, }), ], };