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.