webpack.config.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. const path = require('path');
  2. const glob = require('glob');
  3. const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
  4. const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  5. const TerserPlugin = require('terser-webpack-plugin');
  6. const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
  7. const CopyWebpackPlugin = require('copy-webpack-plugin');
  8. module.exports = (env, options) => {
  9. const devMode = options.mode !== 'production';
  10. return {
  11. optimization: {
  12. minimizer: [
  13. new TerserPlugin({ cache: true, parallel: true, sourceMap: devMode }),
  14. new OptimizeCSSAssetsPlugin({})
  15. ]
  16. },
  17. entry: {
  18. 'app': glob.sync('./vendor/**/*.js').concat(['./js/app.js'])
  19. },
  20. output: {
  21. filename: '[name].js',
  22. path: path.resolve(__dirname, '../priv/static/js'),
  23. publicPath: '/js/'
  24. },
  25. devtool: devMode ? 'eval-cheap-module-source-map' : undefined,
  26. module: {
  27. rules: [
  28. {
  29. test: /\.js$/,
  30. exclude: /node_modules/,
  31. use: {
  32. loader: 'babel-loader'
  33. }
  34. },
  35. {
  36. test: /\.[s]?css$/,
  37. use: [
  38. MiniCssExtractPlugin.loader,
  39. 'css-loader',
  40. 'sass-loader',
  41. ],
  42. }
  43. ]
  44. },
  45. plugins: [
  46. new MiniCssExtractPlugin({ filename: '../css/app.css' }),
  47. new CopyWebpackPlugin([{ from: 'static/', to: '../' }])
  48. ]
  49. .concat(devMode ? [new HardSourceWebpackPlugin()] : [])
  50. }
  51. };