webpack.config.js 1.4 KB

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