Jaka jest kolejność ładowania dla webpacka?

86

Kiedy mam konfigurację modułu ładującego z wieloma testami pasującymi do pliku, spodziewałbym się, że zostanie użyty tylko pierwszy pasujący program ładujący, ale wydaje się, że tak nie jest.

Próbowałem odczytać źródło, ale nawet kiedy znalazłem bit, który moim zdaniem implementuje ładowanie, nie mogę zrozumieć, jak się zachowuje.

Dokumentacja również nie wspomina, jak ta sytuacja powinna się zachowywać.

w00t
źródło

Odpowiedzi:

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

i

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

wydają się być równe. Pod względem funkcji jest to to samo, co style(css(file))(dzięki Miguel).

Zauważ, że wewnątrz loaderssą oceniane od prawej do lewej .

Juho Vepsäläinen
źródło
2
Hmm, niezbyt przydatne zachowanie Myślę: - / Wolałbym raczej użyć preLoaderów do tego zachowania ...
w00t
19
Programy ładujące działają jak funkcje, dlatego jest od prawej do lewej. Kiedy tego używasz "style!css", wyobraź sobie je jako funkcje: style( css( file ) )... w tym przypadku cssjest wywoływana jako pierwsza.
Miguel Angelo
11
Ocena od PRAWEGO do LEWEGO sprawiała, że ​​przez chwilę walczyłem. @ miguel-angelo Twoje style( css( file ) )wyjaśnienie jest dla mnie ulgą.
Evi Song
1
Od prawej do lewej najprawdopodobniej zasadniczo oznacza OD DOŁU do GÓRY, kiedy patrzymy na składnię Webpacka 3 ... najbardziej na dole: pierwsza aka najbardziej wewnętrzna funkcja ...
Frank Nocke
1
Nie wiem, kiedy to zostało dodane, ale w końcu jest dokumentacja dotycząca zamówienia: webpack.js.org/concepts/loaders/#loader-features Loadery można łączyć w łańcuch . Każdy moduł ładujący w łańcuchu stosuje transformacje do przetwarzanego zasobu. Łańcuch jest wykonywany w odwrotnej kolejności. Pierwszy program ładujący przekazuje swój wynik (zasób z zastosowanymi transformacjami) do następnego i tak dalej. Wreszcie pakiet sieciowy oczekuje, że ostatni moduł ładujący w łańcuchu zwróci JavaScript.
Eric Majerus
61

Oficjalna dokumentacja naprawdę dobrze to wyjaśnia. Niestety wszystkie niezbędne informacje są rozsiane w różnych sekcjach dokumentacji. Pozwól, że podsumuję wszystko, co musisz wiedzieć.

1.

Upewnij się, że są we właściwej kolejności (od dołu do góry).

2.

Są to funkcje, które pobierają źródło pliku zasobów jako parametr i zwracają nowe źródło.

3.

Ładowarki można łączyć łańcuchami. Są one stosowane w potoku do zasobu. Oczekuje się, że końcowy program ładujący zwróci JavaScript; każdy inny program ładujący może zwrócić źródło w dowolnym formacie, które jest przekazywane do następnego programu ładującego.

Więc...

Jeśli masz somefile.cssi jesteś przepuszczenie go przez loaderOne, loaderTwo, loaderThreeto zachowuje się jak zwykły funkcji przykuty.

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

znaczy dokładnie to samo, co ...

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

Jeśli pochodzisz z chrząknięcia || świat łyków jest zagmatwany. Po prostu przeczytaj kolejność ładowarek od prawej do lewej.

Paweł Grzybek
źródło
1
Mam tę tablicę module.loaders, w jakiej kolejności wykonują?
Saras Arya,
44
DLACZEGO ŁADUJĄ OD GÓRY DO GÓRY! ??
light24bulbs
możesz zmodyfikować odpowiedź, aby określić, że "końcowy program ładujący" w dokumentacji jest loaderOnew twoim przykładzie
aaaaaa
1
@ light24bulbs, dzięki czemu można łatwo dodać dodatkowe ładowarki z prostym .pushdo reguł i nie martwić się o ich dodawanie.
Sarke
2

Ta odpowiedź była dla mnie pomocna, ale chciałbym uzupełnić inną kwestią, która ma wpływ na kolejność modułu ładującego, a mianowicie nazwę ładowania! podejście.

Powiedzmy, że masz url-loaderw swojej konfiguracji plik o wyższym priorytecie niż file-loaderi chcesz zaimportować ścieżkę obrazu z tym drugim. Nie robienie niczego spowoduje zaimportowanie pliku przez url-loader(co spowoduje utworzenie zakodowanego adresu URL danych).

Przedrostek importu znakiem file-loader!skierowałby import do tego programu ładującego.

import image from 'file-loader!./my-img.png'
E. Sundin
źródło
3
Tak, chociaż wolę tego unikać, ponieważ wtedy nie możesz zdecydować w czasie kompilacji, czy plik ma być linkiem, czy osadzony. Możesz także zacząć od, !!aby pominąć inne ładowarki BTW…
w00t