GWT Araç Takımı: Java Kullanarak Güçlü JavaScript Ön Uçları Oluşturun
Yayınlanan: 2022-03-11Eskiden Google Web Araç Takımı olarak bilinen GWT Web Araç Takımı, Java programlama dilini kullanarak karmaşık tarayıcı tabanlı uygulamalar oluşturmak ve optimize etmek için bir dizi geliştirme aracıdır.
GWT'yi "web uygulamaları yazmak için başka bir Java aracı" olmayan şey, araç setinin kalbinin Java'yı JavaScript'e (HTML ve CSS'nin yanı sıra HTML ve CSS'ye) dönüştüren ve geliştiricilerin ön uç web uygulamaları yazmasına olanak tanıyan bir derleyici olmasıdır. Java'nın tüm güçlü yönlerinden yararlanırken.
GWT, web platformuyla arayüz oluşturmak için sağlam bir birlikte çalışabilirlik mimarisi içerdiğinden, Java ve JavaScript'in bir karışımını kullanmak bile kolaydır. Java Yerel Arayüzü (JNI), Java Sanal Makinesi'nin (JVM) platforma özgü rutinleri (örneğin, belirli donanım özelliklerine erişmek veya diğer dillerden harici kitaplıkları kullanmak için) çağırmasına izin vermesi gibi, GWT bir Java'da uygulama ve ardından, gerekirse belirli bir web API'sini kullanmak veya mevcut JavaScript kitaplıklarından yararlanarak "yerel hale gelmek" ve JavaScript'e geçmek.
GWT bir Google ürünü olarak doğdu, ancak 2011'in sonlarında açık kaynağa geçiş yaptı ve günümüzde GWT Açık Kaynak Projesi adı altında Apache Lisansı (Sürüm 2) altında yayınlandı. Google, RedHat, ArcBees, Vaadin ve Sencha gibi çeşitli şirketlerin temsilcilerinin yanı sıra topluluktan bağımsız geliştiricilerden oluşan bir yönlendirme komitesi tarafından yönetilmektedir.
Geçmişte ve Gelecekte GWT
Google Web Araç Seti ilk olarak 2006'da piyasaya sürüldü. Google mühendislerinin AdWords, Google Cüzdan ve Google Flights gibi karmaşık tarayıcı tabanlı uygulamalarını geliştirmelerine yardımcı olmak için bir araç olarak oluşturuldu ve daha yakın zamanda, Google E-Tablolar ve Gelen Kutusu uygulamaları.
2006'da tarayıcılar (ve JavaScript yorumlayıcıları) standart olmaktan çok uzaktı. Ön uç kodu yavaştı, sorunluydu ve güvenilir bir şekilde kullanımı zordu. Web geliştirme için neredeyse tamamen yüksek kaliteli kitaplıklar ve çerçeveler yoktu. Örneğin, jQuery bu yıla kadar yoktu. Bu nedenle, büyük ölçekli web uygulamaları geliştirebilmek için Google'daki mühendisler mevcut araçlardan ve yeterliliklerden yararlanmaya karar verdiler. Java, iyi bilinen ve Eclipse gibi IDE'lere mükemmel şekilde entegre olan ihtiyaçları için en uygun dildi ve böylece Google Web Araç Seti hayatına başladı.
Amaç aşağı yukarı tarayıcılar arasındaki farkları gizlemek ve verimli JavaScript yazmak için gereken püf noktalarını bir Java derleyicisinin içine yerleştirmek ve geliştiricileri tarayıcı tekniklerinin zorbalığından özgür kılmaktı.
Elbette, son on yılda web değişti; tarayıcılar daha hızlı hale geldi ve uygulama standartlarında birleşti ve jQuery, Angular, Polymer ve React dahil olmak üzere birçok harika ön uç çerçeve ve kitaplık geliştirildi. Doğal olarak sorabileceğiniz ilk soru, "GWT hala faydalı mı?"
Tek kelimeyle: Evet .
Modern web geliştirme bağlamında, tarayıcıları hedeflemek kaçınılmazdır ve JavaScript, ön uç uygulamaların ortak dili haline gelmiştir. Ancak elbette, farklı araçlar ve diller, farklı görevler için daha uygundur. GWT, birkaç benzer projeyle birlikte, geliştiricileri JavaScript'i kullanmakla sınırlamadan tarayıcıları hedeflemeyi amaçlıyor.
GWT gibi "web'de derleme" araçlarının geliştirilmesi ve kullanılması, yakın gelecekte World Wide Web Konsorsiyumu'nun WebAssembly grubu tarafından kolaylaştırılacaktır. JavaScript'i derleyen araçlar için yalnızca geniş bir alan olmakla kalmaz, aynı zamanda bu yaklaşım, hesaplamanın bir kısmının yüklenmesinden tarayıcılara, mevcut kodun ve kitaplıkların yeniden kullanılmasına, arka uç ve ön uç arasında kod paylaşımına kadar uzanan bağlamlarda gerçek bir ihtiyacı karşılayabilir. , mevcut yeterlilikleri ve iş akışlarını kullanarak ve farklı dillerin özelliklerinden yararlanarak (örneğin, GWT durumunda statik yazma).
GWT Projesi'nin yakında 2.8 sürümünü piyasaya sürmesi bekleniyor ve sürüm 3.0, çalışmalarda büyük iyileştirmelerle birlikte geliştiriliyor:
- JavaScript ile yeniden icat edilmiş birlikte çalışabilirlik
- geliştirilmiş (neredeyse tamamen yeniden yazılmış) derleyici
- son teknoloji Java desteği (örn. lambdalar)
Aslında, GWT 3.0'ın özelliklerinin çoğu, genel Git deposunda zaten mevcuttur. Sadece bagajı kontrol edin, burada ve buradaki belgeleri izleyerek GWT'yi derleyin.
GWT Topluluğu
GWT 2011'de açık kaynağa geçtiğinden beri, topluluk projenin evriminde çok önemli bir rol üstlendi.
Tüm geliştirmeler gwt.googlesource.com'da barındırılan Git deposunda gerçekleşir ve tüm kod incelemeleri gwt-review.googlesource.com'da yapılır. Bu sayfalarda, Araç Takımının geliştirilmesiyle ilgilenen herkes katkıda bulunabilir ve topluluğun ne üzerinde çalıştığını görebilir. Son birkaç yılda, Google çalışanı olmayanlardan gelen yeni yamaların yüzdesi 2012'de yaklaşık yüzde 5'ten geçen yıl yüzde 25'e yükseldi ve artan katılımı doğruladı.
Bu yıl topluluk, ABD ve Avrupa'da birkaç büyük toplantı için bir araya geldi. Vaadin tarafından organize edilen GWT.create, Ocak ayında hem Münih, Almanya hem de Mountain View, Kaliforniya'da düzenlendi ve onlarca ülkeden 600'den fazla katılımcı gerçekleştirildi. 11 Kasım'da, İtalya'nın Floransa kentinde, düzenlemesine yardımcı olduğum topluluk odaklı bir GWT konferansı olan GWTcon'un ikinci baskısını gerçekleştireceğiz.
GWT Ne İçin Uygundur?
Vaadin tarafından yayınlanan GWT araç seti hakkında yıllık bir anket, GWT'nin geliştirme evrimini, geliştiricilerin araç seti, iyi, kötü vb. hakkında nasıl hissettiklerini tartışıyor. Bu anket ayrıca Araç Seti'nin ne için kullanıldığını, kullanıcı topluluğunun nasıl değiştiğini ve geliştiricilerin araç setinin geleceğine ilişkin beklentilerini anlamamızı sağlar.
2015 için GWT'nin Geleceği Raporu burada bulunabilir ve GWT'nin büyük ölçekli web uygulamaları oluşturmak için çok popüler olduğunu açıkça ortaya koymaktadır. Örneğin, 14. sayfada, "Çoğu uygulama, veri ağırlıklı ve günde saatlerce üzerinde çalışılan iş uygulamalarıdır."
Beklendiği gibi, GWT için doğal ortamın, kodun sürdürülebilirliğinin önemli olduğu ve büyük ekiplerin Java dilinin yapısından yararlandığı büyük ölçekli web uygulamaları alanı olduğu sonucuna varmak kolaydır.
Öte yandan, GWT tarafından oluşturulan kod için kıyaslamalara bakıldığında (örneğin, geçen yılki GWT.create konferansının açılış konuşmasında, sayfa 7, 8 ve 11'de) performans ve performans açısından bunu görmek kolaydır. kod boyutu, derlenmiş JavaScript şaşırtıcı derecede harika. Doğru kullanıldığında elde edilen performans, elle yazılmış en iyi JavaScript ile karşılaştırılabilir. Sonuç olarak, Java kitaplıklarını web'e taşımak için GWT'yi kullanmak gerçekten mümkün.
Bu, GWT için başka bir ideal senaryoyu aydınlatır. Java ekosistemi, JavaScript'te kullanıma hazır karşılığı olmayan yüksek kaliteli kitaplıklarla doludur. GWT derleyicisi, bu tür kitaplıkları web'e uyarlamak için kullanılabilir. Başka bir deyişle, GWT hem Java hem de JavaScript'te bulunan kitaplıkları karıştırmamıza ve bunları tarayıcıda çalıştırmamıza izin veriyor.
Bu yaklaşım, web için genel olarak kabul edilmeyen birkaç Java kitaplığının (örneğin NyARToolkit) GWT kullanılarak tarayıcıya nasıl taşınabileceğini ve WebRTC ve WebGL dahil olmak üzere web API'leri ile nasıl birleştirilebileceğini gösterdiğimiz PicShare'in geliştirilmesinde görülebilir. tamamen web tabanlı bir Artırılmış Gerçeklik aracı edinin. Geçen Ocak ayında 2015 GWT.create konferansında PicShare'i sunmaktan gurur duydum.
Kaputun Altında: Java'yı JavaScript'e Dönüştürmek
GWT Araç Takımı orta derecede karmaşık bir araç setidir, ancak Eclipse ile şaşırtıcı derecede kolay kullanımlı entegrasyon sayesinde herkes hemen kullanmaya başlayabilir.
GWT ile basit bir uygulama oluşturmak, Java geliştirme projelerinde geçmişi olan herkes için nispeten kolaydır. Ancak "gerçekte" ne olduğunu anlamak için araç setinin temel bileşenlerini analiz etmeye değer:
- Java'dan JavaScript Aktarıcısına
- Öykünülmüş Java Çalışma Zamanı Ortamı
- Birlikte Çalışabilirlik Katmanı
GWT'nin Optimize Edici Derleyicisi
Derleyicinin nasıl çalıştığının derinlemesine bir açıklaması oldukça erken bir zamanda oldukça teknik hale gelir ve o kadar derine inmemize gerek yoktur, ancak bazı genel kavramlara bakmaya değer.

Anlaşılması gereken ilk şey, GWT'nin Java'yı kaynak kod düzeyinde çeviri yoluyla JavaScript'te derlemesidir. Yani, Java kaynağı JavaScript'e çevrilir (teknik terim aktarılır ). Bu, Java bayt kodunu çalıştıran JavaScript ile yazılmış bir tür Java Sanal Makinesine sahip olmanın aksine. (Bu aslında mümkündür ve Doppio tarafından kullanılan yaklaşımdır, ancak GWT'nin çalışma şekli bu değildir.)
Bunun yerine, Java kodu, kodun sözdizimsel öğelerini temsil eden soyut bir sözdizimi ağacına (AST) bölünür. Daha sonra eşdeğer (ve optimize edilmiş) bir Javascript AST ile eşleştirilir ve sonunda gerçek JavaScript koduna dönüştürülür.
Aktarmanın artılarını ve eksilerini tartmak bu yazının konusu olmaktan çok uzak, ancak bu yöntemle GWT'nin tarayıcıya özgü diğer özelliklerle birlikte JavaScript yorumlayıcısının çöp toplama hizmetlerinden doğrudan yararlanabileceğini gözlemlememe izin verin.
Zor olan kısımlar var tabii. Örneğin, JavaScript, Java'nın 64 bit long
tamsayı türünü içeremeyen yalnızca bir sayısal türe sahiptir, bu nedenle long
türler derleyici tarafından bazı özel işlemler gerektirir. Ek olarak, Java statik yazmanın JavaScript'te doğrudan bir anlamı yoktur, bu nedenle, örneğin, yazımdan sonra yazım işlemlerini eşdeğer tutmak için özel dikkat gösterilmelidir.
Öte yandan, aktarmanın kolayca anlaşılan bir avantajı, GWT'nin Java düzeyinde ve JavaScript düzeyinde optimizasyonlar (hem boyut hem de performans için) gerçekleştirebilmesidir. Ortaya çıkan standart JavaScript kodu, dağıtım hattınızda daha fazla işlenebilir. Örneğin, artık standart GWT dağıtımına entegre edilen yaygın bir uygulama, son derece özel JavaScript'ten JavaScript'e Kapatma Derleyicisi (Google tanrılarından başka bir hediye) kullanılarak aktarıcı tarafından JavaScript çıktısının optimize edilmesini içerir.
Bildiğim GWT derleyicisinin en ayrıntılı açıklaması bu slayt destesinde ve bunun geldiği orijinal konuşmada bulunabilir. Burada, GWT'nin kod bölme yeteneği, tarayıcı tarafından bağımsız olarak yüklenecek birden çok ayrı komut dosyası oluşturma gibi derleme işleminin diğer harika özellikleri hakkında ayrıntıları bulabilirsiniz.
Öykünülmüş JRE
Java'dan JavaScript'e derleyici, neredeyse tüm Java uygulamalarının güvendiği çekirdek kitaplıkları sağlayan Java Runtime Environment (JRE) uygulamasıyla desteklenmediği takdirde, bir yenilikten biraz daha fazlası olacaktır. Kabaca söylemek gerekirse, örneğin Koleksiyonlar veya String yöntemleri olmadan Java'da çalışmak sinir bozucu olurdu ve elbette bu kitaplıkları taşımak muazzam bir iştir. GWT, bu boşluğu Öykünülmüş JRE ile doldurur.
Öykünülmüş JRE, hiçbir şekilde Java JRE'nin tam bir yeniden uygulaması değildir, daha ziyade istemci tarafında yararlı (ve kullanılabilir) olabilecek bir tür sınıf ve yöntem seçimidir. Java JRE'de bulunan ancak Öykünülmüş JRE'de bulamayacağınız işlevler üç kategoriye ayrılır:
İstemci tarafında taşınamayan şeyler. Örneğin,
java.lang.Thread
veyajava.io.File
, aynı Java semantiğine sahip bir tarayıcıda uygulanamaz. Tarayıcı sayfası tek iş parçacıklıdır ve dosya sistemine doğrudan erişimi yoktur.Uygulanabilecek, ancak kod boyutu, performans veya bağımlılıklar açısından “çok pahalıya mal olacak” ve dolayısıyla topluluğun GWT içinde olmamasını tercih ettiği şeyler. Örneğin, bu kategoriye dahil edilen Java yansıması (
java.lang.reflect
) aktarıcının her tür için sınıf bilgisini tutmasını gerektirir ve bu, derlenmiş JavaScript'in boyutunun balonlaşmasına neden olur.Kimsenin ilgilenmediği ve bu nedenle uygulanmayan şeyler.
Öykünülmüş JRE ihtiyaçlarınızı karşılamıyorsa (örneğin, sağlanmayan bir sınıfa ihtiyacınız varsa), GWT kendi uygulamanızı yazmanıza izin verir. <super-source>
etiketi aracılığıyla sağlanan bu güçlü mekanizma, JRE'nin öykünülmemiş kısımlarını kullanan yeni harici kitaplıkları uyarlarken sorunları aşmayı mümkün kılar.
JRE'nin bazı bölümlerinin tam bir uygulamasını sağlamak aşırı derecede karmaşık veya hatta imkansız olabilir, bu nedenle belirli görevler için kendi uygulamalarınız, sizin özel durumunuzda çalışsalar bile Java'nın JRE'sinin anlamını tam olarak takip etmeyebilir. Gerçekten de, sınıflarınızı projeye geri vermeyi düşünüyorsanız, her sınıfın orijinal Java JRE ile aynı semantiğini takip etmesinin Öykünülmüş JRE için büyük önem taşıdığını unutmayın. Bu, herkesin Java kodunu JavaScript'te yeniden derleyebilmesini ve beklenen sonuçları alacağına güvenmesini sağlar. Topluluğa geri vermeden önce kodunuzun her zaman kapsamlı bir şekilde test edildiğinden emin olun.
Birlikte Çalışabilirlik Katmanı
Gerçek dünya web uygulamalarının üretimi için etkili bir araç olmak için GWT, geliştiricilerin temel platformla kolayca etkileşime girmesine izin vermelidir. Yani, tarayıcı ve DOM.
GWT, en başından beri, tarayıcı içi API'lere erişimi çok kolay hale getiren JavaScript Yerel Arayüzü (JSNI) aracılığıyla bu tür bir etkileşimi desteklemek için oluşturulmuştur. Örneğin, GWT derleyicisine özgü sözdizimi özelliklerini kullanarak aşağıdaki Java kodunu yazabilirsiniz:
public static native void nativeMethod(T1 a1, T2 a2, ...) /*-{ //place your JavaScript code here }-*/;
ve yöntemin gövdesini JavaScript'te uygulamakta özgürsünüz. Hatta JavaScript nesnelerini bir JavaScriptObject (JSO) içine sarabilir ve onu Java kodunuzda erişilebilir hale getirebilirsiniz.
Bu katmanın devreye girdiği yerin bir örneği, UI kompozisyonu bağlamında bulunabilir. Mainstream Java, UI öğelerini oluşturmak için her zaman standart Widget'lar araç setini kullandı ve temel işletim sisteminin pencereleme ve giriş sistemlerine erişmek için Java Native Interface'den yararlandı. GWT'nin birlikte çalışabilirlik katmanı aynı şeyi yapar, böylece geleneksel Widget'lar tarayıcı içinde sorunsuz çalışır. Tek fark, bu durumda temel alınan sistemin tarayıcı ve DOM olmasıdır.
Ancak, yerel ön uç çerçeveler son yıllarda hızla gelişti ve günümüzde GWT'nin Widget'larına göre önemli avantajlar sunuyor. Bu çerçeveler karmaşıklık içinde büyüdükçe, bunları JSNI'de uygulama girişimleri, birlikte çalışabilirlik katmanının mimarisindeki eksiklikleri ortaya çıkardı. 2.7 sürümünden başlayarak GWT, GWT sınıflarınızı JavaScript ile hızlı ve kolay bir şekilde entegre etmenize olanak tanıyan Java ek açıklamalarına dayalı yeni bir yaklaşım olan JsInterop'u tanıttı. Artık JSNI yöntemleri veya JSO sınıfları yazmak gerekli değildir. Bunun yerine, @JSType
veya @JSProperty
gibi ek açıklamaları kullanarak yerel JavaScript sınıflarıyla Java sınıfındaymış gibi çalışmanıza izin verebilirsiniz.
JsInterop'un tam özelliği halen devam etmektedir ve en son güncellemeler yalnızca GWT deposundan kaynak derlenerek denenebilir. Ancak, GWT'nin gelişen web platformlarına ayak uydurmasını sağlayacak yeni yönün bu olduğu zaten açık.
JsInterop'tan yararlanan devam eden bir proje, Polymer'den tüm Demir ve Kağıt öğelerini GWT'ye sunan, yakın zamanda piyasaya sürülen gwt-polimer-elemanlarıdır. Bu kütüphanede ilginç olan şey, geliştiricilerin Java API'sini elle oluşturmalarına gerek olmamasıdır. Proje, Polymer kitaplığını ve JSDoc ek açıklamalarını ayrıştırarak doğrudan arabirimlerin çoğunu oluşturmak için gwt-api-generator kullanır. Bu, bağlamaları güncel tutmayı kolaylaştırır.
Son sözler
Derleyicide, birlikte çalışabilirlik katmanında ve oluşturulan kodun son iki yıldaki performansı ve boyutunda yapılan iyileştirmelerle, GWT'nin yalnızca "başka bir web geliştirme aracı" olmadığı, aynı zamanda büyük ölçekli, karmaşık web uygulamalarının geliştirilmesi ve hatta daha basit uygulamaları harika hale getirmek için mükemmel bir seçim olabilir.
Bir geliştirici ve danışman olarak işimde günlük olarak GWT kullanıyorum, ancak çoğunlukla GWT'yi seviyorum çünkü tarayıcı yeteneklerinin sınırlarını zorlamama ve modern web uygulamalarının masaüstü uygulamaları kadar güçlü olabileceğini göstermeme izin veriyor.
GWT Projesi topluluğu gerçekten aktiftir ve sürekli olarak GWT'ye dayalı yeni kütüphaneler, projeler ve uygulamalar önerilmektedir. Floransa'da topluluk odaklı GWTcon2015 11 Kasım'da toplanacak. Bölgedeyseniz, umarım gelip çekirdek geliştiricilerden bazılarıyla tanışırsınız ve bu harika araç setinin evriminin bir parçası olmak için tüm fırsatları öğrenirsiniz.