I’ve found the solution – use css (scss) modules.
1. I modified my webpack config:
{
test: cssRegex,
exclude: cssModuleRegex,
use: getStyleLoaders({
importLoaders: 1,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: {
getLocalIdent: getCSSModuleLocalIdent,
},
}),
sideEffects: true,
},
{
test: cssModuleRegex,
use: getStyleLoaders({
importLoaders: 1,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: {
getLocalIdent: getCSSModuleLocalIdent,
},
}),
},
{
test: sassRegex,
exclude: sassModuleRegex,
use: getStyleLoaders({
importLoaders: 3,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: {
getLocalIdent: getCSSModuleLocalIdent,
},
},
'sass-loader'
),
sideEffects: true,
},
{
test: sassModuleRegex,
use: getStyleLoaders({
importLoaders: 3,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: {
getLocalIdent: getCSSModuleLocalIdent,
},
},
'sass-loader'
),
},
2. I added declares to react-app-env.d.ts:
declare module '*.css' {
const classes: { readonly [key: string]: string };
export default classes;
}
declare module '*.scss' {
const content: {[className: string]: string};
export default content;
}
3. And now I can use css classes like modules
//Header.tsx
import React from "react";
import styles from './Header.scss';
export default class Header extends React.Component {
render() {
return (
<header className={styles.header}>
Hello World!
</header>
)
}
}
//Header.scss
.header {
color: $white;
background-color: $green;
padding: 8px 10px;
font-weight: 500;
font-size: 16px;
}