Невозможно пропустить стороннюю библиотеку CSS из преобразования CSS-Module
Я впервые пробовал модули CSS с React и Webpack, и я нашел по крайней мере три способа добиться этого:
- CSS-погрузчик
- реагируют-CSS-модули
- Бабель-плагин-реагирующий-CSS-модули
я пошел с babel-plugin-react-css-modules
чтобы сбалансировать простоту и производительность кода, кажется, что все работает нормально, за исключением одного: мои сторонние библиотеки (Bootstrap и Font Awesome) также включены в преобразование модулей CSS.
<NavLink to="/about" styleName="navigation-button"></NavLink>
Вышеуказанное присваивает правильно преобразованный className
к NavLink
, Тем не менее, span
внутри необходимо обратиться к глобальным стилям, чтобы сделать иконку.
<span className="fa fa-info" />
Вышеуказанный промежуток не назначен преобразованным className
что и ожидается, но в моей прилагаемой таблице стилей нет этих классов CSS, так как они преобразуются во что-то другое, чтобы имитировать локальную область видимости.
Ниже содержание в моем .babelrc
файл для активации babel-plugin-react-css-modules
:
{
"presets": ["env", "react"],
"plugins": [
["react-css-modules", {
"generateScopedName": "[name]__[local]___[hash:base64:5]",
"filetypes": {
".less": {
"syntax": "postcss-less"
}
}
}]
]
}
В моей конфигурации Webpack ниже раздел для настройки css-loader
для преобразований:
{
test: /\.(less|css)$/,
exclude: /node_modules/,
use: extractCSS.extract({
fallback: 'style-loader',
use: [
{
loader: 'css-loader',
options: {
minimize: true,
modules: true,
sourceMap: true,
localIdentName: '[name]__[local]___[hash:base64:5]'
}
},
{
loader: 'less-loader'
}
]
})
}
Насколько я прочитал, вышеприведенное правило должно исключать таблицы стилей библиотеки, и я также пытался добавить другое правило специально для исключенных таблиц стилей, однако это не сработало, как я полагаю, поскольку эти таблицы стилей все еще были преобразованы с исходным правилом.
Чтобы импортировать CSS из двух библиотек, у меня есть две строки ниже в моей родительской таблице стилей, которая объявляет некоторые глобальные стили:
@import '../../../node_modules/bootstrap/dist/css/bootstrap.min.css';
@import '../../../node_modules/font-awesome/css/font-awesome.min.css';
3 ответа
Я считаю, что эти два подхода ниже могут быть полезны:
- /questions/40165515/reagirujte-ispolzujte-bootstrap-globalno-s-modulyami-css/40165527#40165527
- https://github.com/css-modules/css-modules/pull/65
Короче говоря, похоже, что пока нет опций игнорировать / исключать определенные пути из модульности плагином css-modules webpack. В идеале это должно поддерживаться плагином, но вот несколько подходов, которые вы можете попробовать:
используйте два правила веб-пакета для исключения / включения правила веб-пакета:
module.exports = {
rules: [
{
test: /\.css$/,
exclude: /node_modules/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: true,
localIdentName: '[path]__[local]___[hash:base64:5]',
},
},
],
},
{
test: /\.css$/,
include: /node_modules/,
use: ['style-loader', 'css-loader']
}
]
}
... или вставьте в getLocalIdent веб-пакета второй ответ выше, чтобы вручную исключить определенные пути.
const getLocalIdent = require('css-loader/lib/getLocalIdent');
{
loader: 'css-loader',
options: {
modules: true,
localIdentName: '[path][name]__[local]--[hash:base64:5]',
getLocalIdent: (loaderContext, localIdentName, localName, options) => {
return loaderContext.resourcePath.includes('semantic-ui-css') ?
localName :
getLocalIdent(loaderContext, localIdentName, localName, options);
}
}
}
Для меня использую
:global
работал:
.my-component {
:global {
.external-ui-component {
padding: 16px;
// Some other styling adjustments here
}
...
}
}
Ps: чтобы сделать это с конфигурацией webpack, см. Другой ответ.
Обновлено решение от play771
{
loader: 'css-loader',
options: {
modules: {
auto: (resourcePath) => !resourcePath.includes('node_modules'),
localIdentName: '[name]__[local]__[hash:base64:5]',
},
},
},