Apa itu Node.js? Runtime JavaScript menjelaskan

Skalabilitas, latensi, dan throughput adalah indikator kinerja utama untuk server web. Menjaga latensi tetap rendah dan throughput tetap tinggi saat melakukan penskalaan dan pengeluaran tidaklah mudah. Node.js adalah lingkungan waktu proses JavaScript yang mencapai latensi rendah dan throughput tinggi dengan mengambil pendekatan "non-pemblokiran" untuk melayani permintaan. Dengan kata lain, Node.js tidak membuang waktu atau sumber daya untuk menunggu permintaan I / O kembali.

Dalam pendekatan tradisional untuk menciptakan server web, untuk setiap permintaan yang masuk atau koneksi server menumbuhkan baru thread eksekusi atau bahkan garpu baru proses untuk menangani permintaan dan mengirim respon. Secara konseptual, ini masuk akal, tetapi dalam praktiknya itu menimbulkan banyak overhead.

Meskipun utas pemijahan memerlukan lebih sedikit memori dan overhead CPU daripada proses forking , ini masih bisa menjadi tidak efisien. Kehadiran sejumlah besar utas dapat menyebabkan sistem yang penuh muatan menghabiskan siklus berharga pada penjadwalan utas dan peralihan konteks, yang menambah latensi dan membatasi skalabilitas dan throughput.

Node.js menggunakan pendekatan berbeda. Ini menjalankan loop peristiwa single-threaded yang terdaftar pada sistem untuk menangani koneksi, dan setiap koneksi baru menyebabkan fungsi callback JavaScript diaktifkan. Fungsi callback dapat menangani permintaan dengan panggilan I / O non-pemblokiran, dan jika perlu dapat menelurkan thread dari kumpulan untuk menjalankan operasi pemblokiran atau intensif CPU dan untuk menyeimbangkan muatan di seluruh inti CPU. Pendekatan Node untuk penskalaan dengan fungsi panggilan balik memerlukan lebih sedikit memori untuk menangani lebih banyak koneksi daripada kebanyakan arsitektur kompetitif yang diskalakan dengan utas, termasuk Apache HTTP Server, berbagai server aplikasi Java, IIS dan ASP.NET, dan Ruby on Rails.

Node.js ternyata cukup berguna untuk aplikasi desktop selain server. Perhatikan juga bahwa aplikasi Node tidak terbatas pada JavaScript murni. Anda dapat menggunakan bahasa apa pun yang transparan ke JavaScript, misalnya TypeScript dan CoffeeScript. Node.js menggabungkan mesin JavaScript Google Chrome V8, yang mendukung sintaks ECMAScript 2015 (ES6) tanpa memerlukan transpiler ES6-ke-ES5 seperti Babel.

Sebagian besar utilitas Node berasal dari pustaka paketnya yang besar, yang dapat diakses dari npmperintah. NPM, manajer paket Node, adalah bagian dari instalasi Node.js standar, meskipun ia memiliki situs webnya sendiri.

Beberapa riwayat JavaScript

Pada tahun 1995 Brendan Eich, yang saat itu menjadi kontraktor Netscape, menciptakan bahasa JavaScript untuk dijalankan di browser Web — dalam 10 hari, seiring berjalannya cerita. JavaScript awalnya dimaksudkan untuk mengaktifkan animasi dan manipulasi lain dari model objek dokumen browser (DOM). Versi JavaScript untuk Netscape Enterprise Server diperkenalkan tak lama kemudian.

Nama JavaScript dipilih untuk tujuan pemasaran, karena bahasa Java Sun sangat populer pada saat itu. Faktanya, bahasa JavaScript sebenarnya didasarkan terutama pada bahasa Skema dan Diri, dengan semantik mirip Java yang dangkal.

Awalnya, banyak pemrogram menolak JavaScript sebagai tidak berguna untuk "pekerjaan nyata" karena penerjemahnya menjalankan urutan besarnya lebih lambat daripada bahasa yang dikompilasi. Itu berubah karena beberapa upaya penelitian yang bertujuan untuk membuat JavaScript lebih cepat mulai membuahkan hasil. Yang paling menonjol, mesin JavaScript Google Chrome V8 open-source, yang melakukan kompilasi tepat waktu, penyebarisan, dan pengoptimalan kode dinamis, sebenarnya dapat mengungguli kode C ++ untuk beberapa pemuatan, dan mengungguli Python untuk sebagian besar kasus penggunaan.

