PrefetchPlugin ve analiz aracını kullanarak web paketinin derleme süresi nasıl optimize edilir?


96

Önceki arama:

Webpack'in wiki'sinin dediği gibi, derleme performansını optimize etmek için analiz aracını kullanmak mümkündür:

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

Derleme istatistiklerinden ipuçları

Yapınızı görselleştiren ve ayrıca derleme boyutu ve derleme performansının nasıl optimize edilebileceği konusunda bazı ipuçları sağlayan bir analiz aracı vardır .

Webpack --profile --json> stats.json komutunu çalıştırarak gerekli JSON dosyasını oluşturabilirsiniz.


İstatistik dosyasını oluşturdum ( burada mevcut ) web paketinin analiz aracına yükledim
ve İpuçları sekmesi altında prefetchPlugin'i kullanmamı söyledim:

from: http://webpack.github.io/analyse/#hints

Uzun modül yapım zincirleri

Derleme performansını artırmak için önceden getirmeyi kullanın . Zincirin ortasından bir modülü önceden getirin .


PrefechPlugin'de bulunan tek dokümantasyonu bulmak için web'i baştan aşağı kazdım:

from: https://webpack.js.org/plugins/prefetch-plugin/

PrefetchPlugin

new webpack.PrefetchPlugin([context], request)

Bir gereksinim ortaya çıkmadan önce çözülen ve oluşturulan normal bir modül isteği. Bu, performansı artırabilir. Akıllı ön getirme noktalarını belirlemek için önce yapının profilini çıkarmaya çalışın .



Sorularım:

  • PrefetchPlugin nasıl düzgün kullanılır?
  • Analiz aracıyla kullanmak için doğru iş akışı nedir?
  • PrefetchPlugin'in çalışıp çalışmadığını nasıl anlarım? nasıl ölçebilirim?
  • Zincirin ortasından bir modülü önceden almak ne anlama gelir ?

Bazı örnekleri gerçekten takdir edeceğim

Lütfen bu soruyu prefechPlugin ve Analiz araçlarını kullanmak isteyen bir sonraki geliştirici için değerli bir kaynak yapmama yardım edin. Teşekkür ederim.


1
İstatistik analiz aracını nasıl kullanacağız? Yüklemeyi tıkladığımda hiçbir şey olmuyor ve gönder düğmesi yok. Yalnızca "örnek kullanın"
TetraDev

Konsol çıkışı, Uncaught SyntaxError: Unexpected token r in JSON at position 0herhangi bir stats.json yüklenirken diyor
TetraDev

1
@TetraDev bu, JSON dosyanızda bir hata olduğu anlamına gelir. Bir metin düzenleyiciyle açmayı deneyin ve geçerli JSON'a benzemeyen bir şey olup olmadığına bakın. (İlk satırda Webpack'ten gelen hata ayıklama çıktısıyla aynı sorunu yaşıyorum).
maufl

Dokümanlar var > stats.jsonama bu üstte ayrıştırıcıyı kıran fazladan birkaç satır yazıyor
Alex Riina

Yanıtlar:


35

Evet, ön getirme eklenti dokümantasyonu neredeyse yok. Kendim için anladıktan sonra, kullanımı oldukça basit ve çok fazla esnekliği yok. Temel olarak, bağlam (isteğe bağlı) ve modül yolu (bağlama göre) olmak üzere iki bağımsız değişken alır. Sizin durumunuzdaki bağlam /absolute/path/to/your/project/node_modules/react-transform-har/, ekran node_modulesgörüntünüzdeki yaklaşık işaretinin web paketinin node_module çözünürlüğüne atıfta bulunduğunu varsayar .

Gerçek önceden getirme modülü ideal olarak en fazla üç modül bağımlılığı derinliğinde olmalıdır. Bu nedenle, sizin durumunuzda isFunction.jsuzun yapı zincirine sahip modül ve ideal olarak önceden getirilmesi gerekir.getNative.js

Bununla birlikte, yapılandırmanızda garip bir şeyler olduğundan şüpheleniyorum çünkü derleme zinciri bağımlılıklarınız, web paketi tarafından otomatik olarak optimize edilmesi gereken modül bağımlılıklarına atıfta bulunuyor. Bunu nasıl anladığından emin değilim, ama bizim durumumuzda, node_modules'de uzun inşa zincirleri hakkında herhangi bir uyarı görmüyoruz. Uzun yapılı zincirlerimizin çoğu, scss gerektiren derinlemesine iç içe geçmiş reaksiyon bileşenlerinden kaynaklanmaktadır. yani:

görüntü açıklamasını buraya girin

Ne olursa olsun, uyarıların her biri için yeni bir eklenti eklemek isteyeceksiniz, örneğin:

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

İkinci argüman, modülün göreceli konumuna bir dize olmalıdır. Umarım bu mantıklıdır.


Bazı yapılarımı indirmeye çalışıyorum ve açıklamadan sonra bile bu aracı nasıl kullanacağım konusunda hala kafam karışık. 'Bağlam'ın tam olarak ne anlama geldiğini ve ön getirmedeki parametrelerin her birinin ne olması gerektiğini genişletebilir misiniz?
Eklentide

Bunu bir süredir kullanmadım ama muhtemelen hala aynı. Eklentide yalnızca iki argüman olmalıdır. Bir, modül bağlamı olan bağlam, örneğin öyle app/components/module.jsxolabilir 'app've sanırım ikincisi göreceli konum, yani'components/module.jsx'
4m1r

1
Tamam, başka bir geçiş yapacağım. En az iki düzine PrefetchPlugin düzenlemesini denedim ve hiçbir şey onu uzun derleme zincirimden çıkaramıyor. Aslında uzun derleme zincirimde olan bir düğüm modülümün olduğu yerde posterin yaşadığı sorunu yaşıyorum ve onu önceden getirmeye çalışıyorum. Webpack bu durumla nasıl başa çıkılacağını bilmiyor olabilir mi bilmiyorum.
ThrowsException

Handlebars.js kullanan projemin performansını büyük ölçüde artırmak için önceden getirme eklentisini kullandım. İşte benim için işe new webpack.PrefetchPlugin(__dirname + "/node_modules", "handlebars/runtime.js"),
Andre

Ayrıca, önceden getirmesini istediğiniz şey bir paket değilse (yani içinde değilse node_modules), sadece istek dizesini iletebilirsiniz . İlk bağımsız değişken olan bağlamın isteğe bağlı olduğunu unutmayın.
natchiketa

2

Zincirinizin ortası, muhtemelen react-transform-hmr/index.jsyarı yolda başladığı için oradadır . PrefetchPlugin('react-transform-hmr/index')Toplam oluşturma sürenizi hızlandırmaya yardımcı olup olmadığını görmek için profilinizi yeniden çalıştırmayı deneyebilirsiniz .


sadece daha kötüsü .. 2351ms'den 2361ms'ye, yine de bir hata veriyorEntry module not found: Error: Cannot resolve module 'react-transform-hmr/index' in /Users/asafkatz/Development/my-react-builerplate
Asaf Katz

4
10 ms'lik bir fark daha kötü değildir, fark istatistiksel olarak önemsizdir. Ben w / farklı şeyler oynayabilir, ediyorum react-transform-hmrya react-transform-hmr/index.jsvs
Aaron Jensen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.