Яке замовлення завантажувача для webpack?


86

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

Я спробував прочитати джерело, але навіть коли виявив біт, який, на мою думку, реалізує завантаження, я не можу зрозуміти, як він поводиться.

У документації також не згадується, як повинна поводитися ця ситуація.

Відповіді:


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

і

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

здаються рівними. У функціональному відношенні це те саме, що style(css(file))(дякую Мігелю).

Зверніть увагу, що loadersвони обчислюються справа наліво .


2
Хм, не дуже корисна поведінка Я думаю: - / я б скоріше використовував preLoaders для такої поведінки ...
w00t

18
Навантажувачі діють як функції, тому це справа наліво. Коли ви використовуєте це "style!css", уявіть їх як функції: style( css( file ) )... у цьому випадку cssце викликається першим.
Мігель Анджело

11
Оцінюючи від ПРАВО до ЛІВО, я певний час боровся. @ miguel-angelo ваше style( css( file ) )пояснення для мене полегшення.
Evi Song

1
ВПРАВО ВЛІВО, швидше за все, по суті означає ВНИЗ до ВЕРХУ, коли ми розглядаємо синтаксис Webpack 3 ... найнижче: спочатку саме внутрішня функція ...
Frank Nocke

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, в якому порядку вони виконуються?
Saras Arya

44
ЧОМУ ВОНЯТЬ ДНЕ ДО ВЕРХУ! ??
light24bulbs

можливо, ви захочете змінити відповідь, вказавши, що "кінцевий завантажувач" у документації є loaderOneу вашому прикладі
aaaaaa

1
@ light24bulbs, щоб ви могли додати додаткові навантажувачі з простими .pushправилами і не турбуватися про їх попереднє додавання.
Сарке

2

Ця відповідь була для мене корисною, але я хотів би доповнити ще одним пунктом, який впливає на порядок завантажувачів, а саме - ім'я завантажувача! підхід.

Скажімо, url-loaderу вашій конфігурації є вищий пріоритет, ніж file-loaderви, і ви хочете імпортувати шлях до зображення за допомогою останнього. Якщо нічого не робити, файл буде імпортовано через url-loader(що створює закодовану URL-адресу даних).

Префікс імпорту з file-loader!спрямовує імпорт до цього завантажувача.

import image from 'file-loader!./my-img.png'

3
Так, хоча я люблю уникати цього, оскільки тоді ви не можете вирішити під час збірки, файл повинен бути посиланням чи вбудованим. Ви також можете почати з того, !!щоб пропустити будь-які інші навантажувачі, до речі ...
w00t
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.