Mungkin Anda mendapatkan alamat postingan blog ini karena mendengar buzzword “Node.js” atau “NPM” dan penasaran apa maksud istilah-istilah tersebut. Node.js memang sedang banyak dibicarakan akhir-akhir ini sebagai platform software yang baru dan sedang berkembang.
Javascript
Node.js sebenarnya Node.js merupakan runtime, atau sederhananya intepreter Javascript. Javascript yang dulunya berjalan di dalam browser sekarang bisa dijalankan di luar browser dengan menggunakan Node.js. Jadi Node.js itu bukan bahasa pemrograman baru, melainkan adalah runtime untuk Javascript yang berjalan di luar browser.
Ketika dulu Javascript digunakan hanya untuk memberi animasi di halaman web, kemudian berkembang digunakan untuk melakukan AJAX call, sekarang Javascript bahkan bisa digunakan sebagai bahasa pemrograman untuk apapun, termasuk untuk pemrograman backend website. Nah itulah yang bikin Node.js populer. Dengan adanya Node.js, sekarang programmer dapat melakukan pemrograman frontend maupun backend dengan bahasa yang sama, yaitu Javascript. Bahkan sekarang Javascript juga dapat digunakan dalam pemrograman mobile apps [Android dan iOS] dengan menggunakan React Native, Native Script, dan lain-lain. Kayaknya cuma Javascript yang bisa gitu, karena Javascript adalah satu-satunya bahasa yang jalan di browser secara native wkw.
Menurut survey dari StackOverflow [yang biasa dibuka programmer setiap hari], Javascript pada tahun 2016 merupakan teknologi yang paling populer //insights.stackoverflow.com/survey/2016#technology-most-popular-technologies. Tapi populer di sini bukan berarti paling bagus, bisa aja populer di StackOverflow karena orang pada gak paham sama Javascript, jadi banyak Q&A di sana.
Non blocking I/O dan Async
Node.js menggunakan Javascript engine V8 dari Google, seperti yang terdapat di browser Google Chrome. Javascript engine itu sederhananya adalah intepreter Javascript, yang tugasnya baca kode Javascript. Dan yang menarik adalah satu process Node.js secara alami hanya berjalan di satu thread. Jadi misalnya Anda punya server dengan 8 CPU [8 thread], lalu Anda menjalankan kode Javascript dengan satu process Node.js, maka CPU yang terpakai hanya 1, sementara yang 7 nganggur. Akan tetapi hal ini dapat diatasi, salah satunya dengan menggunakan package seperti pm2 atau menjalankannya dengan docker dengan beberapa container.
Sifat alami lain dari Javascript adalah non blocking I/O dan async. Misalnya kita punya kode untuk baca file atau untuk call API di bahasa PHP seperti ini:
$books = callApi["//api.example.com/v1/books"] displayBooks[$books]; $reviews = readFile["reviews.json"]
displayReviews[$reviews]; echo "the page is loaded";
Kode tersebut merupakan synchronous, yang berarti benar-benar dieksekusi berurutan dari atas ke bawah. Jadi pertama kodenya akan memanggil API, menunggu proses pemanggilan API selesai [mungkin bisa lama, tergantung server dan besarnya ukuran data], lalu menampilkan hasilnya. Kemudian dilanjutkan dengan proses membaca file reviews.json, menunggu proses membaca file selesai [bisa jadi lama kalau ukurannya besar], lalu menampilkan hasilnya. Lalu baru mencetak tulisan “the page is loaded”.
Proses baca file maupun call API itu biasanya adalah proses yang butuh waktu agak lama. Dan ketika memanggil API I/O terblok, tidak bisa menjalankan sesuatu yang lain, bisa dibilang itu adalah blocking I/O. Sementara bisa dilihat kode Javascript yang ekuivalen dengan kode PHP tadi:
callApi["//api.example.com/v1/books"]
.then[[data] => {
displayBooks[data];
}];readFile["reviews.json"]
.then[[data] => {
displayReviews[data];
}];console.log["the page is loaded"];
Pada kode Javascript tersebut, kode dijalankan secara asynchronous, tidak selalu dari atas ke bawah. Jadi urutannya adalah seperti ini. Pertama-tama kode akan memanggil API, kemudian menempelkan callback yang akan dipanggil ketika proses pemanggilan API selesai, yaitu menampilkan data books. Tanpa menunggu proses pemanggilan API selesai, langsung dilakukan proses pembacaan file “reviews.json” dan menempelkan callback juga ketika pembacaan file selesai, yaitu menampilkan data reviews. Kemudian tanpa menunggu pemanggilan API dan pembacaan file selesai, akan dicetak tulisan “the page is loaded”. Apabila proses pemanggilan API selesai, maka callbacknya akan dipanggil beserta data yang didapat dari API. Begitu juga dengan proses pembacaan file.
Kode asynchronous tersebut merupakan kode yang non blocking I/O karena ketika I/O atau resource tidak terblok pada saat pemanggilan API dan pembacaan file. Kode di bawahnya dapat dieksekusi tanpa menunggu kode di atasnya selesai dijalankan. Javascript dapat melakukan ini dengan mekanisme Event Loop. Tapi di postingan ini tidak akan dijelaskan tentang Event Loop karena cukup kompleks, kalau ada request untuk menjelaskan, nanti coba saya jelaskan di postingan lain. Sifat non blocking I/O ini merupakan keunggulan, akan tetapi akan sangat membingungkan untuk yang belum terbiasa.
Performa
Saya sebenarnya ingin menambahkan mengenai perbandingan performa Javascript di atas Node.js dibandingkan dengan bahasa lain. Akan tetapi hasil benchmark itu sangat beragam tergantung bagaimana benchmark dilakukan dan seringkali hasil benchmark tidak mencerminkan performa sesungguhnya ketika digunakan pada sistem yang kompleks. Apabila Anda ingin melihat benchmark performa, silakan bisa dicoba untuk dicari di Google. Banyak yang bilang Javascript dengan Node.js memiliki performa yang cukup superior dibandingkan bahasa-bahasa lain.
Penggunaan Javascript
Berikut merupakan beberapa implementasi Javascript dalam berbagai platform, saya sebutkan yang cukup populer dan saya tahu, haha.
Javascript imperative frontend:
- jQuery dan anak-anaknya
Javascript declarative frontend:
- React
- Vue
- Angular
- Ember
Perbedaan imperative dan declarative mungkin bisa dibaca di sini //codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2.
Backend:
- Express
- Sails
- Meteor
- Adonis [mirip Laravel]
Mobile Apps
- React Native
- NativeScript
- Xamarin [hybrid]
- Ionic [hybrid]
- PhoneGap/Cordova [hybrid]
Cara install Node.js
Untuk menginstall Node.js, saya menyarankan untuk menggunakan NVM [Node Version Manager] agar dapat berganti-ganti versi Node dengan mudah. Di sini sebagai contoh, saya menggunakan Ubuntu. Pertama-tama silakan dilihat dulu versi NVM berapa yang terbaru di sini //github.com/creationix/nvm/releases. Misalnya waktu saya menulis ini, yang terbaru adalah v0.33.6, maka untuk menginstall:
curl //raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
Nanti jika sukses, akan keluar kata-kata seperti ini:
Close and reopen your terminal to start using nvm
Setelah itu, silakan lakukan sesuai tulisan itu [tutup terminal, lalu buka lagi], atau kalau malas bisa pakai command ini:
source ~/.profile
Untuk mengecek bahwa NVM sudah terinstall dengan benar, silakan ketik:
nvm --version
Akan keluar:
0.33.6
Setelah itu kita cek versi Node.js berapa saja yang ada di NVM dengan command:
nvm ls-remote
Lalu akan keluar daftar versi Node.js yang sangat panjang. Misalnya saya install versi Node.js terbaru waktu saya menulis ini, yaitu v8.8.1.
nvm install v8.8.1
Tinggal ganti versi Node.js nya saja jika ingin menginstall versi yang lain. Lalu apabila mau mengecek versi Node.js berapa saja yang terinstall di komputer, bisa dengan command:
nvm ls
Dan apabila ingin berpindah ke versi Node.js yang lain, contohnya v8.5.0:
nvm use v8.5.0
Sekian artikel ini, jika ada saran, masukan, kritik, atau pertanyaan silakan tulis di kolom komentar di bawah. Terima kasih.