2012-05-01 11 views
14

Kullandığımız javascript kaynağında google kapatma derleyicisini kullanmak istiyorum. Geliştirme modunda, işlevleri çok sayıda dosyaya ayırma eğilimindeyiz, ancak üretim için bunların modüller halinde birleştirilmesini isteriz.Javascript'i Google'ın Kapatma Derleyicisini kullanarak modüllere nasıl bölerim?

Derleyiciyi çağırırken derlemeye eklenecek dosyaların bir listesini verebilirim, ancak bunun çıktısı derleyicinin dosya listesinin sırasını kaydetmediğini gösterir.

Bunu araştırdım ve farklı js dosyaları arasındaki bağımlılıkları denetlemek için goog.provide/good.require kullanabileceğimi öğrendim. , Js derlenmiş dosyaya

var mainFile = {}; 

:

goog.provide("mainFile") 

bu katacak: bununla sorun sadece örneğin ihtiyaç veya istemediğiniz benim js kodu ekler olmasıdır istemediğim bir şey. google kapatma kitaplığını hiç kullanmıyoruz, kullanmak istediğim tek şey derleyici.

Derleyiciye, daha fazla "kapatma kitaplığı" işlevselliği eklemeden dosyaların sırasını söylemem için bir yolu var mı? Elbette, önce tüm dosyaları alacağım, bunları bir derleyicinin girdisi olacak şekilde birleştirecek bir araç oluşturabilirim, ancak derleyicinin kendisi tarafından yapılabileceğini geçersiz kılmayı tercih ederim.


Düzenleme

gol bu thread cevap gibi modülleri üretmek mümkün olmaktır: Using the --module option in Closure Compiler to create multiple output files

Ve bu yüzden eklemek istediğiniz hangi gitmek hangi dosyaların kontrol etme yeteneği Modül ayrıca siparişleri üzerinde kontrol sahibi olurken. Şimdilik jokeyleri kullanmıyorum, ancak gelecekte yapmayı planlıyorum (eğer mümkünse).

sadece "cat file1.js file2.js> combined.js & & derleme ..." iyi ama bizim durumumuzda biraz daha karmaşık ve bunu yapan bir program/komut yazmamız gerekecek bazı mantıklara dayanmaktadır. Bir şekilde derleyiciye ileri düzeydeki dosyaların sırasını söyleyebilseydik, bu tür bir programın uygulanış zamanını kaydedebiliriz.

Teşekkürler.

+1

nasıl kedi 'yaklaşık dosya1 dosya2> sıcaklığında && derlemek -js temp? – georg

+0

Joker (* .js) kullanıyor musunuz, yoksa derleyiciyi çağırırken her dosyayı sırayla yapıyor musunuz? – GillesC

+0

Bir yorum için çok büyük olduğu için sorumu düzenledim. Teşekkürler. –

cevap

28

Kapatma derleyicisinin modül oluşturma yeteneği, giriş dosyalarını farklı çıktı dosyalarına ayırmak için güçlü bir araç sağlar. Gerekli özelliklere bağlı olarak farklı modüller farklı zamanlarda yüklenebilecek şekilde tasarlanmıştır. Modüller ile ilgili çoklu derleyici bayrakları vardır.

--module bayrağının her kullanımı bir çıkış dosyasını ve bağımlılıklarını açıklar.

--js inputfile.js 
--module name:num_files:dependency 

elde edilen çıktı dosyası name.js olacaktır ve önceki --js bayrağı (ler) ile belirtilen dosyaları içerir: Her modül bayrağı aşağıdaki sözdizimi izler.

Bağımlılık seçeneği, en çok ilgilendiğiniz şeydir. Ana modülün ne olduğunu belirtir.Modül seçenekleri geçerli bir bağımlılık ağacı tanımlamalıdır (bir temel modülünüz olmalıdır).

İşte bir örnek: Bu durumda

--js commonfunctions.js 
--module common:1 
--js page1functions.js 
--js page1events.js 
--module page1:2:common 
--js page2function.js 
--module page2:1:common 
--js page1addons.js 
--module page1addons:1:page1 

, sen page1 ve page2 modüller ortak modül üzerinde ve page1addons modül page1 modülüne bağlı olduğunu bağlıdır derleyici söylüyoruz.

Derleyicinin, yalnızca bu modül tarafından kullanıldığını belirlerse, derleyici, modül kaynak dosyalarındaki kodu diğer modül çıktı dosyalarına taşıyabilir ve taşır.

Bunların hiçbiri kapatma kütüphanesi veya goog.require/sağlama çağrılarının kullanılmasını gerektirmez ve çıktılarınıza herhangi bir kod eklemez. Derleyicinin bağımlılıkları otomatik olarak belirlemesini veya bu bağımlılıkları sizin yerinize yönetmesini istiyorsanız, goog.require/arama sağlamanız gerekir. Ayrıca

--module_output_path_prefix ./public/js/

See:

+3

Yukarı oy. Bu harika bir örnekle güzel ve özlü bir cevaptır. Mükemmel. Cevabınızı test ederken, adlarında nokta veya tire içeren modüller oluşturamadım. Bu mümkün mü yoksa yanlış bir şey mi yapıyorum? Örnek: '--module common.min: 1' benim için çalışmadı. (Çalıştığımı söylediğimde, modül oluşturulmamış demek istedim.) – Karl

+0

Blogumda bunun nasıl yapılacağına dair basit bir örnekle yazdım. Başkalarının ilgilenmesi durumunda paylaşma: http://www.syntaxsuccess.com/viewarticle/lazy-loading-with-the-closure-compiler – TGH