Подтвердить что ты не робот

Как добавить запрос к загрузчику webpack с несколькими загрузчиками?

У меня есть этот загрузчик Babel, который работает

{ test: /\.jsx?$/, loader: 'babel', query: babelSettings, exclude: /node_modules/ },

Но теперь я хочу загрузчика CoffeeScript, но я хочу передать его через Babel, чтобы получить фантастический материал HMR.

{ test: /\.coffee$/, loader: 'babel!coffee', query: babelSettings, exclude: /node_modules/ },

Это не работает, и приводит к следующей ошибке.

Ошибка: невозможно определить запрос и несколько загрузчиков в списке загрузчиков

Любая идея, как определить запрос только для Вавилонской части цепи загрузчика? Запрос - сложный объект, и я не думаю, что могу его закодировать.

var babelSettings = { stage: 0 };

if (process.env.NODE_ENV !== 'production') {
  babelSettings.plugins = ['react-transform'];
  babelSettings.extra = {
    'react-transform': {
      transforms: [{
        transform: 'react-transform-hmr',
        imports: ['react'],
        locals: ['module']
      }, {
        transform: 'react-transform-catch-errors',
        imports: ['react', 'redbox-react']
      }]
      // redbox-react is breaking the line numbers :-(
      // you might want to disable it
    }
  };
}
4b9b3361

Ответ 1

Обновление: В устаревших версиях Webpack вы можете определить массив загрузчиков в конфигурации Webpack.

Если вам нужно использовать более старые версии Webpack или добавить встроенные параметры, оригинальный ответ приведен ниже.


Это можно сделать, установив параметры запроса в самой строке загрузчика, поскольку ключ объекта query будет работать только для одного загрузчика.

Предполагая, что ваш объект настроек может быть сериализован в JSON, как показывает ваш пример, вы можете легко передать ваш объект настроек как запрос JSON. Тогда только загрузчик Babel получит настройки.

{ test: /\.coffee$/, loader: 'babel?'+JSON.stringify(babelSettings)+'!coffee', exclude: /node_modules/ }

Функция для этого несколько документирована здесь:

Using Loaders: Query parameters

Большинство загрузчиков принимают параметры в обычном формате запроса (?key=value&key2=value2) и в качестве объекта JSON (?{"key":"value","key2":"value2"}).

Ответ 2

Sokra, создатель Webpack, дает свое собственное мнение о том, как это сделать здесь, но вам, вероятно, лучше будет служить с webpack-combine-loaders, который более похож по стилю на определение одного загрузчика с объектом запроса.

С помощью webpack-combine-loaders вы можете определить несколько загрузчиков как таковых:

combineLoaders([
  {
    loader: 'css-loader',
    query: {
      modules: true,
      sourceMap: true,
      localIdentName: '[name]__[local]--[hash:base64:5]',
    },
  },
  {
    loader: 'sass-loader',
    query: {
      sourceMap: true,
      includePaths: [
        'app/assets/stylesheets',
        'app/assets/stylesheets/legacy',
      ],
    },
  },
]);

Ответ 3

В webpack 2 и 3 это можно настроить гораздо более чисто.

Погрузчики могут быть переданы в массив объектов-загрузчиков. Каждый объект-загрузчик может указать объект options, который действует как webpack 1 query для этого конкретного загрузчика.

Например, используя react-hot-loader и babel-loader, с babel-loader, настроенным с некоторыми параметрами, в webpack 2 и 3

module: {
  rules: [{
    test: /\.js$/,
    exclude: /node_modules/,
    use: [{
      loader: 'react-hot-loader'
    }, {
      loader: 'babel-loader',
      options: {
        babelrc: false,
        presets: [
          'es2015-native-modules',
          'stage-0',
          'react'
        ]
      }
    }]
  }] 
}

Для сравнения, здесь та же конфигурация в webpack 1, используя метод строки запроса.

module: {
  loaders: [{
    test: /\.js$/,
    exclude: /node_modules/,
    loaders: [
      'react-hot',
      'babel-loader?' +
        'babelrc=false,' +
        'presets[]=es2015,' +
        'presets[]=stage-0,' +
        'presets[]=react'
      ]
  }] 
}

Обратите внимание на измененные имена свойств по всей цепочке.

Также обратите внимание, что я изменил предварительный набор es2015 на es2015-native-modules в настройке babel-loader. Это не имеет ничего общего с спецификацией options, это только то, что в том числе модули es6 позволяют использовать функцию древовидной записи, введенную в v2. Его можно оставить в покое, и он все равно будет работать, но ответ будет казаться неполным без указания очевидного обновления: -)

Ответ 4

Свойство test является просто регулярным выражением, поэтому вы можете одновременно проверять как jsx, так и кофе: test: /\.(jsx|coffee)$/

Sass/SCSS немного проще: test: /\.s[ac]ss$/