İşte daha somut bir örnek.
60 dosyadan oluşan bir projede çalışıyorum. Çalıştırmak için 2 farklı modumuz var.
Birleştirilmiş bir sürüm, 1 büyük dosya yükleyin. (Üretim)
60 dosyanın tümünü yükle (geliştirme)
Bir yükleyici kullanıyoruz, böylece web sayfasında sadece bir komut dosyası var
<script src="loader.js"></script>
Bu, varsayılan olarak # 1 (büyük bir birleştirilmiş dosyayı yükleyerek) moduna geçer. # 2 modunda (ayrı dosyalar) çalıştırmak için bazı bayraklar ayarladık. Herhangi bir şey olabilir. Sorgu dizesinde bir anahtar. Bu örnekte sadece bunu yapıyoruz
<script>useDebugVersion = true;</script>
<script src="loader.js"></script>
loader.js şöyle görünüyor
if (useDebugVersion) {
injectScript("app.js");
injectScript("somelib.js");
injectScript("someotherlib.js");
injectScript("anotherlib.js");
... repeat for 60 files ...
} else {
injectScript("large-concatinated.js");
}
Derleme betiği sadece şuna benzer bir .sh dosyasıdır
cat > large-concantinated.js app.js somelib.js someotherlib.js anotherlib.js
vb...
Yeni bir dosya eklenirse, geliştirme yaptığımızdan # 2 modunu injectScript("somenewfile.js")
kullanacağız. Loader.js'ye bir satır eklemeliyiz
Sonra üretim için daha sonra derleme betiğimize somenewfile.js'yi eklemeliyiz. Sıklıkla unuttuğumuz ve daha sonra hata mesajları aldığımız bir adım.
AMD'ye geçerek 2 dosyayı düzenlememiz gerekmiyor. Loader.js ve oluşturma komut dosyasını senkronize tutma sorunu ortadan kalkar. Kullanarak r.js
veya webpack
sadece oluşturmak için kodu okuyabilirlarge-concantinated.js
Ayrıca bağımlılıklarla da başa çıkabilir, örneğin lib1.js ve lib2.js gibi 2 dosya yükledik
injectScript("lib1.js");
injectScript("lib2.js");
lib2'nin lib1'e ihtiyacı var. İçinde gibi bir şey yapan bir kod var
lib1Api.installPlugin(...);
Ancak, enjekte edilen komut dosyaları eşzamansız olarak yüklendiğinden, doğru sırada yükleneceklerinin garantisi yoktur. Bu 2 komut dosyası AMD komut dosyaları değildir ancak requir.js kullanarak bağımlılıklarını söyleyebiliriz
require.config({
paths: {
lib1: './path/to/lib1',
lib2: './path/to/lib2',
},
shim: {
lib1: {
"exports": 'lib1Api',
},
lib2: {
"deps": ["lib1"],
},
}
});
Ben lib1 kullanan modülümüz bunu yapıyoruz
define(['lib1'], function(lib1Api) {
lib1Api.doSomething(...);
});
Şimdi requir.js bizim için komut dosyaları enjekte edecek ve lib2 yüklenene kadar lib2 yüklenmeyecek çünkü lib2'nin lib1'e bağlı olduğunu söylemiştik. Hem lib2 hem de lib1 yüklenene kadar lib1 kullanan modülümüzü başlatmaz.
Bu geliştirmeyi güzelleştirir (derleme adımı yok, yükleme sırası hakkında endişelenmeyin) ve üretimi güzelleştirir (eklenen her komut dosyası için bir derleme komut dosyasını güncellemeye gerek yoktur).
Ek bir bonus olarak, eski tarayıcılar için kod üzerinden babil çalıştırmak için webpack'in babel eklentisini kullanabiliriz ve yine bu yapı komut dosyasını da korumak zorunda değiliz.
Chrome (tercih edilen tarayıcımız) import
gerçek anlamda desteklemeye başlarsa, muhtemelen geliştirme için buna geçeceğimizi, ancak bunun gerçekten hiçbir şey değiştirmeyeceğini unutmayın. Birleştirilmiş bir dosya yapmak için web paketini kullanmaya devam edebiliriz ve tüm tarayıcılar için kod üzerinden babel çalıştırmak için kullanabiliriz.
Tüm bunlar komut dosyası etiketleri kullanılmadan ve AMD kullanılarak elde edilir.