Пытаюсь настроить webpack для сборки проекта с использованием sass, но получаю ошибку "Module parse failed: Unexpected token" при подключении файла styles.scss. У меня установлены необходимые зависимости и я настроил webpack.config.js для обработки scss файлов. Относительно .css файлов все работает правильно, но при подключении .scss файлов возникает ошибка. Что я делаю не так?
Ошибка "Module parse failed: Unexpected token" возникает, когда webpack не может правильно обработать файлы формата .scss, поскольку имеет встроенную поддержку только для .css и .sass файлов. Чтобы исправить эту ошибку, вам понадобится настроить загрузчик для компиляции файлов .scss в css перед их обработкой webpack. Вот пример настройки загрузчика для sass в webpack: 1. Установите необходимые пакеты через npm: ```bash npm install sass-loader node-sass webpack --save-dev ``` 2. Внесите следующие изменения в ваш webpack.config.js: ```javascript module: { rules: [ { test: /\.scss$/, use: [ 'style-loader', 'css-loader', 'sass-loader' ] } ] } ``` Нужно добавить новый объект rule в массив rules со следующими свойствами: - test: /\.scss$/ - указывает webpack'у, что все файлы, оканчивающиеся на .scss, должны быть обработаны заданными загрузчиками. - use: ['style-loader', 'css-loader', 'sass-loader'] - определяет, какие загрузчики использовать для обработки файлов .scss. Загрузчики будут выполняться в обратном порядке: файлы .scss сначала пройдут через sass-loader, который скомпилирует их в .css файлы, затем через css-loader, который разрешит импорты и добавит необходимые префиксы, и в конечном счете через style-loader, который вставит стили в сгенерированный html файл. После внесения этих изменений webpack должен правильно обрабатывать файлы .scss и избавить вас от ошибки "Module parse failed: Unexpected token".
const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') const { CleanWebpackPlugin } = require('clean-webpack-plugin') module.exports = { mode: 'production', entry: path.resolve(__dirname, 'src/index.jsx'), output: { filename: 'js/vm.js', path: path.resolve(__dirname, 'dist') }, devtool: process.env.NODE_ENV === 'development' ? 'source-map' : false, devServer: { port: 3000, historyApiFallback: true, open: true }, target: 'web', resolve: { extensions: ['.tsx', '.ts', '.jsx', '.js'] }, performance: { hints: false }, plugins: [ new HtmlWebpackPlugin({ template: path.resolve(__dirname, 'public/index.html'), filename: 'index.html' }), new MiniCssExtractPlugin({ filename: 'css/style.css' }), new CleanWebpackPlugin() ], module: { rules: [ { test: /\.(jsx|js)$/, exclude: /node_modules/, use: ['babel-loader'] }, { test: /\.(css|scss|sass)$/, use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'] }, { test: /\.(pdf|png|jpeg|jpg|svg)$/, use: [ { loader: 'file-loader', options: { name: '/assets/[name].[ext]' } } ] } ] } }
пакеты
`devDependencies": { "@babel/core": "^7.19.3", "@babel/preset-env": "^7.19.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", "babel-loader": "^8.2.5", "clean-webpack-plugin": "^4.0.0", "css-loader": "^6.7.1", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.5.0", "mini-css-extract-plugin": "^2.6.1", "ts-loader": "^9.4.1", "typescript": "^4.8.4", "webpack": "^5.74.0", "webpack-cli": "^4.10.0", "webpack-dev-server": "^4.11.1" }