рдирдорд╕реНрддреЗ, рдореИрдВ рдПрд╕рд╕реАрдПрд╕рдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ред рдореИрдВрдиреЗ razzle-plugin-scss рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
import styles from "./App.module.css"; // works
import styles2 from "./App.module.scss"; // doesn't work
const App = () => (
<div className={styles.foo}>
рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл CSS рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, SCSS рд╡реИрд░рд┐рдПрдВрдЯ рдирд╣реАрдВред
рдореИрдВрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рднреА рдмрд╛рдВрдз рджрд┐рдпрд╛ рд╣реИ:
module.exports = {
plugins: [
{
name: "scss",
options: {
css: {
modules: true
}
}
},
рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдзрдиреНрдпрд╡рд╛рдж
@dizzyn рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдКрдкрд░ рдХреА
рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд╣реАрдВ рдФрд░ рд╕реЗ рдЙрдард╛рдпрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЖрдк рдореМрдЬреВрджрд╛ рд╕реАрдПрд╕рдПрд╕ рд▓реЛрдбрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ .module.scss
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ:
const makeLoaderFinder = require('razzle-dev-utils/makeLoaderFinder');
const cssLoaderFinder = makeLoaderFinder('css-loader');
const paths = require('razzle/config/paths');
module.exports = {
modify: (baseConfig, {dev}, webpack) => {
const config = Object.assign({}, baseConfig);
config.module.rules.filter(cssLoaderFinder).forEach(rule => {
const isCssModuleRule = !rule.test.test('module.css');
const scssExclude = [paths.appBuild];
let scssTest = /\.s[ac]ss$/;
if (isCssModuleRule) {
scssTest = /\.module\.s[ac]ss$/;
} else {
scssExclude.push(/\.module\.s[ac]ss$/);
}
// Use default configs
config.module.rules.push({
test: scssTest,
exclude: scssExclude,
use: [
...rule.use,
scssLoader,
]
});
});
}
};
razzle.config.js . рдореЗрдВ
рдореИрдВрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡реЗрдмрдкреИрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ред
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');
const postcssNormalize = require('postcss-normalize');
const sassRegex = /\.(scss|sass)$/;
const sassModuleRegex = /\.module\.(scss|sass)$/;
const getStyleLoaders = (cssOptions, preProcessor) => {
const loaders = [
{
loader: MiniCssExtractPlugin.loader
},
{
loader: require.resolve('css-loader'),
options: cssOptions,
},
{
loader: require.resolve('postcss-loader'),
options: {
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
require('postcss-preset-env')({
autoprefixer: {
flexbox: 'no-2009',
},
stage: 3,
}),
postcssNormalize(),
],
sourceMap: false,
},
},
].filter(Boolean);
if (preProcessor) {
loaders.push({
loader: require.resolve(preProcessor),
options: {
sourceMap: false,
},
});
}
return loaders;
};
module.exports = {
modify: (config, { target, dev }, webpack) => {
config.plugins.push(new MiniCssExtractPlugin({
filename: 'static/css/bundle.[contenthash:8].css',
chunkFilename: 'static/css/[name].[contenthash:8].chunk.css',
allChunks: true,
}))
config.module.rules.push(
{
test: sassRegex,
exclude: sassModuleRegex,
use: getStyleLoaders(
{
importLoaders: 2,
sourceMap: false,
},
'sass-loader'
),
sideEffects: true,
},
{
test: sassModuleRegex,
use: getStyleLoaders(
{
importLoaders: 2,
sourceMap: false,
modules: true,
getLocalIdent: getCSSModuleLocalIdent,
},
'sass-loader'
),
}
)
return config;
}
};
рдпрд╣ рдХрд╛рдо рд╣реИ
import './Home.css';
import s from './Home.module.css';
import './a.scss';
import a from './a.module.scss';
рдореИрдВрдиреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдпрд╛ https://github.com/jaredpalmer/razzle/pull/1047 рдЬрд┐рд╕рдореЗрдВ рд╕реАрдПрд╕рдПрд╕ scss, *.module.scss, *.module.css рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдореИрдВрдиреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдпрд╛ https://github.com/jaredpalmer/razzle/pull/1047 рдЬрд┐рд╕рдореЗрдВ рд╕реАрдПрд╕рдПрд╕ scss, *.module.scss, *.module.css рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