Я впервые пробую CSS-модули с React и Webpack, и я нашел как минимум три способа добиться этого:
- css-загрузчик
- react-css-modules
- babel-plugin-react-css-modules
Я выбрал 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';