Express, Koa, Meteor, Sails.js: Empat Kerangka Kiamat
Diterbitkan: 2022-03-11JavaScript telah menjadi salah satu bahasa paling populer dalam beberapa tahun terakhir, karena permintaan yang sangat besar untuk aplikasi web. Saat mengkode untuk beberapa browser, JavaScript hampir menjadi satu-satunya pilihan untuk pengembang front-end. Orang mungkin berpendapat bahwa ada CoffeeScript, TypeScript atau Dart sebagai alternatif. Namun, kenyataannya adalah bahwa CoffeeScript sebagian besar dipandang sebagai gula sintaksis yang akhirnya bermuara pada JavaScript. TypeScript hanyalah superset JavaScript yang mencakup beberapa fitur bahasa berorientasi objek, seperti pengetikan statis opsional, kelas dan antarmuka, dan masih dalam tahap awal. Dart juga merupakan bahasa berorientasi objek yang memiliki sintaks seperti C, tetapi masih dikompilasi ke JavaScript untuk browser utama.
Dengan kelahiran dan pertumbuhan pesat Node.js, JavaScript tidak lagi terbatas pada pengembangan front-end, dan pengembangan back-end bukan lagi ilmu roket untuk pembuat kode front-end. Orang cenderung menganggap JavaScript sebagai peluru perak yang cocok di semua situasi: front-end, server web, aplikasi desktop, sistem tertanam, database ... daftarnya terus bertambah panjang. Faktanya, mengingat khalayak luas JavaScript, Node.js+MongoDB+AngularJS/React telah menghasilkan cukup banyak pengembang web tumpukan penuh. Namun, Node.js dirancang agar ringan dan hanya menyediakan fungsionalitas dasar sebagai server web untuk meningkatkan kecepatan pengembangan aplikasi web. Salah satu kerangka kerja yang baik yang tersedia sebagai paket npm akan menjadi pilihan yang lebih baik di dunia nyata.
Dalam posting ini, kita akan membahas beberapa kerangka kerja Node.js yang terkenal dan teruji waktu ini yang telah membebaskan pengembang dari keharusan untuk menemukan kembali roda berulang kali. Untuk lebih spesifik, dalam artikel ini kita akan melihat Express, Koa, Meteor dan Sails.js. Alih-alih mencoba mencari tahu bagaimana masing-masing kerangka kerja ini saling menumpuk, kita akan melihat area utama di mana masing-masing kerangka kerja ini unggul dan bagaimana relevansinya dengan berbagai kebutuhan proyek.
Express: Kerangka Web Minimalis
Tak perlu dikatakan bahwa Express adalah kesepakatan terbesar untuk bisnis Node.js. Setiap pemain Node.js telah mendengarnya dan menggunakannya dengan atau tanpa menyadarinya. Saat ini pada generasi ke-4, dan ada beberapa kerangka kerja Node.js yang dibangun berdasarkan atau terinspirasi oleh konsepnya.
Pertunjukan
Sebagian besar pengembang menyukai Node.js karena kecepatannya, dan ketika sampai pada pemilihan kerangka kerja, seorang perfeksionis mungkin meremehkan segala risiko kinerja. Express menyediakan lapisan tipis di atas Node.js dengan fitur aplikasi web seperti perutean dasar, middleware, mesin templat, dan penyajian file statis, sehingga kinerja I/O yang drastis dari Node.js tidak terganggu.
Express adalah kerangka kerja minimal yang tidak memiliki opini. itu tidak menerapkan salah satu pola desain umum seperti MVC, MVP, MVVM atau apa pun yang sedang tren di luar kotak. Untuk penggemar kesederhanaan, ini adalah nilai tambah yang besar di antara semua kerangka kerja lainnya karena Anda dapat membangun aplikasi Anda dengan preferensi Anda sendiri dan tanpa kurva belajar yang tidak perlu. Ini sangat menguntungkan ketika membuat proyek pribadi baru tanpa beban historis, tetapi seiring pertumbuhan proyek atau tim yang berkembang, kurangnya standarisasi dapat menyebabkan pekerjaan ekstra untuk manajemen proyek/kode, dan skenario terburuk dapat menyebabkan ketidakmampuan untuk mempertahankan .
Generator
Meskipun kerangka tersebut tidak memiliki opini, ia memiliki generator yang menghasilkan struktur folder proyek tertentu. Setelah menginstal paket npm generator ekspres dan membuat kerangka aplikasi dengan perintah generator, folder aplikasi dengan hierarki yang jelas akan dibuat untuk membantu Anda mengatur gambar, JavaScript statis front-end, file stylesheet, dan file template HTML.
npm install express-generator -g express helloapp
create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts
perangkat tengah
Middleware pada dasarnya hanyalah fungsi yang memiliki akses penuh ke objek permintaan dan respons.
Seperti namanya, middleware menerapkan beberapa instruksi penyaringan sebelum menyerahkan kontrol ke logika bisnis yang sebenarnya atau middleware tingkat berikutnya. Beberapa tugas umum termasuk seperti memeriksa status login pengguna, memvalidasi otoritas pengguna, atau mencegah serangan lintas situs paling baik diekstraksi sebagai middleware.
var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);
Aplikasi Express pada dasarnya adalah Node.js dengan sejumlah fungsi middleware, apakah Anda ingin menyesuaikan middleware Anda sendiri atau memanfaatkan middleware bawaan dari kerangka kerja, Express membuat prosesnya alami dan intuitif.
Mesin Template
Mesin template memungkinkan pengembang untuk menyematkan variabel backend ke dalam file HTML, dan ketika diminta, file template akan dirender ke format HTML biasa dengan variabel yang diinterpolasi dengan nilai sebenarnya. Secara default, generator ekspres menggunakan mesin templat Pug (awalnya dikenal sebagai Jade), tetapi opsi lain seperti Kumis dan EJS juga bekerja dengan Express dengan mulus.
Integrasi Basis Data
Sebagai kerangka kerja minimal, Express tidak menganggap integrasi basis data sebagai aspek yang diperlukan dalam paketnya, sehingga tidak mengarah pada penggunaan basis data khusus apa pun. Sementara mengadopsi teknologi penyimpanan data tertentu, baik itu MySQL, MongoDB, PostgreSQL, Redis, ElasticSearch atau yang lainnya, itu hanya masalah menginstal paket npm tertentu sebagai driver database. Driver basis data pihak ketiga ini tidak sesuai dengan sintaks terpadu saat melakukan instruksi CRUD, yang membuat perpindahan basis data menjadi kerumitan besar dan rawan kesalahan.
Koa: Memanfaatkan Fitur JavaScript Generasi Selanjutnya
Koa dikembangkan oleh tim di belakang Express, dan tujuannya adalah untuk meminimalkan Express minimalis dengan tidak menggabungkan middleware apa pun di dalam intinya. Selain tanpa middleware, Koa terlihat sangat mirip dengan Express, ringan dan tidak memiliki opini. Namun, apa yang membuat Koa benar-benar menonjol adalah caranya menghilangkan panggilan balik sepenuhnya dengan menggunakan fitur ES6 Generator.
Aliran Kontrol yang Elegan
Javascript adalah bahasa pemrograman asinkron, dan dengan naluri bahasa itu sendiri dan mekanisme tunggal yang digerakkan oleh peristiwa dari Node.js, panggilan balik ada di mana-mana, oleh karena itu panggilan balik yang terkenal buruk.
Salah satu cara untuk meratakan sarang panggilan balik adalah dengan menggunakan Async.js. Async.js menyediakan teknik untuk memetakan, memparalelkan, membuat serial, atau mengulangi beberapa fungsi tanpa harus menyematkan satu ke yang lain dan kemudian melewati aliran kontrol dengan fungsi panggilan balik, satu panggilan balik dan satu fungsi penanganan kesalahan sudah cukup untuk sebagian besar fungsi yang dikelompokkan bersama dengan metode Async.js. Namun Async.js tidak dapat menghapus seluruh panggilan balik. Saat menulis kode Node.js dengan Async.js, lekukan kode masih cenderung melayang ke kanan, hanya saja tidak terlalu dalam.
Cara lain yang lebih bersih adalah dengan menggunakan Promises yang bisa digunakan saat itu. Beberapa perpustakaan Promise pihak ketiga dengan reputasi adalah bluebird dan q. Dalam JavaScript edisi terbaru, ES6, Promise telah diambil sebagai standarisasi. Singkat cerita, Promise menjamin bahwa fungsi dijalankan dan dikembalikan secara berurutan dengan menghubungkan blok/fungsi implementasi dengan sekumpulan fungsi Promise “then”. Anda dapat "menyelesaikan" di akhir setiap blok/fungsi implementasi sehingga fungsi "kemudian" berikutnya dijalankan, atau Anda "menolak" implementasi berikut sehingga aliran kontrol langsung menuju penanganan kesalahan. Dengan cara ini, Anda menggabungkan semua fungsi penanganan kesalahan ke satu tempat dan menyingkirkan panggilan balik secara menyeluruh.

