У меня есть проект 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"
}
}
main.css
и удалитьsass-loader
из уравнения, просто чтобы убедиться, что он не с той стороны. В качестве примечания: поскольку мир быстро приближается к использованию реальных модулей в браузерах, я бы посоветовал держаться подальше от любых способов, которые не приводят к выпуску модулей, то есть которые работают только благодаря инструментам сборки, которые вы используете. пользуетесь. - person connexo   schedule 30.05.2021./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