누군가 Webpack의 CommonsChunkPlugin을 설명 할 수 있습니까?


82

나는 CommonsChunkPlugin모든 진입 점을 살펴보고 그들 사이에 공통된 패키지 / 종속성이 있는지 확인하고 그들을 자신의 번들로 분리 한다는 일반적인 요점을 얻습니다 .

따라서 다음 구성이 있다고 가정합니다.

...
enrty : {
    entry1 : 'entry1.js', //which has 'jquery' as a dependency
    entry2 : 'entry2.js', //which has 'jquery as a dependency
    vendors : [
        'jquery',
        'some_jquery_plugin' //which has 'jquery' as a dependency
    ]
},
output: {
    path: PATHS.build,
    filename: '[name].bundle.js'
}
...

사용하지 않고 동고하면 CommonsChunkPlugin

3 개의 새로운 번들 파일로 끝납니다.

  • entry1.bundle.js이는에서 전체 코드를 포함 entry1.js하고 jquery자체 런타임을 포함
  • entry2.bundle.js이는에서 전체 코드를 포함 entry2.js하고 jquery자체 런타임을 포함
  • vendors.bundle.js이는에서 전체 코드를 포함 jquery하고 some_jquery_plugin자체 런타임을 포함

jquery페이지에 잠재적으로 3 번 로드 할 것이기 때문에 이것은 분명히 나쁘기 때문에 우리는 그것을 원하지 않습니다.

동봉하면 CommonsChunkPlugin

내가 전달하는 인수에 따라 CommonsChunkPlugin다음 중 하나가 발생합니다.

  • 사례 1 : 통과 { name : 'commons' }하면 다음 번들 파일이 생성됩니다.

    • entry1.bundle.js이는에서 전체 코드 포함 entry1.js에 대한 요구 사항을, jquery그리고 런타임을 포함하지 않는
    • entry2.bundle.js이는에서 전체 코드 포함 entry2.js에 대한 요구 사항을, jquery그리고 런타임을 포함하지 않는
    • vendors.bundle.js이는에서 전체 코드 포함 some_jquery_plugin에 대한 요구 사항을, jquery그리고 런타임을 포함하지 않는
    • commons.bundle.js완전한 코드를 jquery포함하고 런타임을 포함합니다.

    이렇게하면 전체적으로 더 작은 번들로 끝나고 런타임이 commons번들에 포함됩니다 . 꽤 괜찮지 만 이상적이지는 않습니다.

  • CASE 2 : 통과 { name : 'vendors' }하면 다음 번들 파일이 생성됩니다.

    • entry1.bundle.js이는에서 전체 코드 포함 entry1.js에 대한 요구 사항을, jquery그리고 런타임을 포함하지 않는
    • entry2.bundle.js이는에서 전체 코드 포함 entry2.js에 대한 요구 사항을, jquery그리고 런타임을 포함하지 않는
    • vendors.bundle.js여기에는 완전한 코드 jquerysome_jquery_plugin런타임이 포함됩니다.

    이렇게하면 전체적으로 더 작은 번들로 끝나지만 이제 런타임이 vendors번들에 포함됩니다 . 런타임이 이제 vendors번들 에 있기 때문에 이전 사례보다 약간 더 나쁩니다 .

  • CASE 3 : 통과 { names : ['vendors', 'manifest'] }하면 다음 번들 파일이 생성됩니다.

    • entry1.bundle.js이는에서 전체 코드 포함 entry1.js에 대한 요구 사항을, jquery그리고 런타임을 포함하지 않는
    • entry2.bundle.js이는에서 전체 코드 포함 entry2.js에 대한 요구 사항을, jquery그리고 런타임을 포함하지 않는
    • vendors.bundle.js이는에서 전체 코드를 포함 jquery하고 some_jquery_plugin및 런타임을 포함하지 않는
    • manifest.bundle.js 다른 모든 번들에 대한 요구 사항을 포함하고 런타임을 포함합니다.

    이렇게하면 전체적으로 더 작은 번들로 끝나고 런타임이 manifest번들에 포함됩니다 . 이것이 이상적인 경우입니다.