Sekarang ES6 menghadirkan pengubah permainan ke meja — ES6 Generator. Gagasan ini baru untuk JavaScript, tetapi sama sekali tidak baru di dunia pemrograman. Generator ES6 seperti interupsi di C, alih-alih menjalankan baris kode dari atas ke bawah, Generator ES6 memperkenalkan cara untuk menjalankan->menghentikan dan menjalankan sesuatu yang lain->kembali untuk menyelesaikan apa yang tersisa.
Koa menggunakan Generator ES6 untuk menyediakan cara yang elegan untuk mengatasi pemrograman asinkron JavaScript, sehingga Anda tidak dapat melihat panggilan balik dalam aplikasi Koa murni. Salah satu kasus penggunaan khas ES6 Generator di Koa adalah middleware cascading, yang memungkinkan middleware yang disesuaikan untuk mengeksekusi satu demi satu tanpa panggilan balik yang buruk.
var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);
Kami tidak dapat langsung mengambil kesimpulan yang menyatakan bahwa teknik mutakhir ini lebih unggul daripada solusi jadul seperti Async.js, Promise, atau emitor acara, tetapi satu hal yang pasti bahwa konsep baru ini membutuhkan waktu untuk membiasakan diri. Dengan urutan aliran kontrol yang tidak konvensional, ini bisa membawa kesulitan ekstra untuk debugging kode.
Meteor: Kerangka Kerja Untuk Web, Seluler, dan Desktop
Meteor adalah kerangka kerja JavaScript lengkap. Berbeda dari filosofi penyederhanaan Express dan Koa, ia melangkah ke ekstrem yang lain dengan mendefinisikan dirinya sebagai kerangka kerja tumpukan penuh, paket lengkap yang mencakup aplikasi server, seluler, desktop, dan web.
Paket satu-untuk-semua
Jika Anda melihat lebih dekat di bawah tenda, Anda akan melihat bahwa Meteor adalah benar-benar Node.js+Blaze/AngularJS/React+Cordova+MongoDB. Node.js dan MongoDB masing-masing bertanggung jawab atas logika bisnis sisi server dan penyimpanan data. Salah satu Blaze, AngularJS, atau React menangani UI front-end. Dan Cordova, sebagai solusi HTML paling terkenal untuk aplikasi hybrid seluler, menjembatani halaman web dengan tampilan seluler.
Sinkronisasi Data
Proses utama untuk backend dan front-end untuk berbagi data adalah sebagai berikut:
- Klien meminta data atau tampilan HTML tertentu
- Server mengambil data dari database, mencampur data dengan tampilan HTML menggunakan beberapa mesin templating dan mengirimkannya kembali ke front-end
- Klien merender dan menampilkan data/tampilan dengan cara yang mudah digunakan
Aplikasi web satu halaman modern sedikit mengubah proses di atas. Ambil AngularJS sebagai contoh, ini menempatkan template HTML sebagai file statis bersama dengan aset lain seperti file JavaScript front-end, stylesheet, dan gambar. AngularJS kemudian mengisi data ke dalam template HTML dengan meminta data dari back-end menggunakan Ajax RESTful API. Either way, pengembang back-end bertanggung jawab penuh untuk menangani permintaan perubahan data dari front-end dan menyimpan perubahan dalam database.
Salah satu fitur yang membedakan Meteor dengan framework lainnya adalah mekanisme sinkronisasi data antara server dan aplikasi front-end/mobile. Di Meteor, klien memegang salinan bayangan database mini yang merupakan bagian kecil dari replikasi dari database server, bagian yang sebelumnya diminta oleh klien dan disahkan oleh server. Ketika klien ingin membuat perubahan apa pun pada data, ia menggunakan API basis data yang konsisten sebagai sisi server untuk melakukan instruksi CRUD, dan kemudian perubahan data akan secara otomatis dikirim ke server dan disimpan dalam basis data yang sebenarnya. Setiap kali server mendeteksi modifikasi data apa pun, server akan mendorong data yang diperbarui ke klien tertentu yang berlangganan data tersebut. Sinkronisasi data dua arah ini dilakukan secara otomatis tanpa intervensi manual. Untuk menciptakan keajaiban ini, Meteor menggunakan WebSocket untuk menghubungkan klien dan server di bawah tenda sehingga setiap perubahan data di satu ujung akan tercermin ke ujung lainnya secara instan.
Bangun Alat Otomatisasi
Meteor tidak hanya menangani aplikasi server dan aplikasi web, menggunakan alat build Meteor bernama Isobuild dengan bantuan Cordova, perpustakaan yang menggabungkan HTML/JavaScript/CSS dengan fungsionalitas seluler asli, Meteor membuat pembuatan aplikasi iOS dan Android menjadi mudah. Aplikasi seluler yang dihasilkan adalah aplikasi hibrida yang menjalankan JavaScript atau menampilkan halaman HTML di dalam WebView. Solusi ini dapat membahayakan beberapa pengalaman pengguna jika dibandingkan dengan aplikasi seluler asli, tetapi bagi banyak orang yang dapat mengelola semuanya di bawah basis kode yang sama dengan aplikasi web adalah nilai jual yang cukup besar, dan menghemat banyak biaya pengembangan.
Secara keseluruhan, Meteor adalah kerangka kerja yang sangat otomatis. Otomatisasi tingkat tinggi ini membuat hidup pengembang jauh lebih mudah, namun disertai dengan biaya yang membahayakan kinerja dan batasan skalabilitas. Seiring bertambahnya basis pengguna, teknik sinkronisasi data otomatis menjadi chokepoint penskalaan. Untuk mencapai kapasitas dan kinerja yang sama dengan teknologi backend lainnya, Meteor biasanya menggunakan lebih banyak perangkat keras server dan sumber daya bandwidth. Jadi Meteor bisa menjadi titik awal yang bagus dan kotak peralatan yang sempurna jika seseorang ingin membuat prototipe proyek untuk semua platform utama, tetapi pada akhirnya di beberapa titik arsitektur sistem harus didesain ulang dengan cara yang lebih profesional jika prototipe menjadi proyek produksi dengan cukup basis klien.
Sails.js: Kerangka MVC Unggul untuk Node.js
Sails.js memiliki banyak kesamaan dengan Express. Ini adalah generator proyek, middleware, dan mesin templating. Itu sebenarnya dibangun di atas Express ditambah beberapa fungsionalitas tingkat yang lebih tinggi untuk mempercepat pengembangan.
MVC
Sails.js mengadopsi pola desain Model-View-Controller dari intinya. Bagi mereka yang berasal dari Ruby on Rails atau Laravel, mereka akan menemukan struktur untuk aplikasi Sails.js terlalu familiar. Model mewakili model data yang mencerminkan tabel database/skema koleksi, View adalah tampilan HTML dengan data yang terisi, Controller adalah tempat Anda memasukkan semua logika bisnis sisi server dan bertindak sebagai perekat antara data dan tampilan.
Komunikasi Waktu Nyata
Tidak seperti permintaan HTTP di mana klien harus meminta data server setiap saat, atau koneksi polling panjang yang menempatkan server dalam mode idling, Socket.io membuat komunikasi berbasis peristiwa dua arah antara klien dan server. Sails.js mengintegrasikan Socket.io dan membungkusnya dengan beberapa API tingkat abstraksi yang lebih tinggi untuk memberikan kenyamanan lebih, sehingga membuat Sails.js sangat cocok untuk membuat aplikasi obrolan atau game multipemain.
Database ORM
Antara logika backend dan manipulasi database yang sebenarnya, ada lapisan ORM tengah yang disebut Waterline. Sederhananya, alat ORM ini menyediakan sintaks yang konsisten untuk mengakses database yang berbeda tanpa pengembang harus khawatir tentang bahasa query database yang bervariasi, seperti SQL vs NoSQL, skema vs skema-kurang dan sebagainya.
Sails.js memiliki tingkat otomatisasi menengah. Ini berfokus pada logika sisi server dan siap produksi, dan menyediakan kecepatan pengembangan yang lebih cepat daripada Express tanpa mengorbankan kinerja atau skalabilitas apa pun di masa mendatang. Khususnya untuk sejumlah besar penggemar pola MVC, Sails.js memiliki kurva belajar yang cukup mulus.
Bungkus
Artikel ini tidak memberi peringkat pada kerangka kerja Node.js yang berbeda, melainkan mencantumkan titik terang dari setiap kerangka kerja agar menonjol dari yang lain untuk membantu pengembang Node.js mengambil kotak alat yang paling cocok saat membangun proyek dari bawah ke atas.
Jadi mana kerangka kerja Node.js favorit Anda untuk pengembangan web? Apakah Anda lebih suka beberapa kerangka kerja selain yang kita bahas di atas? Beri tahu kami di bagian komentar di bawah.
- Mengapa Saya Menggunakan Node.js? Tutorial Kasus per Kasus
- Pengkodean Demam Kabin: Tutorial Back-end Node.js
- Membangun API REST Node.js/TypeScript, Bagian 1: Express.js