Platform Node.js berbasis JavaScript diperkenalkan pada tahun 2009, oleh Ryan Dahl, untuk Linux dan MacOS, sebagai alternatif yang lebih skalabel untuk Apache HTTP Server. NPM, ditulis oleh Isaac Schlueter, diluncurkan pada tahun 2010. Versi Windows asli Node.js memulai debutnya pada tahun 2011.

Joyent memiliki, mengatur, dan mendukung upaya pengembangan Node.js selama bertahun-tahun. Pada 2015, proyek Node.js diserahkan kepada Node.js Foundation, dan diatur oleh komite pengarah teknis yayasan. Node.js juga dirangkul sebagai Proyek Kolaborasi Linux Foundation. Pada 2019, Node.js Foundation dan JS Foundation bergabung untuk membentuk OpenJS Foundation.

Arsitektur dasar Node.js

Pada tingkat tinggi, Node.js menggabungkan mesin JavaScript Google V8, loop peristiwa non-pemblokiran berutas tunggal, dan API I / O tingkat rendah. Kode contoh stripped-down yang ditunjukkan di bawah ini menggambarkan pola server HTTP dasar, menggunakan fungsi panah ES6 (fungsi Lambda anonim dideklarasikan menggunakan operator panah gemuk, =>) untuk callback.

Awal kode memuat modul HTTP, menetapkan hostnamevariabel server ke localhost(127.0.0.1), dan menetapkan portvariabel ke 3000. Kemudian membuat server dan fungsi panggilan balik, dalam hal ini fungsi panah besar yang selalu mengembalikan sama tanggapan atas permintaan apa pun: statusCode200 (berhasil), jenis konten teks biasa, dan tanggapan teks ”Hello World\n”. Akhirnya, ini memberitahu server untuk mendengarkan pada localhostport 3000 (melalui soket) dan menentukan panggilan balik untuk mencetak pesan log di konsol ketika server telah mulai mendengarkan. Jika Anda menjalankan kode ini di terminal atau konsol menggunakan nodeperintah dan kemudian menjelajah ke localhost: 3000 menggunakan browser Web apa pun di mesin yang sama, Anda akan melihat "Hello World" di browser Anda. Untuk menghentikan server, tekan Control-C di jendela terminal.

Perhatikan bahwa setiap panggilan yang dilakukan dalam contoh ini bersifat asinkron dan non-pemblokiran. Fungsi callback dipanggil sebagai respons terhadap peristiwa. The createServercallback menangani acara permintaan klien dan mengembalikan tanggapan. The listencallback menangani listeningevent.

Perpustakaan Node.js

Seperti yang Anda lihat di sisi kiri gambar di bawah ini, Node.js memiliki berbagai macam fungsionalitas di perpustakaannya. Modul HTTP yang kami gunakan dalam kode contoh sebelumnya berisi kelas klien dan server, seperti yang Anda lihat di sisi kanan gambar. Fungsionalitas server HTTPS yang menggunakan TLS atau SSL berada dalam modul terpisah.

Satu masalah inheren dengan loop peristiwa berutas tunggal adalah kurangnya penskalaan vertikal, karena utas perulangan peristiwa hanya akan menggunakan satu inti CPU. Sementara itu, chip CPU modern sering kali menampilkan delapan atau lebih core, dan rak server modern sering kali memiliki beberapa chip CPU. Aplikasi single-threaded tidak akan memanfaatkan penuh 24-plus core di rak server yang kuat.

Anda dapat memperbaikinya, meskipun itu membutuhkan beberapa pemrograman tambahan. Untuk memulainya, Node.js bisa menelurkan proses anak dan memelihara pipa antara induk dan anak, mirip dengan cara popen(3)kerja panggilan sistem , menggunakan child_process.spawn() dan metode terkait.

Modul cluster bahkan lebih menarik daripada modul proses anak untuk membuat server yang dapat diskalakan. The cluster.fork()proses metode menumbuhkan pekerja yang berbagi port server induk, menggunakan child_process.spawn()bawah selimut. Master kluster mendistribusikan koneksi masuk di antara para pekerjanya menggunakan, secara default, algoritme round-robin yang sensitif terhadap beban proses pekerja.

Perhatikan bahwa Node.js tidak menyediakan logika perutean. Jika Anda ingin mempertahankan status di seluruh koneksi dalam sebuah cluster, Anda harus menyimpan sesi dan objek login di tempat lain selain RAM pekerja.

Ekosistem paket Node.js

