prefetchPlugin 및 분석 도구를 사용하여 웹팩의 빌드 시간을 최적화하는 방법은 무엇입니까?


96

이전 연구 :

웹팩의 위키가 말했듯이 분석 도구를 사용하여 빌드 성능을 최적화 할 수 있습니다.

에서 : https://github.com/webpack/docs/wiki/build-performance#hints-from-build-stats

빌드 통계의 힌트

빌드를 시각화하고 빌드 크기와 빌드 성능을 최적화 할 수있는 방법에 대한 힌트를 제공 하는 분석 도구 가 있습니다 .

webpack --profile --json> stats.json을 실행하여 필요한 JSON 파일을 생성 할 수 있습니다.


나는 (통계 파일을 생성 여기에 해당 ) 웹팩의 analize 도구에 업로드
하고 아래 힌트 탭 나는 prefetchPlugin을 사용했다 :

에서 : http://webpack.github.io/analyse/#hints

긴 모듈 빌드 체인

빌드 성능을 높이려면 프리 페치 를 사용하십시오 . 체인 중간 에서 모듈을 미리 가져옵니다 .


prefechPlugin에서 사용할 수있는 유일한 문서는 다음과 같습니다.

출처 : https://webpack.js.org/plugins/prefetch-plugin/

PrefetchPlugin

new webpack.PrefetchPlugin([context], request)

요구가 발생하기 전에 해결되고 빌드되는 일반 모듈에 대한 요청입니다. 이것은 성능을 향상시킬 수 있습니다. 먼저 빌드를 프로파일 링하여 영리한 프리 페치 지점을 결정하십시오 .



내 질문 :

  • prefetchPlugin을 올바르게 사용하는 방법은 무엇입니까?
  • 분석 도구와 함께 사용하기에 적합한 워크 플로우는 무엇입니까?
  • prefetchPlugin이 작동하는지 어떻게 알 수 있습니까? 어떻게 측정 할 수 있습니까?
  • 체인의 중간에서 모듈 을 프리 페치 한다는 것은 무엇을 의미 합니까?

몇 가지 예를 정말 감사하겠습니다

prefechPlugin 및 분석 도구를 사용하려는 다음 개발자에게이 질문이 귀중한 리소스가되도록 도와주세요. 감사합니다.


1
통계 분석기 도구를 어떻게 사용해야합니까? 업로드를 클릭해도 아무 일도 일어나지 않고 제출 버튼이 없습니다. "사용 예"만
— TetraDev 2016 년

콘솔 출력에 Uncaught SyntaxError: Unexpected token r in JSON at position 0stats.json을 업로드 할 때 표시됩니다
— TetraDev

1
@TetraDev 이것은 JSON 파일에 오류가 있음을 의미합니다. 텍스트 편집기로 열어보고 유효한 JSON처럼 보이지 않는 것이 있는지 확인하십시오. (첫 번째 줄에서 Webpack의 디버그 출력과 동일한 문제가 있습니다).
— maufl 2013-06-13

문서가 > stats.json있지만 파서를 중단하는 상단에 추가 몇 줄을 작성합니다
— Alex Riina

답변:


35

예, 프리 페치 플러그인 문서는 거의 존재하지 않습니다. 스스로 알아 낸 후에는 사용하기가 매우 간단하고 유연성이별로 없습니다. 기본적으로 컨텍스트 (선택 사항)와 모듈 경로 (컨텍스트에 상대적)라는 두 개의 인수를 사용합니다. 귀하의 경우 컨텍스트는 /absolute/path/to/your/project/node_modules/react-transform-har/스크린 샷의 물결표가 node_moduleswebpack의 node_module 해상도를 참조한다고 가정합니다 .

실제 프리 페치 모듈은 이상적으로는 모듈 종속성 깊이가 3 개 이하이어야합니다. 따라서 귀하의 경우에는 isFunction.js빌드 체인이 긴 모듈이며 이상적으로는 미리 가져와야합니다.getNative.js

그러나 빌드 체인 종속성이 웹팩에 의해 자동으로 최적화되어야하는 모듈 종속성을 참조하기 때문에 구성에 펑키 한 부분이 있다고 생각합니다. 어떻게 얻었는지 모르겠지만 우리의 경우 node_modules의 긴 빌드 체인에 대한 경고가 표시되지 않습니다. 대부분의 긴 빌드 체인은 scss가 필요한 깊이 중첩 된 반응 구성 요소 때문입니다. 즉 :

여기에 이미지 설명 입력

어쨌든 다음과 같이 각 경고에 대해 새 플러그인을 추가해야합니다.

plugins: [
    new webpack.PrefetchPlugin('/web/', 'app/modules/HeaderNav.jsx'),
    new webpack.PrefetchPlugin('/web/', 'app/pages/FrontPage.jsx')
];

두 번째 인수는 모듈의 상대 위치에 대한 문자열이어야합니다. 이것이 의미가 있기를 바랍니다.


나는 내 빌드 중 일부를 얻으려고 노력하고 있으며 설명 후에도이 도구를 사용하는 방법에 대해 여전히 혼란 스럽습니다. 정확히 '컨텍스트'의 의미와 프리 페치의 각 매개 변수가 무엇이어야하는지 확장 할 수 있습니까? 플러그인에서 정확히 무엇을하는지 잘
— 모르겠습니다

한동안 사용하지 않았지만 여전히 동일합니다. 플러그인에는 두 개의 인수 만 있어야합니다. 모듈의 컨텍스트 하나, 상황, 그래서 예를 들어 app/components/module.jsx것 'app'나는 두 번째는, 즉 상대 위치를해야한다고 생각'components/module.jsx'
— 4m1r

1
좋아요, 또 다른 패스가 있습니다. 적어도 24 개의 PrefetchPlugin 배열을 시도했지만 긴 빌드 체인에서 제거 할 수있는 것은 없습니다. 나는 실제로 긴 빌드 체인에있는 노드 모듈이있는 포스터와 동일한 문제를 겪고 있으며 그것을 프리 페치하려고합니다. 웹팩이이 상황을 처리하는 방법을 모르는지 모르겠습니다.
— ThrowsException

handlebars.js를 사용하는 프로젝트의 성능을 크게 향상시키기 위해 프리 페치 플러그인을 사용했습니다. 저에게 new webpack.PrefetchPlugin(__dirname + "/node_modules", "handlebars/runtime.js"),
— Andre

또한 프리 페치하려는 것이 패키지가 아닌 경우 (예 :) 요청 문자열을 node_modules전달할 수 있습니다 . 첫 번째 인수 인 context 는 선택 사항입니다.
— natchiketa

2

당신의 사슬의 중간은 아마도 중간 쯤에 react-transform-hmr/index.js시작될 것입니다 . 당신은 시도 할 수 PrefetchPlugin('react-transform-hmr/index')하고 빌드로 총 시간까지 속도를하는 데 도움이 있는지 확인하기 위해 프로필을 다시 실행하십시오.


악화 .. 2361ms에 2351ms에서, 그것은합니다 alse에서 오류가 발생합니다Entry module not found: Error: Cannot resolve module 'react-transform-hmr/index' in /Users/asafkatz/Development/my-react-builerplate
— Asaf 카츠

4
음, 10ms 차이는 나쁘지 않으며 그 차이는 통계적으로 중요하지 않습니다. 나는 승 / 여러 가지 놀, 줄 react-transform-hmr또는 react-transform-hmr/index.js등
— 아론 젠슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.