Ошибка при объединении sass-loader с css-модулями

#sass #webpack #css-modules

#sass #webpack #css-модули

Вопрос:

Я получаю следующую ошибку при использовании SASS map-get .

 ERROR in ./src/special.scss
Module build failed: ModuleBuildError: Module build failed: Unknown word (11:14)

   9 |
  10 | @mixin mediaquery($name) {
> 11 |     @media #{map-get($breakpoints, $name)} {
     |              ^
  12 |         @content;
  13 |     }
  14 | }
  

Это происходит только тогда, когда я использую как sass-loader загрузчик, так и другой загрузчик.

Сначала я подумал, что это вызвано загрузчиком PostCSS, но похоже, что проблемы вызывает загрузка sass, а не преобразование scss при использовании css-modules .

Я создал образец репозитория, иллюстрирующий проблему: https://github.com/tiemevanveen/sass-css-components-fail-example .

Вы можете использовать разные ветки для тестирования:

Только первая и последняя ветви выполняются без ошибок.

Я создал пример с исходным кодом журнала, чтобы посмотреть, что возвращает sass-loader, и похоже, что он не преобразует sass (но это также может быть из-за того, что я неправильно истолковываю, как работают загрузчики).

Другой пример без модулей css показывает правильно преобразованный код..

Я озадачен, почему основная ветка (без postcss или другого пользовательского загрузчика) работает нормально.. если что-то не так с sass-loader, то это тоже должно выйти из строя, верно?

Я зарегистрировал проблему, но я думаю, что у этого больше шансов на StackOverflow, поскольку это такая специфическая проблема и может быть скорее проблемой конфигурации. Вот моя конфигурация webpack:

 const webpack = require('webpack');
const path = require('path');
const autoprefixer = require('autoprefixer');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const WriteFilePlugin = require('write-file-webpack-plugin');

module.exports = {
  devtool: 'source-source-map',
  debug: true,
  context: path.resolve(__dirname, './src'),
  entry: {
    app: './index.js'
  },
  output: {
    path: path.resolve(__dirname, './static'),
    filename: '[name].js',
    publicPath: '/static/'
  },
  devServer: {
    outputPath: path.resolve(__dirname, './static'),
  },
  plugins: [
    new webpack.NoErrorsPlugin(),
    new ExtractTextPlugin('[name].css'),
    new WriteFilePlugin()
  ],
  module: {
    loaders: [
      {
        test: /.scss$/,
        loader: ExtractTextPlugin.extract('style-loader', [
          'css?modulesamp;importLoaders=1amp;localIdentName=[path]_[name]_[local]',
          // 'postcss-loader',
          'sass'
        ])
      },
      //   js loader
    ]
  },
  postcss: [
    autoprefixer({ browsers: ['> 0.5%'] })
  ],
  resolveLoader: {
    fallback: [
      path.resolve(__dirname, 'loaders'),
      path.join(process.cwd(), 'node_modules')
    ]
  },
  resolve: {
    extensions: ['', '.js', '.json'],
  }
};
  

Ответ №1:

Вам необходимо увеличивать параметр importLoaders запроса по мере добавления загрузчиков. Эта функция плохо документирована и сбивает с толку, но в вашем репозитории samples importLoaders=2 работает как с Sass, так и с PostCSS.

Комментарии:

1. Да, это сработало!! Большое спасибо! Нашел это здесь .. github.com/webpack/css-loader#importing-and-chained-loaders