Webpack style-loader vs css-loader


238

Mam dwa pytania.

1) CSS Loader i Style Loader to dwa moduły ładujące webpack. Nie mogłem zrozumieć różnicy między nimi. Dlaczego muszę używać dwóch ładowarek, gdy oba wykonują tę samą pracę?

2) Co to jest .useable.less i .useable.css wspomniane w powyższych plikach Readme.md?


Odpowiedzi:


283

Ładowarka CSS zajmuje plik CSS i zwraca z CSS importsi url(...)rozwiązane poprzez WebPACK w requirefunkcjonalności:

var css = require("css!./file.css");
// => returns css code from file.css, resolves imports and url(...) 

W rzeczywistości nic nie robi ze zwróconym CSS.

Moduł ładujący style pobiera CSS i faktycznie wstawia go na stronę, aby style były aktywne na stronie.

Wykonują różne operacje, ale często przydaje się ich połączenie, np. Potoki Unix. Na przykład, jeśli korzystasz z preprocesora Less CSS , możesz go użyć

require("style!css!less!./file.less")

do

  1. Zamień się file.lessw zwykły CSS za pomocą modułu ładującego Less
  2. Rozwiązać wszystkich importsi url(...)S w CSS z ładowaczem CSS
  3. Wstaw te style do strony za pomocą modułu ładującego style

24
Czy możesz powiedzieć, co robisz, wstawiając styl na stronę? Ponieważ używam ExtractTextPlugin dla CSS i zgodnie z tym, co napisałeś, nie powinienem używać modułu ładującego style. Czuję też, że użycie modułu ładującego style powoduje, że mój styl jest dołączany do JS, dopóki nie użyję wtyczki do ekstrakcji. Uwaga: używam webpacka. Po usunięciu modułu ładującego style dla mnie nic się nie zmieniło, ponieważ właśnie powiedziałem powyżej, że mam już swój CSS w osobnym pliku utworzonym przez wypakowanie wtyczki ..
myDoggyWritesCode

6
@ user3241111 Myślę, że miał na myśli to: „Dodaje CSS do DOM poprzez wstrzyknięcie <style>tagu” (jest to kopiowane z oficjalnej dokumentacji na github.com/webpack/style-loader )
exmaxx 10.10.16

1
Pomysł polega na tym, że webpack usuwa wszystkie przetworzone pliki CSS i umieszcza je w nagłówku dokumentu, aby uniknąć żądań HTTP dotyczących tagów <link> i definicji stylów adresów URL? Zakładam, że o to chodzi. Takie rzeczy jak glamour i glamour również to robią. Jestem prawie pewien, że w ten sposób ładuje się szybciej. Ale mogę się mylić.
Tamb

Przez importsZakładam, że odnoszą się do @importdyrektyw. Domyślnie ta dyrektywa nie łączy importowanych reguł CSS z importerem, ale tworzy kolejne GETżądanie. Czy mówisz, że css-loaderzwróci połączone wyjście?
adi518


55

css-loaderwczytuje plik css jako ciąg znaków. Możesz go zastąpić raw-loaderi uzyskać ten sam efekt w wielu sytuacjach. Ponieważ po prostu czyta zawartość pliku i nic więcej, jest w zasadzie bezużyteczny, chyba że połączysz go z innym programem ładującym.

style-loaderpobiera te style i tworzy <style>znacznik w <head>elemencie strony zawierającym te style.

Jeśli spojrzysz na javascript bundle.jspo użyciu style-loader, zobaczysz komentarz w wygenerowanym kodzie, który mówi

// style-loader: Dodaje trochę css do DOM poprzez dodanie znacznika

Na przykład,

<html>
    <head>
        <!-- this tag was created by style-loader -->
        <style type="text/css">
            body {
                background: yellow;
            }
        </style>
    </head>
    <body>
        <script type="text/javascript" src="bundle.js" charset="utf-8"></script>
    </body>
</html>

Ten przykład pochodzi z tego samouczka . Jeśli usuniesz style-loaderz potoku, zmieniając linię

require("!style-loader!css-loader!./style.css");

do

require("css-loader!./style.css");

zobaczysz, że <style>odchodzi.


5
więc kiedy powinienem używać css-loaderw przeciwieństwie do raw-loader?
Royi Namir

4
Program ładujący css interpretuje @import i url () jak import / need () i je rozwiąże. Moduł ładujący raw ładuje tylko określony plik.
andrew

13

Aby odpowiedzieć na drugie pytanie „Co to jest. Useable.less i .useable.css wspomniane w powyższych plikach Readme.md?”, Domyślnie, gdy istnieje styl require'd, moduł ładujący style automatycznie wstrzykuje <script>znacznik do DOM i ten znacznik pozostaje w DOM, dopóki okno przeglądarki nie zostanie zamknięte lub ponownie załadowane. Moduł modułu ładującego style oferuje również tak zwane „API zliczające referencje”, które pozwala programistom dodawać style i usuwać je później, gdy nie są już potrzebne. Interfejs API działa w następujący sposób:

const style = require('style/loader!css!./style.css')
// The "reference counter" for this style starts at 0
// The style has not yet been injected into the DOM
style.use()  // increments counter to 1, injects a <style> tag
style.use()  // increments counter to 2
style.unuse()  // decrements counter to 1
style.unuse()  // decrements counter to 0, removes the <style> tag

Zgodnie z konwencją arkusze stylów ładowane przy użyciu tego interfejsu API mają rozszerzenie „.usable.css” zamiast po prostu „.css” jak wyżej.


Ta odpowiedź nie dotyczy konfiguracji pakietu WebPack.
Andrew Koster

@AndrewKoster Nie rozumiem, co masz na myśli. Jest to odpowiedź na drugą część dwuczęściowego pytania oryginalnego plakatu na temat wewnętrznego działania i konwencji nazewnictwa plików modułu modułu ładującego style.
chrisarnesen

Jasne, ale jak mówisz, pytanie składa się z dwóch części. Ta odpowiedź (i odpowiedź zaakceptowana) całkowicie ignoruje pierwszą część pytania, która jest ważniejszą i ogólnie obowiązującą częścią. Jedyną odpowiedzią na pytanie, czym są te moduły ładujące i jak je skonfigurować, jest odpowiedź Briana Ogdena, na którą nikt nie głosuje (z jakiegoś powodu).
Andrew Koster,

Nie używam żadnej z tych dziwnych wymaga składni z szalonymi wykrzyknikami, ale wciąż muszę wiedzieć, jak skonfigurować te moduły ładujące w Webpack. Mój przypadek użycia wydaje się być bardziej powszechny niż cokolwiek, co wszyscy robicie ze zwariowanym wymaga składni.
Andrew Koster,

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.