Я столкнулся с той же проблемой и нашел следующие способы решения проблемы, вы можете выбрать то, что подходит вам лучше всего
- Define two sets of rules in your webpack config for parsing css/less
files.
- The first rule should be to include all global styles,
assuming it's kept in /styles/ or similar directory.
- Второе правило - обрабатывать все стили CSS с локальной областью видимости, в идеале они должны находиться рядом с их компонентами.
- Это можно сделать с помощью параметра включить и исключить при определении правила.
- или путем обеспечения соблюдения соглашения об именах и правила записи соответственно, например, все модули css будут иметь формат [name] .module.css, и ваш тест будет проверять наличие /.module.(less|css) $ / и проанализируйте его.
Ниже приводится образец:
// exclude all global styles for css modules
{
test: /\.(less|css)$/,
exclude: path.resolve(__dirname, './src/styles'),
use: [
{
loader: CssExtractPlugin.loader,
options: { hot: is_dev, reloadAll: is_dev }
},
{
loader: "css-loader",
options: {
modules: {
localIdentName: '[local]___[hash:base64:5]'
}
}
},
"postcss-loader",
"less-loader"
]
},
// process global styles without css modules
{
test: /\.(less|css)$/,
include: path.resolve(__dirname, './src/styles'),
use: [
{
loader: CssExtractPlugin.loader,
options: { hot: is_dev, reloadAll: is_dev }
},
"css-loader",
"postcss-loader",
"less-loader"
]
}
- Используйте : local и: global при написании css / less. Если модули css включены, по умолчанию используется локальный режим, вы можете указать режим в параметрах, как показано ниже:
{
loader: "css-loader",
options: {
modules: {
localIdentName: '[local]___[hash:base64:5]',
mode: 'global',
}
}
},
Если вы определяете режим как глобальный, тогда все ваши включенные классы css не будут заменены хешированными именами, вместо этого будут предоставлены уникальные имена только тем, которые вы укажете как: local. Например:
/* this will remain as is */
.header {
color: blue;
}
:local {
/* this will become something like item_xSH2sa */
.item {
color: yellow;
}
}
- Определите функцию, которая проверяет ваш файл, чтобы решить, является ли он модулем css или глобальным, используя параметр getLocalIdent. Это метод, который я сейчас использую в своей настройке. Это также требует, чтобы ваши файлы имели некоторое соглашение об именах: [name] .module.less для модулей css и [name] .less для обычных файлов. См. Пример ниже:
// regex to test for modules, loaderUtils is part of webpack dependencies
const cssModuleRegex = new RegExp(/\.module\.(less|css)$/);
const loaderUtils = require("loader-utils");
// inside webpack rules
{
test: /\.(less|css)$/,
use: [
{
loader: CssExtractPlugin.loader,
options: { hot: is_dev, reloadAll: is_dev }
},
{
loader: "css-loader",
options: {
modules: {
localIdentName: '[local]___[hash:base64:5]',
getLocalIdent: getLocalIdent
}
}
},
"postcss-loader",
"less-loader"
]
}
// this is a copy of the default function, modified slightly to achieve our goal
function getLocalIdent(loaderContext, localIdentName, localName, options) {
// return local name if it's a global css file
if (!cssModuleRegex.test(loaderContext.resourcePath)) {
return localName;
}
if (!options.context) {
// eslint-disable-next-line no-param-reassign
options.context = loaderContext.rootContext;
}
const request = path
.relative(options.context, loaderContext.resourcePath)
.replace(/\\/g, '/');
// eslint-disable-next-line no-param-reassign
options.content = `${options.hashPrefix + request}+${localName}`;
// eslint-disable-next-line no-param-reassign
localIdentName = localIdentName.replace(/\[local\]/gi, localName);
const hash = loaderUtils.interpolateName(
loaderContext,
localIdentName,
options
);
return hash
.replace(new RegExp('[^a-zA-Z0-9\\-_\u00A0-\uFFFF]', 'g'), '-')
.replace(/^((-?[0-9])|--)/, '_$1');
}
person
ksankar
schedule
01.10.2019
require('./App.css');
в корневом компоненте? - person elmeister   schedule 01.10.2016