Какой порядок загрузчика для webpack?

86

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

Я попытался прочитать исходный код, но даже когда я нашел бит, который, как мне кажется, реализует загрузку, я не могу понять, как он себя ведет.

В документации также не упоминается, как должна вести себя эта ситуация.

w00t
источник

Ответы:

108
{
    test: /\.css$/,
    loaders: ['style'],
},
{
    test: /\.css$/,
    loaders: ['css'],
},

а также

{
    test: /\.css$/,
    loaders: ['style', 'css'],
},

кажутся равными. Функционально это то же самое, что и style(css(file))(спасибо Мигелю).

Обратите внимание, что внутри loadersони оцениваются справа налево .

Юхо Вепсяляйнен
источник
2
Хм, не очень полезное поведение, я думаю: - / Я бы предпочел использовать preLoaders для этого поведения ...
w00t
19
Загрузчики действуют как функции, поэтому справа налево. Когда вы используете это "style!css", представляйте их как функции: style( css( file ) )... в этом случае cssвызывается первым.
Мигель Анджело
11
Оценка от ВПРАВО к ЛЕВО заставила меня какое-то время бороться. @ miguel-angelo ваше style( css( file ) )объяснение приносит мне облегчение.
Evi Song
1
ВПРАВО на ВЛЕВО, скорее всего, по существу означает СНИЗУ к ВЕРХУ, когда мы смотрим на синтаксис Webpack 3 ... самый нижний: первая или самая внутренняя функция ...
Фрэнк
1
Я не знаю, когда это было добавлено, но наконец-то появилась документация о порядке: webpack.js.org/concepts/loaders/#loader-features Загрузчики могут быть связаны . Каждый загрузчик в цепочке применяет преобразования к обработанному ресурсу. Цепочка выполняется в обратном порядке. Первый загрузчик передает свой результат (ресурс с примененными преобразованиями) следующему и так далее. Наконец, webpack ожидает, что JavaScript будет возвращен последним загрузчиком в цепочке.
Эрик Майерус
61

Официальная документация очень хорошо это объясняет. К сожалению, вся необходимая информация разбросана по разным разделам документации. Позвольте мне подытожить все, что вам нужно знать.

1.

Убедитесь, что они расположены в правильном порядке (снизу вверх).

2.

Это функции, которые принимают в качестве параметра источник файла ресурсов и возвращают новый источник.

3.

Погрузчики можно приковывать цепями. Они применяются в конвейере к ресурсу. Ожидается, что последний загрузчик вернет JavaScript; каждый другой загрузчик может возвращать исходный код в произвольном формате, который передается следующему загрузчику.

Так...

Если у вас есть somefile.cssи вы проходите через loaderOne, loaderTwo, loaderThreeэто ведет себя как обычная цепь , функция.

{
    test: /\.css$/,
    loaders: ['loaderOne', 'loaderTwo', 'loaderThree']
}

означает в точности то же, что и ...

loaderOne(loaderTwo(loaderThree(somefile.css)))

Если вы исходите из ворчания || мир глотка сбивает с толку. Просто прочтите порядок загрузчиков справа налево.

Павел Гжибек
источник
1
У меня есть массив модулей module.loaders, в каком порядке они выполняются?
Сарас Арья
44
ПОЧЕМУ ОНИ ЗАГРУЖАЮТ ВЕРХ! ??
light24bulbs
вы можете изменить ответ, loaderOne
указав,
1
@ light24bulbs, чтобы вы могли добавлять дополнительные загрузчики с помощью простых .pushправил и не беспокоиться о них.
Sarke
2

Этот ответ был для меня полезен, но я хотел бы дополнить еще одним моментом, который влияет на порядок загрузчика, а именно имя загрузки! подход.

Допустим, у вас есть url-loaderв вашей конфигурации более высокий приоритет, чем, file-loaderи вы хотите импортировать путь изображения с последним. Если ничего не делать, файл будет импортирован через url-loader(что создает закодированный URL-адрес данных).

Приставка к импорту с помощью file-loader!будет направлять импорт в этот загрузчик.

import image from 'file-loader!./my-img.png'
Э. Сундин
источник
3
Да, хотя мне нравится избегать этого, потому что тогда вы не можете решить во время сборки, должен ли файл быть ссылкой или встроенным. Вы также можете начать с !!пропуска любых других загрузчиков. Кстати…
w00t