@Evtera

Почему webpack создает дубли?

Здравствуйте. Есть следующий конфиг вебпака. Проблема заключается в том, что если я использую какие-то файлы в css/scss, например картинки в background-image/шрифты в font-face, то в папке dist вебпак создает копии файлов с хешем в корневой папке, а не обращается в скопированную папку assets с этими же файлами. В чем может быть причина?

const path = require("path");
const HTMLWebpackPlugin = require("html-webpack-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const OptimizeCssAssetWebpackPlugin = require("optimize-css-assets-webpack-plugin");
const TerserWebpackPlugin = require("terser-webpack-plugin");
const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer");

const isDev = process.env.NODE_ENV === "development";
const isProd = !isDev;

const optimization = () => {
  const config = {
    splitChunks: {
      chunks: "all",
    },
  };

  if (isProd) {
    config.minimizer = [new OptimizeCssAssetWebpackPlugin(), new TerserWebpackPlugin()];
  }

  return config;
};

const cssLoaders = (extra) => {
  const loaders = [
    {
      loader: MiniCssExtractPlugin.loader,
    },
    "css-loader",
  ];

  if (extra) {
    loaders.push(extra);
  }

  return loaders;
};

const plugins = () => {
  const base = [
    new HTMLWebpackPlugin({
      template: "./index.html",
    }),
    new CleanWebpackPlugin(),
    new CopyWebpackPlugin({
      patterns: [
        {
          from: path.resolve(__dirname, "src/assets/"),
          to: path.resolve(__dirname, "dist/assets/"),
        },
      ],
    }),
    new MiniCssExtractPlugin({
      filename: "./styles/[name].[contenthash].css",
    }),
  ];

  if (isProd) {
    base.push(new BundleAnalyzerPlugin());
  }

  return base;
};

module.exports = {
  context: path.resolve(__dirname, "src"),
  mode: "development",
  entry: ["@babel/polyfill", "./js/index.js"],
  output: {
    filename: "./js/[name].[contenthash].js",
    path: path.resolve(__dirname, "dist"),
  },
  resolve: {
    /* список расширений при импорте */
    // extensions: [""],

    /* упрощение вложенности. В import ./ меняется на @ */
    alias: {
      "@js": path.resolve(__dirname, "src/js/"),
      "@": path.resolve(__dirname, "src"),
    },
  },
  optimization: optimization(),
  devServer: {
    port: 5500,
    open: true,
    hot: isDev,
  },
  devtool: isDev ? "source-map" : false,
  plugins: plugins(),
  module: {
    rules: [
      {
        test: /\.css$/,
        use: cssLoaders(),
      },
      {
        test: /\.scss$/,
        use: cssLoaders("sass-loader"),
      },
      { test: /\.(png|jpg|svg|jpeg)$/, use: ["file-loader"] },
      { test: /\.(ttf|woff|woff2)$/, use: ["file-loader"] },
      {
        test: /\.m?js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader",
          options: {
            presets: ["@babel/preset-env"],
          },
        },
      },
    ],
  },
};
  • Вопрос задан
  • 611 просмотров
Пригласить эксперта
Ответы на вопрос 1
@VyacheslavWebDev
https://v4.webpack.js.org/loaders/file-loader/

{ 
    test: /\.(png|jpg|svg|jpeg)$/, 
    use: ["file-loader"], 
    options: {
        outputPath: 'Название папки для файлов'
    } 
},
{ 
    test: /\.(ttf|woff|woff2)$/, 
    use: ["file-loader"], 
    options: {
        outputPath: 'Название папки для файлов'
    }
 }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы