Запретить загрузчики Webpack по умолчанию

В Webpack встроен загрузчик JSON. Как я могу написать пользовательский загрузчик, который не пытается запустить встроенный загрузчик JSON на результат?

По сути, я хочу, чтобы мой загрузчик взял объект конфигурации (хранящийся в файле JSON) и сгенерировал исходный код из этой конфигурации, который больше не является допустимым JSON, это JavaScript (который впоследствии можно было передать через babel-loader).

Вот действительно глупый, надуманный пример. Исходный файл - это файл JSON, но я хочу, чтобы вывод моего загрузчика был неким JS.

погрузчик

function compile(doc) {
  return `alert(${JSON.stringify(doc.title)})`
}

function myLoader(source) {
  return compile(JSON.parse(source))
}

Конфигурация Webpack

rules: [
  {
    test: /\.json$/,
    use: [
      'babel-loader',
      'my-loader',
    ],
  },
],

Вместо этого я получаю эту ошибку:

ERROR in ./config.json
Module parse failed: Unexpected token ' in JSON at position 0
You may need an appropriate loader to handle this file type.
SyntaxError: Unexpected token ' in JSON at position 0
  at JSON.parse (<anonymous>)
  at JsonParser.parse (.../node_modules/webpack/lib/JsonParser.js:15:21)

Как вы можете видеть из трассировки стека, это происходит из webpack/lib/JsonParser.js, Как я могу сказать Webpack в первую очередь не запускать его встроенный анализатор JSON, а вместо этого делегировать обработку файлов JSON, которые соответствуют этому правилу, моему загрузчику?

1 ответ

Решение

Я думаю, что я понял это, хотя это, кажется, недокументированная особенность (по крайней мере, я не мог найти это в документации по конфигурации.

Похоже, что одно из свойств, которое вы можете передать в объекте Rule: type, Установив его на javascript/auto Вы можете переопределить JSON-анализатор по умолчанию и сделать так, чтобы он анализировал источник файла как JavaScript.

Это свойство находится в схеме JSON, используемой Webpack для проверки объекта конфигурации.

rules: [
  {
    test: /\.json$/,
    use: [
      'babel-loader',
      'my-loader',
    ],
    type: 'javascript/auto',
  },
],
Другие вопросы по тегам