Razzle: рдПрд╕рд╕реАрдПрд╕рдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдЬреБрд▓ре░ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jaredpalmer/razzle

рдирдорд╕реНрддреЗ, рдореИрдВ рдПрд╕рд╕реАрдПрд╕рдПрд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдПрд╕рдПрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ред рдореИрдВрдиреЗ 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
        }
      }
    },

рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдзрдиреНрдпрд╡рд╛рдж

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВрдиреЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛рдпрд╛ https://github.com/jaredpalmer/razzle/pull/1047 рдЬрд┐рд╕рдореЗрдВ рд╕реАрдПрд╕рдПрд╕ scss, *.module.scss, *.module.css рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@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 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