내가 이해하지 못하는 것 / 이해할 수없는 것

  • 에서 CASE 2 왜 우리는 끝낼 않았다 vendors모두 공통 코드 (포함 된 번들 jquery로부터 남아 무엇이든)과 vendors항목을 ( some_jquery_plugin)? 내 이해에서 CommonsChunkPlugin여기서 한 일은 공통 코드 ( jquery)를 모아서 vendors번들 로 출력하도록 강제했기 때문에 공통 코드를 vendors번들 로 "병합"한 것 입니다. some_jquery_plugin). 확인하거나 설명하십시오.

  • CASE 3 에서는 { names : ['vendors', 'manifest'] }플러그인에 전달했을 때 무슨 일이 있었는지 이해할 수 없습니다 . 왜 / 어떻게 vendors번들이 손상되지 않았고, jquery와 둘 다 포함되어 있으며 some_jquery_plugin, 언제 jquery는 공통 종속성이며, 생성 된 manifest.bundle.js파일이 생성 된 방식대로 생성 된 이유는 무엇입니까 (다른 모든 번들이 필요하고 런타임 포함)?


사례 1의 경우 minChunks 속성을 지정해야한다고 생각합니다.
Marko

10
나는 당신의 질문 에서 많은 것을 배웠습니다 . 감사합니다!
Rafael Eyng

1
이 요청 및 ❤이 플러그인에 내 혼란에게 모든 시간을 지우기 위해 정말 감사합니다
글렌 모하마드

아마도 누군가가 알고있을 것입니다.이 예제가 Webpack 4에서 어떻게 보일지?
StalkAlex

답변:


105

이것이 CommonsChunkPlugin작동 하는 방식입니다.

공통 청크는 여러 항목 청크가 공유하는 모듈을 "수신"합니다. 복잡한 구성의 좋은 예는 Webpack 저장소 에서 찾을 수 있습니다 .

CommonsChunkPlugin청크가 밀봉 디스크에 기록하기 직전, 그것은 메모리 동작 함을 의미 웹팩의 최적화 단계 동안 실행됩니다.

여러 개의 공통 청크가 정의되면 순서대로 처리됩니다. 귀하의 경우 3에서는 플러그인을 두 번 실행하는 것과 같습니다. 그러나 CommonsChunkPlugin는 모듈 이동 방식에 영향을 미치는 더 복잡한 구성 (minSize, minChunks 등)을 가질 수 있습니다.

사례 1 :

  1. 이 3 개 있습니다 entry청크 ( entry1, entry2vendors).
  2. 구성은 commons청크를 공통 청크로 설정합니다 .
  3. 플러그인은 commons공통 청크를 처리합니다 (청크가 존재하지 않기 때문에 생성됨).
    1. : 이것은 더 다른 청크 번 이상 사용되는 모듈 수집 entry1, entry2vendors사용 jquery모듈이 덩어리를 제거하고, 추가되도록 commons덩어리.
    2. commons청크는 것으로 표시된다 entry그동안 청크 entry1, entry2vendors청크로 표시 해제된다 entry.
  4. 마지막으로 commons청크는 entry청크이므로 런타임과 jquery모듈을 포함합니다 .

사례 2 :

  1. 이 3 개 있습니다 entry청크 ( entry1, entry2vendors).
  2. 구성은 vendors청크를 공통 청크로 설정합니다 .
  3. 플러그인은 vendors공통 청크를 처리합니다 .
    1. 다른 청크에서 두 번 이상 사용되는 모듈을 수집 entry1하고 entry2사용 jquery하여 이러한 청크에서 모듈을 제거합니다 ( 청크에 이미 포함되어 vendors있으므로 vendors청크에 추가되지 않음 ).
    2. vendors덩어리는 것으로 표시되어 entry그동안 덩어리 entry1entry2덩어리는 다음과 같이 표시 해제된다 entry.
  4. 마지막으로 vendors청크는 entry청크이므로 런타임과 jquery/ jquery_plugin모듈을 포함합니다.

