Как я могу запретить Webpack 5 (или одному из его плагинов) удалять `@charset` из моего экспортированного CSS?

У меня есть проект Webpack 5, в котором я пытаюсь добавить @charset "UTF-8"; к своим файлам CSS, чтобы обратиться к эта проблема с Font Awesome. Однако, когда Webpack находится в режиме production, я не могу заставить этот код остаться, даже если он есть в исходном файле Sass.

Если я переключаю mode на none или development, то экспортируемый CSS не минимизируется (т.е. есть разрывы строк), а строка @charset остается. Также обратите внимание, что я удалил минимизатор CSS из списка Optimization.minifier, но код CSS продолжает подвергаться минимизации/обработке.

FWIW, я попробовал предложенный ответ в этом связанном сообщении SO об отключении импорта на css-loader, но это не помогло.

Обновление (как отмечено в комментариях): По предложению connexo я удалил sass-loader, и строка charset now осталась в выводе (даже после повторного добавления моего минимизатора CSS). Если я запускаю sass из командной строки (./node_modules/sass/sass.js --no-charset main.scss test.css), то строка кодировки также остается. В sass есть опция --no-charset, которая при использовании удалит строку набора символов. {loader: "sass-loader", options: {sassOptions: {charset: true}}} как мой загрузчик, но это не помогло


У меня есть пример проекта здесь, но вы также можете просмотреть файлы ниже:

Конфигурация веб-пакета:

const path = require("path");
const webpack = require("webpack");

const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');

module.exports = {
  context: __dirname,
  entry: {
    main: "./main.js",
  },
  output: {
    path: path.resolve("./dist/"),
    filename: '[name].min.js',
    publicPath: "dist/",
    clean: true,
  },
  mode: "production",
  module: {
    rules: [
      {
        test: /\.(sa|sc|c)ss$/,
        use: [
          { loader: MiniCssExtractPlugin.loader, options: { publicPath: "./" } },
          { loader: "css-loader", options: { sourceMap: false } },
          {
            loader: 'postcss-loader',
            options: { postcssOptions: { plugins: ['autoprefixer'] }},
          },
          "sass-loader",
        ]
      }
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({ filename: '[name].min.css' }),
  ],
  optimization: {
    //
    // Explicitly excluding CSS minifier, but the CSS is still minified with @charset removed:
    //
    // minimizer: [
    //   `...`,
    //   new CssMinimizerPlugin(),
    // ],
  },
};

main.scss

@charset "UTF-8";
#test:after {
  content: "✔️ ❤️";
}

main.js

import "./main.scss";
document.getElementById("test").innerHTML = "test";

package.json

{
  "name": "test",
  "dependencies": {},
  "devDependencies": {
    "autoprefixer": "^10.2.5",
    "css-loader": "^5.1.1",
    "css-minimizer-webpack-plugin": "^3.0.0",
    "mini-css-extract-plugin": "^1.6.0",
    "postcss-loader": "^5.1.0",
    "sass": "^1.34.0",
    "sass-loader": "^11.1.0",
    "webpack": "^5.37.0",
    "webpack-cli": "^4.7.0"
  },
  "scripts": {
    "build": "NODE_ENV=production webpack"
  }
}

person Dolan Antenucci    schedule 30.05.2021    source источник
comment
Попробуйте назвать файл main.css и удалить sass-loader из уравнения, просто чтобы убедиться, что он не с той стороны. В качестве примечания: поскольку мир быстро приближается к использованию реальных модулей в браузерах, я бы посоветовал держаться подальше от любых способов, которые не приводят к выпуску модулей, то есть которые работают только благодаря инструментам сборки, которые вы используете. пользуетесь.   -  person connexo    schedule 30.05.2021
comment
Это действительно sass-loader: при удалении его из списка загрузчиков и выводе (даже после повторного добавления моего CSS-минификатора) остается строка кодировки. Если я запускаю sass из командной строки (./node_modules/sass/sass.js --no-charset main.scss test.css), то строка кодировки также остается. В sass есть опция --no-charset, которая при использовании удалит строку набора символов. между прочим, я также только что попробовал `{loader: sass-loader, options: {sassOptions: {charset: true}}}`, но это не помогло   -  person Dolan Antenucci    schedule 30.05.2021


Ответы (1)


Спасибо @connexo за то, что помогли мне понять, что виновником был sass-loader, и, покопавшись, я обнаружил, что сжатый outputFormat — включен по умолчанию, если outputFormat не указан, а режим webpack — производственный — удалял строку набора символов. Таким образом, мое исправление заключается в использовании расширенного outputFormat:

    {
      loader: "sass-loader",
      options: { sassOptions: { outputStyle: "expanded" }},
    },
person Dolan Antenucci    schedule 30.05.2021