Làm cách nào để tối ưu hóa thời gian xây dựng của webpack bằng cách sử dụng công cụ phân tích & prefetchPlugin?


96

Nghiên cứu trước đây:

Như wiki của webpack đã nói, có thể sử dụng công cụ phân tích để tối ưu hóa hiệu suất xây dựng:

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

Gợi ý từ thống kê bản dựng

Có một công cụ phân tích trực quan hóa bản dựng của bạn và cũng cung cấp một số gợi ý về cách tối ưu hóa kích thước bản dựng và hiệu suất bản dựng .

Bạn có thể tạo tệp JSON cần thiết bằng cách chạy webpack --profile --json> stats.json


Tôi tạo tệp thống kê ( có sẵn tại đây ) tải nó lên công cụ analize của webpack
và trong tab Gợi ý, tôi đã yêu cầu sử dụng prefetchPlugin:

từ: http://webpack.github.io/analyse/#hints

Chuỗi xây dựng mô-đun dài

Sử dụng tìm nạp trước để tăng hiệu suất bản dựng. Tìm nạp trước một mô-đun từ giữa chuỗi .


Tôi đã đào từ trong ra ngoài để tìm tài liệu duy nhất có sẵn trên PrechPlugin là:

từ: https://webpack.js.org/plugins/prefetch-plugin/

PrefetchPlugin

new webpack.PrefetchPlugin([context], request)

Yêu cầu cho một mô-đun bình thường, được giải quyết và xây dựng ngay cả trước khi một yêu cầu đối với nó xảy ra. Điều này có thể tăng hiệu suất. Trước tiên, hãy cố gắng lập hồ sơ bản dựng để xác định các điểm tìm nạp trước thông minh .



Những câu hỏi của tôi:

  • Làm thế nào để sử dụng đúng cách prefetchPlugin?
  • Quy trình làm việc phù hợp để sử dụng nó với công cụ Phân tích là gì?
  • Làm cách nào để biết liệu prefetchPlugin có hoạt động không? làm thế nào tôi có thể đo lường nó?
  • Ý nghĩa của việc Prefetch một module từ giữa chuỗi ?

Tôi thực sự đánh giá cao một số ví dụ

Vui lòng giúp tôi biến câu hỏi này thành tài nguyên có giá trị cho nhà phát triển tiếp theo, những người muốn sử dụng PrechPlugin và các công cụ Phân tích. Cảm ơn bạn.


Chúng ta phải sử dụng công cụ phân tích thống kê như thế nào? Khi tôi nhấp vào tải lên, không có gì xảy ra và không có nút gửi. Chỉ "sử dụng ví dụ"
TetraDev

Đầu ra của bảng điều khiển cho biết Uncaught SyntaxError: Unexpected token r in JSON at position 0khi tải lên bất kỳ thống kê nào.json
TetraDev

1
@TetraDev điều này có nghĩa là bạn gặp lỗi trong tệp JSON của mình. Hãy thử mở nó bằng trình soạn thảo văn bản và xem có thứ gì đó không giống như JSON hợp lệ hay không. (Tôi gặp vấn đề tương tự với đầu ra gỡ lỗi từ Webpack trên dòng đầu tiên).
maufl

Các tài liệu có > stats.jsonnhưng mà viết một vài dòng thêm ở đầu mà phá vỡ các phân tích cú pháp
Alex Riina

Câu trả lời:


35

Vâng, tài liệu plugin tìm nạp trước khá nhiều không tồn tại. Sau khi tự mình tìm ra, nó khá đơn giản để sử dụng và không có nhiều tính linh hoạt đối với nó. Về cơ bản, nó cần hai đối số, ngữ cảnh (tùy chọn) và đường dẫn mô-đun (liên quan đến ngữ cảnh). Bối cảnh trong trường hợp của bạn sẽ /absolute/path/to/your/project/node_modules/react-transform-har/giả định rằng dấu ngã trong ảnh chụp màn hình của bạn đang đề cập đến node_modulestheo độ phân giải node_module của webpack .

