Перевод с vite на webpck. Не понимает css modules
Есть проект на Реакте, сборщик vite + ts, делаю перевод проект на вебпак. Все ок, кроме того, что возникает ошибка касаемо css модулей, будто их не видит, выдает ошибку при билде, пример:
in ./src/shared/UI/Button/Button.tsx 18:29-34
export 'default' (imported as 's') was not found in './Button.module.scss' (possible exports: btn, color_accent, color_light, container, disabled, root)
При запуске проекта, пример ошибки:
TypeError
Cannot read properties of undefined (reading 'wrapper')
стили импортирую так: import styles from './RelatedItems.module.scss'; пробовала и так, но возникает также ошибка: import * as styles from './RelatedItems.module.scss';
Мой конфиг вебпака:
import path from 'path';
import { fileURLToPath } from 'url';
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
// import TsCheckerPlugin from 'fork-ts-checker-webpack-plugin';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const buildPath = path.resolve(__dirname, 'dist');
const srcPath = path.resolve(__dirname, 'src');
const isProd = process.env.NODE_ENV === 'production';
const getSettingsForStyles = (withModules = false) => {
return [
isProd ? MiniCssExtractPlugin.loader : 'style-loader',
!withModules
? 'css-loader'
: {
loader: 'css-loader',
options: {
modules: {
localIdentName: !isProd ? '[path][name]__[local]' : '[hash:base64]',
},
},
},
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: ['autoprefixer'],
},
},
},
'sass-loader',
];
};
export default {
entry: path.resolve(srcPath, 'main.tsx'),
output: {
path: buildPath,
filename: 'bundle.js',
libraryExport: 'default',
publicPath: '/',
},
target: !isProd ? 'web' : 'browserslist',
module: {
rules: [
{
test: /\.[tj]sx?$/,
use: 'babel-loader',
},
{
test: /\.s?css$/,
exclude: /\.module\.s?css$/,
use: getSettingsForStyles(),
},
{
test: /\.module\.s?css$/,
use: getSettingsForStyles(true),
},
{
test: /\.(png|svg|jpg)$/,
type: 'asset/resource',
parser: {
dataUrlCondition: {
maxSize: 10 * 1024,
},
},
},
],
},
plugins: [
new HtmlWebpackPlugin({
template: 'index.html',
}),
!isProd && new ReactRefreshWebpackPlugin(),
isProd &&
new MiniCssExtractPlugin({
filename: '[name]-[hash].css',
}),
],
resolve: {
extensions: ['.tsx', '.jsx', '.js', '.ts'],
alias: {
'@pages': path.join(srcPath, 'pages'),
'@features': path.join(srcPath, 'features'),
'@widgets': path.join(srcPath, 'widgets'),
'@shared': path.join(srcPath, 'shared'),
'@entities': path.join(srcPath, 'entities'),
},
},
devServer: {
host: '127.0.0.1',
port: 9000,
hot: true,
historyApiFallback: true,
// contentBase: path.resolve(__dirname, 'src'),
},
};
tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
"baseUrl": "./src/",
"paths": {
"@app/*": ["app/*"],
"@pages/*": ["pages/*"],
"@widgets/*": ["widgets/*"],
"@entities/*": ["entities/*"],
"@features/*": ["features/*"],
"@shared/*": ["shared/*"]
},
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"types": ["vite-plugin-svgr/client"],
"include": ["src", "main.tsx", "custom.d.ts", "declaration.d.ts"],
"references": [{ "path": "./tsconfig.node.json" }]
}
tsconfig.node.json:
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true,
"strict": true
},
"include": ["tsconfig.json"]
}
declaration.d.ts:
declare module '*.scss' {
const content: Record<string, string>;
export default content;
}
declare module '*.png' {
const content: string;
export default content;
}
custom.d.ts:
declare module '*.svg' {
import React = require('react');
export const ReactComponent: React.FC<React.SVGProps<SVGElement>>;
const src: string;
export default src;
}
declare module '*.scss' {
const content: Record<string, string>;
export default content;
}
declare module '*.png' {
const content: string;
export default content;
}
babel.config:
module.exports = (api) => {
api.cache.using(() => process.env.NODE_ENV);
return {
presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-typescript'],
plugins: [process.env.NODE_ENV === 'development' && 'react-refresh/babel'].filter(Boolean),
};
};