웹팩 스타일 로더 vs CSS 로더


238

두 가지 질문이 있습니다.

1) CSS 로더스타일 로더 는 두 개의 웹팩 로더입니다. 나는 둘 사이의 차이점을 파악할 수 없었다. 둘 다 동일한 작업을 수행 할 때 두 개의 로더를 사용해야하는 이유는 무엇입니까?

2) 위의 Readme.md 파일에서 언급 된이 .useable.less 및 .useable.css는 무엇입니까?


답변:


283

CSS의 로더는 CSS 파일을 받아와 CSS를 반환 imports하고 url(...)웹팩의를 통해 해결 require기능 :

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

실제로하지 않습니다 반환 된 CSS와 아무것도.

스타일 로더는 CSS를 가져와 실제로 페이지에 스타일이 활성화되도록 CSS를 페이지에 삽입합니다.

서로 다른 작업을 수행하지만 Unix 파이프와 같이 서로 연결하는 것이 유용합니다. 예를 들어 Less CSS 전처리기를 사용하는 경우

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

  1. 돌려 file.less적은 로더와 일반 CSS로
  2. CSS 로더를 사용하여 CSS의 모든 imports및을 해결하십시오.url(...)
  3. 스타일 로더를 사용하여 해당 스타일을 페이지에 삽입

24
페이지에 스타일을 삽입하여 어떤 메나를 말합니까? CSS에 ExtractTextPlugin을 사용하고 있으며 작성한 내용에 따라 스타일 로더를 사용해서는 안됩니다. 또한 스타일 로더를 사용하면 추출 플러그인을 사용할 때까지 내 스타일에 JS가 번들로 제공됩니다. 참고 : 웹팩을 사용하고 있습니다. 그리고 그 스타일 로더를 제거한 후에, 위에서 이미 추출 플러그인에 의해 생성 된 별도의 파일에 CSS를 가지고 있다고 말했기 때문에 상황이 변하지 않습니다.
myDoggyWritesCode

6
@ user3241111 나는 그가 이것을 의미한다고 생각한다 : " <style>태그 를 삽입하여 DOM에 CSS를 추가한다 "( github.com/webpack/style-loader 공식 문서에서 복사 )
exmaxx

1
따라서 webpack은 처리 된 모든 CSS를 제거하고 문서 헤드에 배치하여 <link> 태그 및 URL 스타일 정의에 대한 HTTP 요청을 피할 수 있습니까? 이것이 요점이라고 생각합니다. 화려 함과 화려 함도 마찬가지입니다. 이 방법으로 로딩하는 것이 더 빠르다고 확신합니다. 그러나 나는 틀릴 수 있습니다.
Tamb

하여 imports나는 가정 당신은 참조 @import지시. 기본적으로이 지시문은 가져온 CSS 규칙을 가져 오기 도구로 병합하지 않고 다른 GET요청을 작성 합니다. css-loader병합 된 출력을 반환 한다고 말하고 있습니까?
adi518


55

css-loaderCSS 파일에서 문자열로 읽습니다. 당신은 그것을 대체 raw-loader하고 많은 상황에서 동일한 효과를 얻을 수 있습니다. 파일 내용을 읽고 다른 내용은 읽지 않기 때문에 다른 로더와 연결하지 않으면 기본적으로 쓸모가 없습니다.

style-loader해당 스타일을 사용하여 해당 스타일을 포함하는 <style>페이지 <head>요소에 태그를 만듭니다 .

bundle.js사용 후 자바 스크립트를 보면 style-loader생성 된 코드에 주석이 표시됩니다.

// style-loader : 태그를 추가하여 DOM에 CSS를 추가합니다.

예를 들어

<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>

이 예제는 이 튜토리얼 에서 나온 것입니다 . style-loader라인을 변경하여 파이프 라인에서 파이프 라인 을 제거하면

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

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

당신은 <style>멀리가는 것을 볼 수 있습니다.


5
언제 css-loader와 반대로 사용해야 raw-loader합니까?
Royi Namir

4
css-loader는 import / require ()와 같이 @import와 url ()을 해석하여 해결합니다. 원시 로더는 지정된 파일 만로드합니다.
앤드류

13

두 번째 질문 인 "위의 Readme.md 파일에 언급 된이 .useable.less 및 .useable.css는 무엇입니까?"에 대답하기 위해 기본적으로 스타일이 require'd인 경우 스타일 로더 모듈은 자동으로 <script>태그를 DOM에 태그를 삽입합니다. 해당 태그는 브라우저 창이 닫히거나 다시로드 될 때까지 DOM에 남아 있습니다. 스타일 로더 모듈은 또한 개발자가 스타일을 추가하고 더 이상 필요하지 않을 때 스타일을 추가 할 수 있도록하는 소위 "참조 횟수 API"를 제공합니다. API는 다음과 같이 작동합니다.

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

일반적으로이 API를 사용하여로드 된 스타일 시트의 확장자는 단순히 ".css"가 아니라 ".usable.css"입니다.


이 답변은 Webpack 구성에 관한 것이 아닙니다.
앤드류 코스터

@AndrewKoster 나는 당신이 무슨 뜻인지 이해하지 못합니다. 스타일 로더 모듈의 내부 작업 및 파일 이름 지정 규칙에 대한 원래 포스터의 두 부분으로 된 질문의 두 번째 부분에 대한 답변입니다.
chrisarnesen

물론, 당신이 말했듯이, 질문에는 두 부분이 있습니다. 이 답변 (및 허용되는 답변)은 질문의 첫 번째 부분을 완전히 무시합니다. 더 중요하고 일반적으로 적용 가능한 부분입니다. 이 로더가 무엇인지, 그리고 로더를 구성하는 방법에 대한 질문을 다루는 유일한 대답은 어떤 이유로 투표하지 않는 Brian Ogden의 답변입니다.
앤드류 코스터

이 이상한 느낌표가 미친 느낌표와 함께 사용되지 않지만 Webpack에서 이러한 로더를 구성하는 방법을 알아야합니다. 내 유스 케이스는 미친 요구 구문으로 수행하는 모든 것보다 더 일반적인 것 같습니다.
앤드류 코스터

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.