사례 3 :

  1. 이 3 개 있습니다 entry청크 ( entry1, entry2vendors).
  2. 구성은 vendors청크와 manifest청크를 공통 청크로 설정합니다 .
  3. 플러그인은 manifest존재하지 않는 청크를 생성 합니다.
  4. 플러그인은 vendors공통 청크를 처리합니다 .
    1. 다른 청크에서 두 번 이상 사용되는 모듈을 수집 entry1하고 entry2사용 jquery하여 이러한 청크에서 모듈을 제거합니다 ( 청크에 이미 포함되어 vendors있으므로 vendors청크에 추가되지 않음 ).
    2. vendors덩어리는 것으로 표시되어 entry그동안 덩어리 entry1entry2덩어리는 다음과 같이 표시 해제된다 entry.
  5. 플러그인은 manifest공통 청크를 처리합니다 (청크가 존재하지 않기 때문에 생성됨).
    1. 다른 청크에서 두 번 이상 사용되는 모듈을 수집합니다. 두 번 이상 사용되는 모듈이 없으므로 모듈이 이동되지 않습니다.
    2. manifest청크로 플래그가 entry그동안 덩어리 entry1, entry2그리고 vendors으로 표시 해제된다 entry.
  6. 마지막으로 manifest청크는 entry청크이므로 런타임을 포함합니다.

도움이되기를 바랍니다.


제가 묻고 싶은 몇 가지 사항을 답변에 추가하십시오. 1) CASE 1에 대해 동일한 단계별 설명을 수행하여 답변이 1000 % 완료되도록 할 수 있습니까? 2) 플러그인을 실행 { names : ['vendors', 'manifest'] }한 번, 두 번 실행 비슷 { name : 'vendors' }하고 한 번 { name : 'manifest' }올바른? 3) "플러그인이 공통 청크를 처리합니다"라고 말하면 bundle.js파일에 뱉을 내용 을 메모리 에 생성한다는 의미입니다 . 맞습니까? 그것은 그것이 모두에서 파일 출력을 기록하지 않은 "일반적인 모든 청크 처리"때까지 4), 그것은 메모리에 전부
디미트리 Karagiannis

2
대답하고 싶으 시다면 질문이 하나 더 있습니다. 하자 위에서 내 예제에서 그런 말을, entry1.js그리고 entry2.js는 아닌 그들 사이의 또 다른 일반적인 파일을 한 jquery파일의 그것을 부르 자 ownLib.js. CASE 2 및 CASE 3 ownLib.js에서 vendors.bundle.js올바른 결과가 나올까요? 공급 업체 파일 이외의 공통 파일이 청크와 별도로 자체 청크로 분리되도록 어떻게 만들 수 vendors있습니까? 죄송합니다 당신을 귀찮게하지만, 난 여전히 웹팩 사용하는 방법을 배우고
디미트리 Karagiannis

7
네 맞습니다 : ownLib.js첫 번째 공통 덩어리에 배치됩니다. 다른 덩어리에서 공통 종속성을 수집하려면 다음과 같이 전달해야합니다 { names : ['common', 'vendors', 'manifest'] }..
Laurent Etiemble

6
훌륭한 질문, 훌륭한 답변, 훌륭한 토론. 마침내 얻은 것 같습니다.
oluckyman

3
저는 마지막 CommonsChunkPlugin 문서를 읽었으며 이것은 실행 후 처리 된 청크가 "항목으로 플래그가 지정되지 않음"을 읽은 첫 번째 장소입니다. 기본적으로 문제가있는 모든 것을 설명합니다. 한 번 이상 찬성 투표를 할 수 있다면 그렇게 할 것입니다.
Coderer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.