Как настроить загрузчик sass в webpack для корректной работы?

Пытаюсь настроить webpack для сборки проекта с использованием sass, но получаю ошибку "Module parse failed: Unexpected token" при подключении файла styles.scss. У меня установлены необходимые зависимости и я настроил webpack.config.js для обработки scss файлов. Относительно .css файлов все работает правильно, но при подключении .scss файлов возникает ошибка. Что я делаю не так?
  • 14 ноября 2023 г. 21:20
Ответы на вопрос 4
Ошибка "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"
  }
Похожие вопросы