AngularJS vs jQuery
AngularJS dan jQuery mengadopsi ideologi yang sangat berbeda. Jika Anda berasal dari jQuery, Anda mungkin menemukan beberapa perbedaan yang mengejutkan. Sudut dapat membuat Anda marah.
Ini normal, Anda harus mendorong. Angular sepadan.
Perbedaan besar (TLDR)
jQuery memberi Anda toolkit untuk memilih bit DOM yang sewenang-wenang dan membuat perubahan ad-hoc padanya. Anda dapat melakukan hampir semua hal yang Anda suka sepotong demi sepotong.
AngularJS malah memberi Anda kompiler .
Apa artinya ini adalah bahwa AngularJS membaca seluruh DOM Anda dari atas ke bawah dan memperlakukannya sebagai kode, secara harfiah sebagai instruksi ke kompiler. Ketika melintasi DOM, ia mencari arahan khusus (arahan kompiler) yang memberi tahu kompiler AngularJ bagaimana berperilaku dan apa yang harus dilakukan. Arahan adalah objek kecil yang penuh dengan JavaScript yang dapat cocok dengan atribut, tag, kelas, atau bahkan komentar.
Ketika kompiler Angular menentukan bahwa sepotong DOM cocok dengan direktif tertentu, ia memanggil fungsi direktif, meneruskannya elemen DOM, atribut apa pun, $ lingkup saat ini (yang merupakan toko variabel lokal), dan beberapa bit berguna lainnya. Atribut-atribut ini dapat berisi ekspresi yang dapat ditafsirkan oleh Arahan, dan yang memberi tahu cara membuat, dan kapan harus menggambar ulang itu sendiri.
Arahan kemudian dapat menarik komponen Angular tambahan seperti pengontrol, layanan, dll. Apa yang keluar di bagian bawah kompiler adalah aplikasi web yang sepenuhnya terbentuk, terhubung dan siap untuk digunakan.
Ini berarti bahwa Angular adalah Template Driven . Template Anda mendorong JavaScript, bukan sebaliknya. Ini adalah pembalikan peran yang radikal, dan kebalikan total dari JavaScript yang tidak mencolok yang telah kami tulis selama 10 tahun terakhir. Ini perlu waktu untuk membiasakan diri.
Jika ini kedengarannya terlalu preskriptif dan membatasi, tidak ada yang lebih jauh dari kebenaran. Karena AngularJS memperlakukan HTML Anda sebagai kode, Anda mendapatkan rincian tingkat HTML dalam aplikasi web Anda . Segalanya mungkin, dan kebanyakan hal ternyata sangat mudah begitu Anda membuat lompatan konseptual.
Mari kita turun ke seluk beluk.
Pertama, Angular tidak menggantikan jQuery
Angular dan jQuery melakukan hal yang berbeda. AngularJS memberi Anda satu set alat untuk menghasilkan aplikasi web. jQuery terutama memberi Anda alat untuk memodifikasi DOM. Jika jQuery ada di halaman Anda, AngularJS akan menggunakannya secara otomatis. Jika tidak, AngularJS dikirimkan dengan jQuery Lite, yang merupakan versi jQuery yang dapat dikurangi, tetapi masih dapat digunakan dengan sempurna.
Misko suka jQuery dan tidak keberatan Anda menggunakannya. Namun demikian, Anda akan mengetahui bahwa Anda dapat menyelesaikan hampir semua pekerjaan Anda menggunakan kombinasi cakupan, templat, dan arahan, dan Anda harus memilih alur kerja ini jika memungkinkan karena kode Anda akan lebih diskrit, lebih dapat dikonfigurasi, dan lebih banyak lagi Sudut.
Jika Anda menggunakan jQuery, Anda tidak harus memercikkannya di semua tempat. Tempat yang tepat untuk manipulasi DOM di AngularJS adalah dalam arahan. Lebih lanjut tentang ini nanti.
JavaScript tidak mencolok dengan Selectors vs. Declarative Templates
jQuery biasanya diterapkan secara tidak mencolok. Kode JavaScript Anda ditautkan di header (atau footer), dan ini adalah satu-satunya tempat yang disebutkan. Kami menggunakan penyeleksi untuk memilih bit halaman dan menulis plugin untuk memodifikasi bagian-bagian itu.
JavaScript di kontrol. HTML memiliki keberadaan yang sepenuhnya independen. HTML Anda tetap semantik bahkan tanpa JavaScript. Atribut Onclick adalah praktik yang sangat buruk.
Salah satu hal pertama yang akan Anda perhatikan tentang AngularJS adalah atribut khusus ada di mana-mana . HTML Anda akan dipenuhi dengan atribut, yang pada dasarnya adalah atribut onClick pada steroid. Ini adalah arahan (arahan kompiler), dan merupakan salah satu cara utama di mana templat terhubung ke model.
Ketika Anda pertama kali melihat ini, Anda mungkin tergoda untuk menulis AngularJS sebagai JavaScript mengganggu sekolah lama (seperti yang saya lakukan pada awalnya). Bahkan, AngularJS tidak bermain dengan aturan itu. Di AngularJS, HTML5 Anda adalah templat. Ini dikompilasi oleh AngularJS untuk menghasilkan halaman web Anda.
Ini perbedaan besar pertama. Untuk jQuery, halaman web Anda adalah DOM untuk dimanipulasi. Untuk AngularJS, HTML Anda adalah kode yang harus dikompilasi. AngularJS membaca di seluruh halaman web Anda dan secara harfiah mengkompilasinya menjadi halaman web baru menggunakan kompiler bawaannya.
Template Anda harus deklaratif; maknanya harus jelas hanya dengan membacanya. Kami menggunakan atribut khusus dengan nama yang bermakna. Kami membuat elemen HTML baru, lagi dengan nama yang bermakna. Seorang desainer dengan pengetahuan HTML minimal dan tanpa keterampilan coding dapat membaca template AngularJS Anda dan memahami apa yang dilakukannya. Ia dapat melakukan modifikasi. Ini adalah cara Angular.
Templatnya ada di kursi pengemudi.
Salah satu pertanyaan pertama yang saya tanyakan pada diri saya ketika memulai AngularJS dan menjalankan tutorial adalah "Di mana kode saya?" . Saya tidak menulis JavaScript, namun saya memiliki semua perilaku ini. Jawabannya jelas. Karena AngularJS mengkompilasi DOM, AngularJS memperlakukan HTML Anda sebagai kode. Untuk banyak kasus sederhana seringkali cukup hanya dengan menulis templat dan membiarkan AngularJS mengompilasinya menjadi aplikasi untuk Anda.
Template Anda mendorong aplikasi Anda. Ini diperlakukan sebagai DSL . Anda menulis komponen AngularJS, dan AngularJS akan menariknya dan membuatnya tersedia pada waktu yang tepat berdasarkan struktur templat Anda. Ini sangat berbeda dengan pola MVC standar , di mana template hanya untuk output.
Ini lebih mirip dengan XSLT daripada Ruby on Rails misalnya.
Ini adalah pembalikan kontrol radikal yang perlu dibiasakan.
Berhentilah mencoba mengarahkan aplikasi Anda dari JavaScript. Biarkan templat menggerakkan aplikasi, dan biarkan AngularJS merawat kabel komponen bersama-sama. Ini juga merupakan cara Angular.
HTML Semantik vs. Model Semantik
Dengan jQuery, halaman HTML Anda harus berisi konten bermakna semantik. Jika JavaScript dimatikan (oleh pengguna atau mesin pencari) konten Anda tetap dapat diakses.
Karena AngularJS memperlakukan halaman HTML Anda sebagai templat. Template tidak seharusnya semantik karena konten Anda biasanya disimpan dalam model Anda yang pada akhirnya berasal dari API Anda. AngularJS mengkompilasi DOM Anda dengan model untuk menghasilkan halaman web semantik.
Sumber HTML Anda tidak lagi semantik, sebaliknya, API Anda dan DOM yang dikompilasi adalah semantik.
Di AngularJS, makna hidup dalam model, HTML hanyalah templat, hanya untuk tampilan.
Pada titik ini Anda mungkin memiliki semua pertanyaan tentang SEO dan aksesibilitas, dan memang demikian. Ada masalah terbuka di sini. Sebagian besar pembaca layar sekarang akan menguraikan JavaScript. Mesin pencari juga dapat mengindeks konten AJAXed . Namun demikian, Anda harus memastikan bahwa Anda menggunakan URL pushstate dan Anda memiliki sitemap yang baik. Lihat di sini untuk diskusi tentang masalah ini: https://stackoverflow.com/a/23245379/687677
Pemisahan keprihatinan (SOC) vs MVC
Pemisahan keprihatinan (SOC) adalah pola yang tumbuh selama bertahun-tahun dalam pengembangan web karena berbagai alasan termasuk SEO, aksesibilitas dan ketidakcocokan browser. Ini terlihat seperti ini:
- HTML - Arti semantik. HTML harus berdiri sendiri.
- CSS - Styling, tanpa CSS halaman masih dapat dibaca.
- JavaScript - Perilaku, tanpa skrip, konten tetap ada.
Sekali lagi, AngularJS tidak bermain sesuai aturan mereka. Dalam satu pukulan, AngularJS menghilangkan satu dekade kearifan yang diterima dan sebagai gantinya menerapkan pola MVC di mana templat tidak lagi semantik, bahkan tidak sedikit.
Ini terlihat seperti ini:
- Model - model Anda berisi data semantik Anda. Model biasanya objek JSON . Model ada sebagai atribut dari objek yang disebut $ scope. Anda juga dapat menyimpan fungsi-fungsi utilitas praktis pada $ scope yang dapat diakses oleh template Anda.
- Lihat - Pandangan Anda ditulis dalam HTML. Tampilan biasanya tidak semantik karena data Anda hidup dalam model.
- Pengontrol - Pengontrol Anda adalah fungsi JavaScript yang mengaitkan tampilan ke model. Fungsinya untuk menginisialisasi $ scope. Tergantung pada aplikasi Anda, Anda mungkin atau mungkin tidak perlu membuat pengontrol. Anda dapat memiliki banyak pengontrol di satu halaman.
MVC dan SOC tidak berada pada ujung yang berlawanan dari skala yang sama, mereka berada pada sumbu yang sama sekali berbeda. SOC tidak masuk akal dalam konteks AngularJS. Anda harus melupakannya dan melanjutkan.
Jika, seperti saya, Anda hidup melalui perang browser, Anda mungkin menemukan ide ini cukup ofensif. Lupakan, itu akan sia-sia, aku janji.
Plugin vs Arahan
Plugin memperpanjang jQuery. Arahan AngularJS memperluas kemampuan browser Anda.
Di jQuery kami mendefinisikan plugin dengan menambahkan fungsi ke jQuery.prototype. Kami kemudian menghubungkan ini ke DOM dengan memilih elemen dan memanggil plugin pada hasilnya. Idenya adalah untuk memperluas kemampuan jQuery.
Misalnya, jika Anda ingin korsel di halaman Anda, Anda dapat menentukan daftar angka yang tidak terurut, mungkin dibungkus dengan elemen nav. Anda kemudian dapat menulis beberapa jQuery untuk memilih daftar pada halaman dan mengubah gaya itu sebagai galeri dengan batas waktu untuk melakukan animasi geser.
Di AngularJS, kami mendefinisikan arahan. Arahan adalah fungsi yang mengembalikan objek JSON. Objek ini memberi tahu AngularJS elemen DOM apa yang harus dicari, dan perubahan apa yang harus dilakukan padanya. Arahan terhubung ke template menggunakan atribut atau elemen, yang Anda temukan. Idenya adalah untuk memperluas kemampuan HTML dengan atribut dan elemen baru.
Cara AngularJS adalah untuk memperluas kemampuan HTML yang tampak asli. Anda harus menulis HTML yang mirip HTML, diperluas dengan atribut dan elemen khusus.
Jika Anda ingin korsel, cukup gunakan <carousel />
elemen, lalu tentukan arahan untuk menarik template, dan buat pengisap itu berfungsi.
Banyak arahan kecil vs. plugin besar dengan sakelar konfigurasi
Kecenderungan dengan jQuery adalah untuk menulis plugin besar yang hebat seperti lightbox yang kemudian kita konfigurasikan dengan mengirimkan berbagai nilai dan opsi.
Ini adalah kesalahan di AngularJS.
Ambil contoh dropdown. Saat menulis plugin dropdown Anda mungkin tergoda untuk kode di penangan klik, mungkin fungsi untuk menambahkan chevron yang naik atau turun, mungkin mengubah kelas elemen yang tidak dilipat, tampilkan sembunyikan menu, semua hal bermanfaat.
Sampai Anda ingin melakukan perubahan kecil.
Katakanlah Anda memiliki menu yang ingin Anda buka di hover. Nah sekarang kita punya masalah. Plugin kami telah menghubungkan kabel di handler klik kami untuk kami, kami akan perlu menambahkan opsi konfigurasi untuk membuatnya berperilaku berbeda dalam kasus khusus ini.
Di AngularJS kami menulis arahan yang lebih kecil. Arahan dropdown kami akan sangat kecil. Mungkin mempertahankan status terlipat, dan menyediakan metode untuk melipat (), membuka () atau beralih (). Metode-metode ini hanya akan memperbarui $ scope.menu.visible yang merupakan boolean yang memegang status.
Sekarang di templat kami, kami dapat memasang ini:
<a ng-click="toggle()">Menu</a>
<ul ng-show="menu.visible">
...
</ul>
Perlu memperbarui di mouseover?
<a ng-mouseenter="unfold()" ng-mouseleave="fold()">Menu</a>
<ul ng-show="menu.visible">
...
</ul>
Template mendorong aplikasi sehingga kami mendapatkan rincian tingkat HTML. Jika kita ingin membuat pengecualian kasus per kasus, templat membuatnya mudah.
Penutupan vs. $ scope
Plugin JQuery dibuat dalam penutupan. Privasi dijaga dalam penutupan itu. Terserah Anda untuk mempertahankan rantai cakupan Anda dalam penutupan itu. Anda hanya benar-benar memiliki akses ke set node DOM yang diteruskan ke plugin oleh jQuery, ditambah variabel lokal apa pun yang ditentukan dalam penutupan dan semua global yang telah Anda tetapkan. Ini berarti plugin cukup lengkap. Ini adalah hal yang baik, tetapi bisa membatasi ketika membuat seluruh aplikasi. Mencoba meneruskan data antara bagian halaman dinamis menjadi tugas.
AngularJS memiliki objek $ lingkup. Ini adalah objek khusus yang dibuat dan dikelola oleh AngularJS di mana Anda menyimpan model Anda. Arahan tertentu akan menghasilkan $ lingkup baru, yang secara default mewarisi dari $ lingkup pembungkusnya menggunakan warisan prototipe JavaScript. Objek $ scope dapat diakses di controller dan view.
Ini bagian yang pintar. Karena struktur $ lingkup pewarisan kira-kira mengikuti struktur DOM, elemen memiliki akses ke cakupannya sendiri, dan segala lingkup yang berisi mulus, sampai ke lingkup $ global (yang tidak sama dengan lingkup global).
Ini membuatnya lebih mudah untuk meneruskan data, dan untuk menyimpan data pada tingkat yang sesuai. Jika dropdown dibuka, hanya ruang lingkup $ dropdown yang perlu mengetahuinya. Jika pengguna memperbarui preferensi mereka, Anda mungkin ingin memperbarui lingkup $ global, dan setiap ruang bersarang mendengarkan preferensi pengguna akan secara otomatis diperingatkan.
Ini mungkin terdengar rumit, pada kenyataannya, begitu Anda bersantai, itu seperti terbang. Anda tidak perlu membuat objek $ scope, AngularJS membuat instantiate dan mengkonfigurasinya untuk Anda, dengan benar dan tepat berdasarkan hierarki templat Anda. AngularJS kemudian membuatnya tersedia untuk komponen Anda menggunakan keajaiban injeksi ketergantungan (lebih lanjut tentang ini nanti).
Perubahan DOM manual vs. Pengikatan Data
Di jQuery, Anda membuat semua perubahan DOM dengan tangan. Anda membangun elemen DOM baru secara terprogram. Jika Anda memiliki larik JSON dan ingin meletakkannya di DOM, Anda harus menulis fungsi untuk menghasilkan HTML dan menyisipkannya.
Di AngularJS Anda dapat melakukan ini juga, tetapi Anda dianjurkan untuk menggunakan pengikatan data. Ubah model Anda, dan karena DOM terikat padanya melalui templat, DOM Anda akan secara otomatis memperbarui, tidak diperlukan intervensi.
Karena pengikatan data dilakukan dari template, menggunakan atribut atau sintaks kurung kurawal, itu sangat mudah dilakukan. Ada sedikit overhead kognitif yang terkait dengannya sehingga Anda akan menemukan diri Anda melakukannya sepanjang waktu.
<input ng-model="user.name" />
Ikat elemen input ke $scope.user.name
. Memperbarui input akan memperbarui nilai dalam ruang lingkup Anda saat ini, dan sebaliknya.
Juga:
<p>
{{user.name}}
</p>
akan menampilkan nama pengguna dalam paragraf. Ini adalah pengikatan langsung, jadi jika $scope.user.name
nilainya diperbarui, template juga akan diperbarui.
Ajax sepanjang waktu
Di jQuery membuat panggilan Ajax cukup sederhana, tetapi itu masih sesuatu yang Anda mungkin berpikir dua kali. Ada kerumitan tambahan untuk dipikirkan, dan sepotong script yang harus dipelihara.
Di AngularJS, Ajax adalah solusi masuk ke default Anda dan itu terjadi setiap saat, hampir tanpa Anda sadari. Anda dapat memasukkan template dengan ng-include. Anda dapat menerapkan templat dengan arahan khusus yang paling sederhana. Anda dapat membungkus panggilan Ajax dalam layanan dan membuat sendiri layanan GitHub , atau layanan Flickr , yang dapat Anda akses dengan mudah.
Obyek Layanan vs Fungsi Helper
Di jQuery, jika kami ingin menyelesaikan tugas kecil yang tidak terkait dengan dom, seperti menarik umpan dari API, kami mungkin menulis sedikit fungsi untuk melakukannya di penutupan kami. Itu solusi yang valid, tetapi bagaimana jika kita sering mengakses feed itu? Bagaimana jika kita ingin menggunakan kembali kode itu di aplikasi lain?
AngularJS memberi kita objek layanan.
Layanan adalah objek sederhana yang berisi fungsi dan data. Mereka selalu lajang, artinya tidak akan pernah ada lebih dari satu dari mereka. Katakanlah kita ingin mengakses Stack Overflow API, kita mungkin menulis StackOverflowService
yang mendefinisikan metode untuk melakukannya.
Katakanlah kita memiliki keranjang belanja. Kami mungkin mendefinisikan ShoppingCartService yang mengelola keranjang kami dan berisi metode untuk menambah dan menghapus item. Karena layanan ini singleton, dan digunakan bersama oleh semua komponen lain, objek apa pun yang perlu dapat menulis ke keranjang belanja dan menarik data darinya. Itu selalu keranjang yang sama.
Objek layanan adalah komponen AngularJS mandiri yang dapat kita gunakan dan gunakan kembali sesuai keinginan kita. Mereka adalah objek JSON sederhana yang berisi fungsi dan data. Mereka selalu lajang, jadi jika Anda menyimpan data pada layanan di satu tempat, Anda bisa mengeluarkan data itu di tempat lain hanya dengan meminta layanan yang sama.
Dependency injection (DI) vs. Instatiation - alias de-spaghettification
AngularJS mengelola dependensi Anda untuk Anda. Jika Anda menginginkan objek, cukup rujuk dan AngularJS akan mendapatkannya untuk Anda.
Sampai Anda mulai menggunakan ini, sulit untuk menjelaskan betapa besar manfaatnya waktu ini. Tidak ada yang seperti AngularJS DI ada di dalam jQuery.
DI berarti bahwa alih-alih menulis aplikasi Anda dan menghubungkannya bersama-sama, Anda malah menentukan pustaka komponen, masing-masing diidentifikasi oleh string.
Katakanlah saya memiliki komponen yang disebut 'FlickrService' yang mendefinisikan metode untuk menarik umpan JSON dari Flickr. Sekarang, jika saya ingin menulis controller yang dapat mengakses Flickr, saya hanya perlu merujuk ke 'FlickrService' dengan namanya ketika saya mendeklarasikan controller. AngularJS akan merawat instantiating komponen dan membuatnya tersedia untuk controller saya.
Sebagai contoh, di sini saya mendefinisikan layanan:
myApp.service('FlickrService', function() {
return {
getFeed: function() { // do something here }
}
});
Sekarang ketika saya ingin menggunakan layanan itu, saya hanya menyebutnya dengan nama seperti ini:
myApp.controller('myController', ['FlickrService', function(FlickrService) {
FlickrService.getFeed()
}]);
AngularJS akan mengenali bahwa objek FlickrService diperlukan untuk instantiate controller, dan akan memberikan satu untuk kita.
Hal ini membuat pemasangan kabel menjadi sangat mudah, dan cukup banyak menghilangkan kecenderungan menuju spagettification. Kami memiliki daftar komponen yang datar, dan AngularJS menyerahkannya kepada kami satu per satu saat dan ketika kami membutuhkannya.
Arsitektur layanan modular
jQuery mengatakan sangat sedikit tentang bagaimana Anda harus mengatur kode Anda. AngularJS memiliki pendapat.
AngularJS memberi Anda modul di mana Anda dapat menempatkan kode Anda. Jika Anda menulis skrip yang berbicara dengan Flickr misalnya, Anda mungkin ingin membuat modul Flickr untuk memasukkan semua fungsi terkait Flickr Anda. Modul dapat menyertakan modul lain (DI). Aplikasi utama Anda biasanya berupa modul, dan ini harus mencakup semua modul lain yang akan menjadi sandaran aplikasi Anda.
Anda mendapatkan penggunaan kembali kode sederhana, jika Anda ingin menulis aplikasi lain berdasarkan Flickr, Anda cukup memasukkan modul Flickr dan voila, Anda memiliki akses ke semua fungsi terkait Flickr di aplikasi baru Anda.
Modul berisi komponen AngularJS. Ketika kami menyertakan modul, semua komponen dalam modul itu tersedia bagi kami sebagai daftar sederhana yang diidentifikasi oleh string uniknya . Kami kemudian dapat menyuntikkan komponen-komponen tersebut satu sama lain menggunakan mekanisme injeksi ketergantungan AngularJS.
Untuk menyimpulkan
AngularJS dan jQuery bukan musuh. Dimungkinkan untuk menggunakan jQuery dalam AngularJS dengan sangat baik. Jika Anda menggunakan AngularJS dengan baik (templat, pengikatan data, $ scope, arahan, dll.) Anda akan menemukan Anda membutuhkan jQuery yang jauh lebih sedikit daripada yang mungkin Anda perlukan.
Hal utama yang harus disadari adalah bahwa templat Anda mendorong aplikasi Anda. Berhentilah mencoba menulis plugin besar yang melakukan segalanya. Alih-alih menulis arahan kecil yang melakukan satu hal, kemudian tulis templat sederhana untuk menyatukannya.
Pikirkan lebih sedikit tentang JavaScript yang tidak mencolok, dan sebaliknya pikirkan dalam hal ekstensi HTML.
Buku kecilku
Saya sangat bersemangat tentang AngularJS, saya menulis buku pendek tentang itu yang Anda dapat membaca online http://nicholasjohnson.com/angular-book/ . Saya harap ini membantu.