Mô-đun tìm nạp trước thực tế nên lý tưởng không quá ba phần phụ thuộc mô-đun. Vì vậy, trong trường hợp của bạn isFunction.jslà mô-đun có chuỗi xây dựng dài và lý tưởng là mô-đun này nên được tìm nạp trước tạigetNative.js

Tuy nhiên, tôi nghi ngờ có điều gì đó khó hiểu trong cấu hình của bạn, bởi vì các phụ thuộc chuỗi xây dựng của bạn đang đề cập đến các phụ thuộc mô-đun, sẽ được tối ưu hóa tự động bằng webpack. Tôi không chắc làm thế nào bạn có được điều đó, nhưng trong trường hợp của chúng tôi, chúng tôi không thấy bất kỳ cảnh báo nào về chuỗi xây dựng dài trong node_modules. Hầu hết các chuỗi xây dựng dài của chúng tôi là do các thành phần phản ứng lồng nhau sâu, đòi hỏi phải có scss. I E:

nhập mô tả hình ảnh ở đây

Bất kể, bạn sẽ muốn thêm một plugin mới cho mỗi cảnh báo, như sau:

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

Đối số thứ hai phải là một chuỗi đến vị trí tương đối của mô-đun. Hy vọng điều này có ý nghĩa.


Tôi đang cố gắng gỡ bỏ một số bản dựng của mình và ngay cả sau khi giải thích, tôi vẫn thực sự bối rối về cách sử dụng công cụ này. Bạn có thể mở rộng về 'ngữ cảnh' chính xác có nghĩa là gì và mỗi tham số trong tìm nạp trước cần phải là gì không? Tôi không chắc về những gì chính xác đang được thực hiện trong plugin
ThrowsException

Tôi đã không sử dụng cái này trong một thời gian, nhưng nó có lẽ vẫn như vậy. Chỉ nên có hai đối số cho plugin. Một, ngữ cảnh, đó là ngữ cảnh của mô-đun, chẳng hạn như app/components/module.jsxvậy sẽ là 'app'và tôi nghĩ thứ hai phải là vị trí tương đối, tức là'components/module.jsx'
4 phút

1
Được rồi, tôi có một tấm vé khác. Tôi đã thử ít nhất hai chục cách sắp xếp PrefetchPlugin và dường như không có gì có thể loại bỏ nó khỏi chuỗi xây dựng dài của tôi. Tôi đang gặp vấn đề tương tự mà người đăng gặp phải khi tôi có một mô-đun nút thực sự nằm trong chuỗi xây dựng dài của tôi và tôi đang cố gắng tìm nạp trước nó. Không biết có lẽ webpack không biết cách xử lý tình huống này.
Ném biên tập

Tôi đã sử dụng plugin tìm nạp trước để tăng đáng kể hiệu suất cho dự án của mình sử dụng handlebars.js. Đây là cú pháp phù hợp với tôi:new webpack.PrefetchPlugin(__dirname + "/node_modules", "handlebars/runtime.js"),
Andre

Ngoài ra, nếu thứ bạn muốn tìm nạp trước không phải là một gói (tức là không ở trong node_modules), bạn chỉ có thể chuyển chuỗi yêu cầu . Lưu ý rằng đối số đầu tiên, ngữ cảnh , là tùy chọn.
natchiketa

2

Phần giữa của chuỗi của bạn có thể ở đó react-transform-hmr/index.jskhi nó bắt đầu được một nửa. Bạn có thể thử PrefetchPlugin('react-transform-hmr/index')và chạy lại hồ sơ của mình để xem nó có giúp tăng tốc tổng thời gian xây dựng của bạn hay không.


chỉ tồi tệ hơn .. từ 2351ms đến 2361ms, nó alse ném một lỗiEntry module not found: Error: Cannot resolve module 'react-transform-hmr/index' in /Users/asafkatz/Development/my-react-builerplate
Asaf Katz

4
Chà, chênh lệch 10ms không tệ hơn, sự khác biệt là không đáng kể về mặt thống kê. Tôi muốn chơi xung quanh những thứ khác nhau, react-transform-hmrhoặc react-transform-hmr/index.jsv.v.
Aaron Jensen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.