Registri NPM menampung lebih dari 1,2 juta paket kode Node.js gratis dan dapat digunakan kembali, yang menjadikannya registri perangkat lunak terbesar di dunia. Perhatikan bahwa sebagian besar paket NPM (pada dasarnya folder atau item registri NPM berisi program yang dijelaskan oleh file package.json) berisi beberapa modul (program yang Anda muat dengan requirepernyataan). Sangat mudah untuk membingungkan kedua istilah tersebut, tetapi dalam konteks ini keduanya memiliki arti khusus dan tidak boleh dipertukarkan.

NPM dapat mengelola paket yang merupakan dependensi lokal dari proyek tertentu, serta alat JavaScript yang diinstal secara global. Ketika digunakan sebagai manajer ketergantungan untuk proyek lokal, NPM dapat menginstal, dalam satu perintah, semua ketergantungan proyek melalui file package.json. Saat digunakan untuk penginstalan global, NPM sering kali memerlukan hak akses sistem (sudo).

Anda tidak harus menggunakan baris perintah NPM untuk mengakses registri NPM publik. Manajer paket lain seperti Facebook's Yarn menawarkan pengalaman sisi klien alternatif. Anda juga dapat mencari dan menelusuri paket menggunakan situs web NPM.

Mengapa Anda ingin menggunakan paket NPM? Dalam banyak kasus, menginstal paket melalui baris perintah NPM adalah yang tercepat dan paling nyaman untuk mendapatkan versi stabil terbaru dari modul yang berjalan di lingkungan Anda, dan biasanya lebih mudah dilakukan daripada menggandakan repositori sumber dan membangun instalasi dari repositori. Jika Anda tidak menginginkan versi terbaru, Anda dapat menentukan nomor versi ke NPM, yang sangat berguna ketika satu paket bergantung pada paket lain dan mungkin putus dengan versi dependensi yang lebih baru.

Misalnya, kerangka kerja Express, kerangka kerja aplikasi web Node.js yang minimal dan fleksibel, menyediakan sekumpulan fitur yang kuat untuk membangun aplikasi web tunggal dan multi-halaman, dan hybrid. Sementara repositori Expresscode yang dapat digandakan dengan mudah berada di //github.com/expressjs/express dan dokumentasi Express ada di //expressjs.com/, cara cepat untuk mulai menggunakan Express adalah dengan menginstalnya ke dalam pengembangan kerja lokal yang sudah diinisialisasi direktori dengan npmperintah, misalnya:

$ npm install express —save

The —savepilihan, yang sebenarnya secara default di NPM 5.0 dan kemudian, memberitahu manajer paket untuk menambahkan modul Express ke daftar dependensi dalam file package.json setelah instalasi.

Cara cepat lain untuk mulai menggunakan Express adalah dengan menginstal generator yang dapat dieksekusi express(1) secara global dan kemudian menggunakannya untuk membuat aplikasi secara lokal di folder kerja baru:

$ npm instal -g express-generator @ 4

$ express / tmp / foo && cd / tmp / foo

Setelah itu tercapai, Anda dapat menggunakan NPM untuk menginstal semua dependensi yang diperlukan dan memulai server, berdasarkan konten file package.json yang dibuat oleh generator:

$ npm instal

$ npm mulai

Sulit untuk memilih sorotan dari paket jutaan-plus di NPM, tetapi beberapa kategori menonjol. Express adalah contoh framework Node.js tertua dan paling menonjol. Kategori besar lainnya dalam repositori NPM adalah utilitas pengembangan JavaScript, termasuk browserify, bundler modul; bower, pengelola paket browser; grunt, pelari tugas JavaScript; dan gulp, sistem build streaming. Terakhir, kategori penting bagi pengembang perusahaan Node.js adalah klien basis data, yang jumlahnya lebih dari 8.000, termasuk modul populer seperti redis, mongoose, firebase, dan pg, klien PostgreSQL.

Singkatnya, Node.js adalah lingkungan runtime JavaScript lintas platform untuk server dan aplikasi. Itu dibuat pada loop kejadian non-pemblokiran berutas tunggal, mesin JavaScript Google Chrome V8, dan API I / O tingkat rendah. Berbagai teknik, termasuk modul cluster, memungkinkan aplikasi Node.js menskalakan melebihi satu inti CPU. Di luar fungsionalitas intinya, Node.js telah menginspirasi ekosistem lebih dari satu juta paket yang terdaftar dan diversi di repositori NPM dan dapat diinstal menggunakan baris perintah NPM atau alternatif seperti Yarn.