const path = require('path'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); const TerserWebpackPlugin = require('terser-webpack-plugin'); const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const CopyPlugin = require('copy-webpack-plugin'); module.exports = function (_env, argv) { const isProduction = argv.mode === 'production'; const isDevelopment = !isProduction; return { devtool: isDevelopment && 'cheap-module-source-map', entry: './src/index.js', output: { path: path.resolve(__dirname, './static/frontend/'), //filename: "assets/js/[name].[contenthash:8].js", filename: '[name].js', publicPath: '/' }, module: { rules: [ { test: /\.js$|\.jsx?$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { cacheDirectory: true, cacheCompression: false, envName: isProduction ? 'production' : 'development' } } }, { test: /\.css|\.s[ac]ss$/i, use: [ // Creates `style` nodes from JS strings 'style-loader', // Translates CSS into CommonJS 'css-loader', // Compiles Sass to CSS 'sass-loader' ] }, { test: /\.(png|jpg|gif)$/i, use: { loader: 'url-loader', options: { limit: 8192, name: 'static/media/[name].[hash:8].[ext]' } } }, { test: /\.svg$/, use: ['@svgr/webpack'] }, { test: /\.(eot|otf|ttf|woff|woff2)$/, loader: require.resolve('file-loader'), options: { name: 'static/media/[name].[hash:8].[ext]' } } ] }, resolve: { extensions: ['.js', '.jsx'] }, plugins: [ new webpack.DefinePlugin({ /* URL de base de l'API des données */ DATA_SERVER_BASE_URL: JSON.stringify('/api') }), new CopyPlugin({ patterns: [ { from: './src/assets', to: 'assets' } ] }), new CopyPlugin({ patterns: [ { from: './public/tinymce', to: 'tinymce' } ] }), /* isProduction && new MiniCssExtractPlugin({ filename: 'assets/css/[name].[contenthash:8].css', chunkFilename: 'assets/css/[name].[contenthash:8].chunk.css', }), */ new HtmlWebpackPlugin({ template: path.resolve(__dirname, 'public/index.html'), inject: true }), new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify(isProduction ? 'production' : 'development') }) ].filter(Boolean), optimization: { minimize: isProduction, minimizer: [ new TerserWebpackPlugin({ terserOptions: { compress: { comparisons: false }, mangle: { safari10: true }, output: { comments: false, ascii_only: true }, warnings: false } }), new OptimizeCssAssetsPlugin() ] /*splitChunks: { chunks: 'all', minSize: 0, maxInitialRequests: 10, maxAsyncRequests: 10, cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, name(module, chunks, cacheGroupKey) { const packageName = module.context.match( /[\\/]node_modules[\\/](.*?)([\\/]|$)/, )[1]; return `${cacheGroupKey}.${packageName.replace('@', '')}`; }, }, common: { minChunks: 2, priority: -10, }, }, },*/ }, devServer: { proxy: { '/api':'http://localhost:8000', '/admin':'http://localhost:8000', '/staticfiles':'http://localhost:8000', '/accounts':'http://localhost:8000' }, compress: true, historyApiFallback: true, open: true, overlay: true } }; };