AngularJS ve jQuery karşılaştırması
Açısal JS ve jQuery çok farklı ideolojiler benimser. JQuery'den geliyorsanız, bazı farklılıkları şaşırtıcı bulabilirsiniz. Açısal sizi kızdırır.
Bu normal, zorlamalısın. Açısal buna değer.
Büyük fark (TLDR)
jQuery, DOM'un rastgele bitlerini seçmek ve bunlarda geçici değişiklikler yapmak için bir araç seti sunar. İstediğiniz her şeyi parça parça yapabilirsiniz.
Bunun yerine AngularJS size bir derleyici verir .
Bunun anlamı, AngularJS'nin tüm DOM'nizi yukarıdan aşağıya okuduğu ve tam anlamıyla derleyiciye talimat olarak kod olarak ele aldığıdır. DOM'dan geçerken, AngularJS derleyicisine nasıl davranacağını ve ne yapılacağını söyleyen belirli yönergeleri (derleyici yönergeleri) arar . Yönergeler, niteliklerle, etiketlerle, sınıflarla veya hatta yorumlarla eşleşebilen JavaScript ile dolu küçük nesnelerdir.
Açısal derleyici, bir DOM parçasının belirli bir yönerge ile eşleştiğini belirlediğinde, yönlendirme işlevini çağırır, DOM öğesini, tüm öznitelikleri, geçerli $ kapsamını (yerel değişken deposu olan) ve diğer bazı yararlı bitleri iletir. Bu öznitelikler, Direktif tarafından yorumlanabilen ve nasıl oluşturulacağını ve ne zaman kendini yeniden çizmesi gerektiğini söyleyen ifadeler içerebilir.
Direktifler daha sonra kontrolörler, servisler, vb. Gibi ek Açısal bileşenleri çekebilir. Derleyicinin alt kısmı çıkan, tamamen oluşturulmuş bir web uygulamasıdır, kablolu ve kullanıma hazırdır.
Bu, Açısal Şablon Sürmeli olduğu anlamına gelir . Şablonunuz JavaScript'i kullanıyor, tersi değil. Bu, rollerin radikal bir şekilde tersine çevrilmesi ve son 10 yıldır yazdığımız göze batmayan JavaScript'in tam tersidir. Bu alışmak biraz zaman alabilir.
Eğer bu aşırı kuralcı ve sınırlayıcı olabilir gibi görünüyorsa, hiçbir şey gerçeklerden daha uzak olamaz. AngularJS HTML'nizi kod olarak ele aldığından , web uygulamanızda HTML düzeyinde ayrıntı elde edersiniz . Her şey mümkündür ve birkaç kavramsal sıçrama yaptıktan sonra çoğu şey şaşırtıcı derecede kolaydır.
Şimdi altmış cesurlara inelim.
İlk olarak, Angular jQuery'nin yerini almaz
Açısal ve jQuery farklı şeyler yapar. AngularJS size web uygulamaları üretmek için bir dizi araç sunar. jQuery esas olarak DOM'u değiştirmek için araçlar sağlar. Sayfanızda jQuery varsa, AngularJS bunu otomatik olarak kullanacaktır. Değilse, AngularJS, jQuery'nin kesilmiş, ancak yine de mükemmel şekilde kullanılabilir bir sürümü olan jQuery Lite ile birlikte gelir.
Misko jQuery'den hoşlanır ve bunu kullanarak size itiraz etmez. Bununla birlikte, ilerledikçe, kapsamınızın, şablonların ve yönergelerin bir kombinasyonunu kullanarak tüm işlerinizin neredeyse tamamını yapabileceğinizi göreceksiniz ve kodunuz daha ayrık, daha yapılandırılabilir ve daha fazlası olacağı için mümkün olduğunda bu iş akışını tercih etmelisiniz. Açısal.
JQuery kullanıyorsanız, her yere serpiştirmemelisiniz. AngularJS'de DOM manipülasyonu için doğru yer bir direktifte. Bunlar hakkında daha sonra.
Seçici ve Bildirici Şablonlar ile göze batmayan JavaScript
jQuery tipik olarak dikkat çekmeden uygulanır. JavaScript kodunuz üstbilgi (veya altbilgi) ile bağlantılıdır ve burada tek yer belirtilmiştir. Sayfanın bitlerini seçmek için seçicileri kullanırız ve bu parçaları değiştirmek için eklentiler yazarız.
JavaScript kontrol altında. HTML'nin tamamen bağımsız bir varlığı vardır. HTML'niz JavaScript olmadan bile anlamsal kalır. Onclick özellikleri çok kötü bir uygulamadır.
AngularJS hakkında fark edeceğiniz ilk şeylerden biri, özel özelliklerin her yerde olmasıdır . HTML'niz temel olarak onClick özelliklerine sahip ng özellikleriyle dolu olacaktır. Bunlar direktiflerdir (derleyici direktifleri) ve şablonun modele bağlandığı ana yollardan biridir.
Bunu ilk gördüğünüzde AngularJS'yi eski okul müdahaleci JavaScript olarak yazmak cazip gelebilir (ilk başta yaptığım gibi). Aslında, AngularJS bu kurallara uymaz. AngularJS'de HTML5'iniz bir şablondur. Web sayfanızı üretmek için AngularJS tarafından derlenmiştir.
Bu ilk büyük fark. JQuery için, web sayfanız manipüle edilecek bir DOM'dir. AngularJS için HTML'niz derlenecek koddur. AngularJS tüm web sayfanızda okur ve dahili derleyicisini kullanarak kelimenin tam anlamıyla yeni bir web sayfasına derler.
Şablonunuz açıklayıcı olmalıdır; anlamı basitçe okunarak açık olmalıdır. Anlamlı adlara sahip özel özellikler kullanıyoruz. Yine anlamlı adlarla yeni HTML öğeleri oluşturuyoruz. Minimum HTML bilgisi olan ve kodlama becerisi olmayan bir tasarımcı AngularJS şablonunuzu okuyabilir ve ne yaptığını anlayabilir. Değişiklik yapabilir. Bu Açısal yol.
Şablon sürüş koltuğunda.
AngularJS'yi başlatırken ve öğreticilerden geçerken kendime sorduğum ilk sorulardan biri " Kodum nerede?" . JavaScript yazmadım ve yine de tüm bu davranışlara sahibim. Cevap açıktır. AngularJS DOM'yi derlediğinden, AngularJS HTML'nizi kod olarak ele alır. Birçok basit durumda genellikle bir şablon yazmak ve AngularJS'nin sizin için bir uygulamada derlemesine izin vermek yeterlidir.
Şablonunuz uygulamanızı yönlendirir. Bir DSL gibi muamele görür . AngularJS bileşenlerini yazarsınız ve AngularJS, bunları şablonunuzun yapısına bağlı olarak içeri çekmeye ve doğru zamanda kullanılabilir hale getirmeye özen gösterir. Bu, şablonun yalnızca çıktı için olduğu standart bir MVC modelinden çok farklıdır .
Örneğin XSLT'ye Ruby on Rails'den daha çok benziyor .
Bu, bazılarının alışması gereken radikal bir kontrol tersidir.
Uygulamanızı JavaScript'inizden almaya çalışmayı bırakın. Şablonun uygulamayı sürmesine izin verin ve AngularJS'nin bileşenleri birbirine bağlamaya özen gösterin. Bu aynı zamanda Açısal yoldur.
Anlamsal HTML ve Anlambilimsel Modeller
JQuery ile HTML sayfanızda anlamsal anlamlı içerik bulunmalıdır. JavaScript kapalıysa (bir kullanıcı veya arama motoru tarafından) içeriğiniz erişilebilir durumda kalır.
Çünkü AngularJS HTML sayfanızı şablon olarak değerlendirir. İçeriğinizin tipik olarak modelinizde, sonuçta API'nızdan geldiği için saklandığı için şablonun anlamsal olması gerekmez. AngularJS, anlamsal bir web sayfası oluşturmak için DOM'nizi modelle derler.
HTML kaynağınız artık anlamsal değildir, bunun yerine API'niz ve derlenen DOM'unuz anlamsaldır.
AngularJS'de, yani modelde yaşayan HTML, yalnızca görüntüleme için sadece bir şablondur.
Bu noktada, muhtemelen SEO ve erişilebilirlik ile ilgili her türlü sorunuz var ve haklı olarak. Burada açık konular var. Çoğu ekran okuyucu artık JavaScript'i ayrıştıracaktır. Arama motorları AJAXed içeriğini de dizine ekleyebilir . Bununla birlikte, pushstate URL'leri kullandığınızdan ve iyi bir site haritanız olduğundan emin olmak istersiniz. Sorunun tartışması için buraya bakın: https://stackoverflow.com/a/23245379/687677
Endişelerin ayrılması (SOC) ve MVC
Endişelerin ayrılması (SOC), SEO, erişilebilirlik ve tarayıcı uyumsuzluğu dahil olmak üzere çeşitli nedenlerle web geliştirme yıllarca büyüyen bir modeldir. Şöyle görünüyor:
- HTML - Anlamsal anlam. HTML tek başına olmalıdır.
- CSS - Stil oluşturma, CSS olmadan sayfa hala okunabilir durumda.
- JavaScript - Davranış, komut dosyası olmadan içerik kalır.
Yine, AngularJS kurallarına göre oynamaz. Bir vuruşta, AngularJS, alınan on yıllık bilgeliği ortadan kaldırır ve bunun yerine, şablonun artık semantik olmadığı, hatta biraz bile olmadığı bir MVC deseni uygular.
Şöyle görünüyor:
- Model - modelleriniz semantik verilerinizi içerir. Modeller genellikle JSON nesneleridir. Modeller $ scope adlı bir nesnenin nitelikleri olarak bulunur. Ayrıca, kullanışlı yardımcı program işlevlerini, şablonlarınızın daha sonra erişebileceği $ scope'da saklayabilirsiniz.
- Görünüm - Görünümleriniz HTML ile yazılmıştır. Görünüm genellikle semantik değildir, çünkü verileriniz modelde yaşar.
- Denetleyici - Denetleyiciniz, görünümü modele bağlayan bir JavaScript işlevidir. İşlevi $ kapsamını başlatmaktır. Uygulamanıza bağlı olarak, bir denetleyici oluşturmanız gerekebilir veya gerekmeyebilir. Bir sayfada birçok denetleyiciniz olabilir.
MVC ve SOC aynı ölçeğin zıt uçlarında değil, tamamen farklı eksenlerde. SOC, AngularJS bağlamında bir anlam ifade etmiyor. Unutmalı ve devam etmelisin.
Benim gibi tarayıcı savaşlarında yaşadıysanız, bu fikri oldukça rahatsız edici bulabilirsiniz. Üstesinden gel, buna değecek, söz veriyorum.
Eklentiler ve Yönergeler
Eklentiler jQuery'yi genişletir. AngularJS Direktifleri tarayıcınızın yeteneklerini artırır.
JQuery'de, jQuery.prototype işlevlerini ekleyerek eklentileri tanımlarız. Ardından, öğeleri seçip sonuçtaki eklentiyi çağırarak bunları DOM'a bağlarız. Fikir, jQuery'nin yeteneklerini genişletmektir.
Örneğin, sayfanızda bir atlıkarınca istiyorsanız, belki de bir gezinme öğesine sarılmış sıralanmamış bir şekil listesi tanımlayabilirsiniz. Daha sonra sayfadaki listeyi seçmek için bazı jQuery yazabilir ve kayan animasyonu yapmak için zaman aşımı olan bir galeri olarak yeniden boyutlandırabilirsiniz.
AngularJS'de direktifleri tanımlarız. Yönerge, bir JSON nesnesi döndüren bir işlevdir. Bu nesne AngularJS'ye hangi DOM öğelerini arayacağını ve bunlarda ne gibi değişiklikler yapılacağını söyler. Yönergeler, icat ettiğiniz öznitelikler veya öğeler kullanılarak şablona bağlanır. Buradaki fikir, HTML'nin yeteneklerini yeni özellikler ve öğelerle genişletmektir.
AngularJS yöntemi, yerel görünümlü HTML'nin özelliklerini genişletmektir. Özel özelliklere ve öğelere sahip, HTML'ye benzeyen bir HTML yazmalısınız.
Bir atlıkarınca istiyorsanız, sadece bir <carousel />
öğe kullanın , sonra bir şablon çekmek için bir yönerge tanımlayın ve o enayi çalışmasını sağlayın.
Pek çok küçük yönerge ve yapılandırma anahtarları ile büyük eklentiler
JQuery ile eğilim, daha sonra çok sayıda değer ve seçenek ileterek yapılandırdığımız ışık kutusu gibi büyük büyük eklentiler yazmaktır.
Bu AngularJS'de bir hatadır.
Bir açılır menü örneğini ele alalım. Bir açılır menü eklentisi yazarken, tıklama işleyicilerinde kodlamaya cazip gelebilirsiniz, belki de yukarı veya aşağı bir chevron eklemek için bir işlev olabilir, belki katlanmamış öğenin sınıfını değiştirebilir, menüyü gizlemeyi gösterebilir, tüm yararlı şeyler.
Küçük bir değişiklik yapmak isteyene kadar.
Fareyle üzerine gelmek istediğiniz bir menünüz olduğunu varsayalım. Şimdi bir sorunumuz var. Eklentimiz bizim için tıklama işleyicimize bağlandı, bu özel durumda farklı davranması için bir yapılandırma seçeneği eklememiz gerekecek.
AngularJS'de daha küçük yönergeler yazıyoruz. Açılır yönergemiz gülünç derecede küçük olacaktır. Katlanmış durumu koruyabilir ve katlamak (), açmak () veya geçiş yapmak () için yöntemler sağlayabilir. Bu yöntemler, durumu tutan bir boole olan $ scope.menu.visible dosyasını güncelleyecektir.
Şimdi şablonumuzda bunu bağlayabiliriz:
<a ng-click="toggle()">Menu</a>
<ul ng-show="menu.visible">
...
</ul>
Fareyle üzerine gelindiğinde güncelleme mi gerekiyor?
<a ng-mouseenter="unfold()" ng-mouseleave="fold()">Menu</a>
<ul ng-show="menu.visible">
...
</ul>
Şablon uygulamayı yönlendirir, böylece HTML düzeyinde ayrıntı elde ederiz. Büyük / küçük harf istisnaları yapmak istiyorsanız, şablon bunu kolaylaştırır.
Kapanış ve $ kapsam
JQuery eklentileri bir kapanışta oluşturulur. Gizlilik bu kapanış içerisinde korunur. Kapsam zincirinizi bu kapak içinde tutmak size kalmış. Sadece jQuery tarafından eklentiye iletilen DOM düğümleri kümesine, ayrıca kapakta tanımlanan tüm yerel değişkenlere ve tanımladığınız globallere erişebilirsiniz. Bu, eklentilerin oldukça bağımsız olduğu anlamına gelir. Bu iyi bir şey, ancak bütün bir uygulama oluştururken kısıtlayıcı olabilir. Dinamik bir sayfanın bölümleri arasında veri aktarmaya çalışmak bir angarya haline gelir.
AngularJS $ kapsam nesneleri içerir. Bunlar, modelinizi sakladığınız AngularJS tarafından oluşturulan ve korunan özel nesnelerdir. Belirli yönergeler, varsayılan olarak JavaScript prototipsel miras kullanarak $ kapsamını sarmadan devralan yeni bir $ kapsamı oluşturur. $ Scope nesnesine denetleyiciden ve görünümden erişilebilir.
Bu akıllı kısım. $ Scope mirasının yapısı kabaca DOM'un yapısını takip ettiğinden, elemanlar kendi kapsamlarına ve küresel kapsamı (global kapsamla aynı değildir) sonuna kadar sorunsuz bir şekilde kapsamlara sahiptir.
Bu, verilerin etrafından aktarılmasını ve verilerin uygun bir düzeyde depolanmasını kolaylaştırır. Bir açılır liste açılırsa, yalnızca açılır $ kapsamının bilmesi gerekir. Kullanıcı tercihlerini güncellerse, global $ kapsamını güncellemek isteyebilirsiniz ve kullanıcı tercihlerini dinleyen içiçe kapsamlar otomatik olarak uyarılır.
Bu karmaşık görünebilir, aslında, bir kez gevşediğinizde, uçmak gibidir. $ Scope nesnesini oluşturmanıza gerek yoktur; AngularJS, şablon hiyerarşinize dayanarak sizin için doğru ve uygun bir şekilde başlatır ve yapılandırır. AngularJS daha sonra bağımlılık enjeksiyonunun büyüsünü kullanarak bileşeniniz için kullanılabilir hale getirir (daha sonra bu konuda daha fazla bilgi).
Manuel DOM değişiklikleri ve Veri Bağlama karşılaştırması
JQuery'de tüm DOM değişikliklerinizi elle yaparsınız. Programlı olarak yeni DOM öğeleri oluşturursunuz. Bir JSON diziniz varsa ve bunu DOM'ye koymak istiyorsanız, HTML'yi oluşturmak ve eklemek için bir işlev yazmanız gerekir.
AngularJS'de bunu da yapabilirsiniz, ancak veri bağlamayı kullanmanız önerilir. Modelinizi değiştirin ve DOM bir şablon aracılığıyla ona bağlı olduğundan DOM'nuz otomatik olarak güncellenir, müdahale gerekmez.
Veri bağlama, bir öznitelik veya süslü ayraç sözdizimi kullanılarak şablondan yapıldığından, yapılması çok kolaydır. Bununla ilişkili küçük bir bilişsel yük vardır, böylece kendinizi her zaman yaparken bulacaksınız.
<input ng-model="user.name" />
Giriş elemanını konumuna bağlar $scope.user.name
. Girişin güncellenmesi mevcut kapsamınızdaki değeri güncelleyecektir veya bunun tersi de geçerlidir.
Aynı şekilde:
<p>
{{user.name}}
</p>
paragrafta kullanıcı adını çıktılar. Bu canlı bir ciltleme olduğundan, $scope.user.name
değer güncellenirse şablon da güncellenir.
Ajax her zaman
JQuery'de bir Ajax çağrısı yapmak oldukça basittir, ancak yine de iki kez düşünebileceğiniz bir şeydir. Düşünülmesi gereken ek karmaşıklık ve sürdürülecek adil bir senaryo grubu var.
AngularJS'de, Ajax varsayılan go-to-çözümünüzdür ve neredeyse fark etmeden her zaman olur. Ng-include içeren şablonlar ekleyebilirsiniz. En basit özel yönergeye sahip bir şablon uygulayabilirsiniz. Bir Ajax çağrısını bir hizmete sarabilir ve kendinize bir GitHub hizmeti veya şaşırtıcı bir şekilde erişebileceğiniz bir Flickr hizmeti oluşturabilirsiniz.
Hizmet Nesneleri ve Yardımcı İşlevleri
JQuery'de, bir API'dan özet akışı çekmek gibi dom ile ilgili olmayan küçük bir görevi gerçekleştirmek istiyorsak, bunu kapatmamız için küçük bir işlev yazabiliriz. Bu geçerli bir çözüm, ancak bu feed'e sık sık erişmek istiyorsak? Bu kodu başka bir uygulamada yeniden kullanmak istersek ne olur?
AngularJS bize servis nesneleri veriyor.
Hizmetler, işlevler ve veriler içeren basit nesnelerdir. Onlar her zaman singletonlardır, yani hiçbir zaman birden fazla olamaz. Stack Overflow API'sına erişmek istediğimizi, bunun StackOverflowService
için yöntemleri tanımlayan bir tane yazabileceğimizi varsayalım.
Diyelim ki bir alışveriş sepetimiz var. Sepetimizi koruyan ve öğe eklemek ve kaldırmak için yöntemler içeren bir ShoppingCartService tanımlayabiliriz. Hizmet tekil olduğu ve diğer tüm bileşenler tarafından paylaşıldığı için, alışveriş sepetine yazması gereken herhangi bir nesne alışveriş sepetinden veri alabilir. Her zaman aynı araba.
Hizmet nesneleri, uygun gördüğümüz şekilde kullanabileceğimiz ve yeniden kullanabileceğimiz bağımsız AngularJS bileşenleridir. Bunlar, işlevler ve Veri içeren basit JSON nesneleridir. Bunlar her zaman tekil öğelerdir, bu nedenle bir hizmetteki verileri tek bir yerde depolarsanız, aynı hizmeti talep ederek bu verileri başka bir yere alabilirsiniz.
AngularJS bağımlılıklarınızı sizin için yönetir. Bir nesne istiyorsanız, ona bakın ve AngularJS sizin için alacaktır.
Bunu kullanmaya başlayana kadar, bunun ne kadar büyük bir nimet olduğunu açıklamak zor. JQuery içinde AngularJS DI gibi bir şey yoktur.
DI, uygulamanızı yazmak ve kablolamak yerine, her biri bir dize ile tanımlanan bir bileşen kitaplığı tanımladığınız anlamına gelir.
Diyelim 'FlickrService' adlı bir bileşenim var, bu JSON özet akışlarını Flickr'den çekme yöntemlerini tanımlar. Şimdi, Flickr'a erişebilen bir denetleyici yazmak istersem, denetleyiciyi bildirirken ada göre 'FlickrService'e başvurmam gerekiyor. AngularJS, bileşeni başlatmaya ve kontrol cihazımın kullanımına sunmaya özen gösterir.
Örneğin, burada bir hizmet tanımlarım:
myApp.service('FlickrService', function() {
return {
getFeed: function() { // do something here }
}
});
Şimdi bu hizmeti kullanmak istediğinizde, sadece bu şekilde adıyla atıfta bulunuyorum:
myApp.controller('myController', ['FlickrService', function(FlickrService) {
FlickrService.getFeed()
}]);
AngularJS, denetleyiciyi örneklemek için bir FlickrService nesnesinin gerekli olduğunu anlayacak ve bize bir tane sağlayacaktır.
Bu, kablolama işlerini birlikte çok kolay hale getirir ve spagettifikasyona olan eğilimi hemen hemen ortadan kaldırır. Düz bir bileşen listemiz var ve AngularJS bunları ihtiyaç duyduğumuzda ve teker teker bize veriyor.
Modüler servis mimarisi
jQuery kodunuzu nasıl organize etmeniz gerektiği hakkında çok az şey söylüyor. AngularJS'nin görüşleri vardır.
AngularJS size kodunuzu yerleştirebileceğiniz modüller sağlar. Örneğin Flickr ile konuşan bir komut dosyası yazıyorsanız, Flickr ile ilgili tüm işlevlerinizi içine almak için bir Flickr modülü oluşturmak isteyebilirsiniz. Modüller diğer modülleri (DI) içerebilir. Ana uygulamanız genellikle bir modüldür ve bu, uygulamanızın bağlı olacağı diğer tüm modülleri içermelidir.
Basit bir kod kullanımı elde edersiniz, Flickr tabanlı başka bir uygulama yazmak istiyorsanız, Flickr modülünü ve voila'yı dahil edebilirsiniz, yeni uygulamanızdaki tüm Flickr ile ilgili işlevlere erişebilirsiniz.
Modüller AngularJS bileşenleri içerir. Bir modül eklediğimizde, o modüldeki tüm bileşenler, benzersiz dizeleriyle tanımlanan basit bir liste olarak kullanılabilir hale gelir . Daha sonra bu bileşenleri AngularJS'nin bağımlılık enjeksiyon mekanizmasını kullanarak birbirine enjekte edebiliriz.
Sonuç olarak
Açısal JS ve jQuery düşman değildir. AngularJS içinde jQuery kullanmak çok güzel. AngularJS'yi iyi kullanıyorsanız (şablonlar, veri bağlama, $ kapsam, yönergeler, vb.) Aksi halde ihtiyacınız olabileceklerden çok daha az jQuery'ye ihtiyacınız olduğunu göreceksiniz .
Gerçekleştirilecek en önemli şey, şablonunuzun uygulamanızı yönlendirmesidir. Her şeyi yapan büyük eklentiler yazmaya çalışmayı bırakın. Bunun yerine, bir şey yapan küçük yönergeler yazın, sonra bunları birbirine bağlamak için basit bir şablon yazın.
Göze batmayan JavaScript hakkında daha az düşünün ve bunun yerine HTML uzantıları açısından düşünün.
Benim küçük kitabım
AngularJS hakkında çok heyecanlandım, üzerine çevrimiçi okumak için çok hoşunuza gidebileceğiniz kısa bir kitap yazdım http://nicholasjohnson.com/angular-book/ . Umarım faydalıdır.