Apa itu Node.js? Jangka masa JavaScript dijelaskan

Skalabiliti, latensi, dan throughput adalah petunjuk prestasi utama untuk pelayan web. Menjaga latensi rendah dan throughput tinggi semasa menaikkan dan keluar tidak mudah. Node.js adalah persekitaran waktu operasi JavaScript yang mencapai latensi rendah dan throughput tinggi dengan mengambil pendekatan "non-blocking" untuk melayani permintaan. Dengan kata lain, Node.js tidak membuang masa atau sumber ketika menunggu permintaan I / O kembali.

Dalam pendekatan tradisional untuk mewujudkan pelayan web, bagi setiap permintaan yang diterima atau sambungan pelayan spawns baru thread pelaksanaan atau garpu yang baru proses untuk mengendalikan permintaan dan menghantar jawapan. Secara konseptual, ini masuk akal, tetapi dalam praktiknya ia memerlukan banyak perbelanjaan.

Walaupun benang pemijahan memerlukan lebih sedikit memori dan overhead CPU daripada proses forking , ia masih tidak efisien. Kehadiran sebilangan besar utas dapat menyebabkan sistem yang banyak memuat menghabiskan kitaran berharga untuk penjadualan benang dan peralihan konteks, yang menambah latensi dan membatasi had skalabilitas dan throughput.

Node.js mengambil pendekatan yang berbeza. Ia menjalankan gelung peristiwa utas tunggal yang didaftarkan dengan sistem untuk mengendalikan sambungan, dan setiap sambungan baru menyebabkan fungsi panggilan balik JavaScript diaktifkan . Fungsi panggil balik dapat menangani permintaan dengan panggilan I / O yang tidak menyekat, dan jika perlu dapat menelurkan utas dari kumpulan untuk melakukan operasi penyekat atau intensif CPU dan untuk mengimbangi beban di seluruh teras CPU. Pendekatan Node untuk penskalaan dengan fungsi panggilan balik memerlukan memori yang lebih sedikit untuk menangani lebih banyak sambungan daripada kebanyakan seni bina kompetitif yang berskala dengan utas, termasuk Pelayan HTTP Apache, pelbagai pelayan aplikasi Java, IIS dan ASP.NET, dan Ruby on Rails.

Node.js ternyata cukup berguna untuk aplikasi desktop selain pelayan. Perhatikan juga bahawa aplikasi Node tidak terhad pada JavaScript tulen. Anda dapat menggunakan bahasa apa pun yang beralih ke JavaScript, misalnya TypeScript dan CoffeeScript. Node.js menggabungkan enjin JavaScript Google Chrome V8, yang menyokong sintaks ECMAScript 2015 (ES6) tanpa memerlukan transpiler ES6-ke-ES5 seperti Babel.

Sebilangan besar utiliti Node berasal dari pustaka pakejnya yang besar, yang dapat diakses dari npmperintah. NPM, pengurus pakej Node, adalah sebahagian daripada pemasangan Node.js standard, walaupun ia mempunyai laman web sendiri.

Beberapa sejarah JavaScript

Pada tahun 1995 Brendan Eich, yang kemudian menjadi kontraktor Netscape, membuat bahasa JavaScript untuk dijalankan di penyemak imbas Web — dalam 10 hari, seperti yang terjadi. JavaScript pada mulanya bertujuan untuk membolehkan animasi dan manipulasi lain dari model objek dokumen penyemak imbas (DOM). Versi JavaScript untuk Netscape Enterprise Server diperkenalkan tidak lama kemudian.

Nama JavaScript dipilih untuk tujuan pemasaran, karena bahasa Java Sun banyak dikesampingkan pada waktu itu. Sebenarnya, bahasa JavaScript sebenarnya berdasarkan terutamanya pada bahasa Skema dan Diri, dengan semantik seperti Java yang dangkal.

Pada mulanya, banyak pengaturcara menolak JavaScript sebagai tidak berguna untuk "kerja sebenar" kerana jurubahasanya menjalankan urutan besarnya lebih perlahan daripada bahasa yang disusun. Itu berubah ketika beberapa usaha penyelidikan yang bertujuan menjadikan JavaScript lebih cepat mulai membuahkan hasil. Paling menonjol, enjin JavaScript Google Chrome V8 sumber terbuka, yang melakukan penyusunan tepat waktu, inlining, dan pengoptimuman kod dinamik, sebenarnya dapat mengatasi kod C ++ untuk beberapa muatan, dan mengungguli Python untuk kebanyakan kes penggunaan.

Platform Node.js berasaskan JavaScript diperkenalkan pada tahun 2009, oleh Ryan Dahl, untuk Linux dan MacOS, sebagai alternatif yang lebih berskala untuk Pelayan HTTP Apache. NPM, yang ditulis oleh Isaac Schlueter, dilancarkan pada tahun 2010. Node.js versi Windows asli memulakan debutnya pada tahun 2011.

Joyent memiliki, memerintah, dan menyokong usaha pembangunan Node.js selama bertahun-tahun. Pada tahun 2015, projek Node.js diserahkan kepada Yayasan Node.js, dan ditadbir oleh jawatankuasa pemandu teknikal yayasan. Node.js juga diterima sebagai Projek Kolaborasi Yayasan Linux. Pada tahun 2019, Yayasan Node.js dan Yayasan JS bergabung untuk membentuk Yayasan OpenJS.

Senibina Node.js asas

Pada tahap tinggi, Node.js menggabungkan enjin JavaScript Google V8, gelung acara tanpa sekatan utas tunggal, dan API I / O tahap rendah. Contoh kod yang dilucutkan ditunjukkan di bawah menggambarkan corak pelayan HTTP asas, menggunakan fungsi anak panah ES6 (fungsi Lambda tanpa nama yang dinyatakan menggunakan operator anak panah lemak, =>) untuk panggilan balik.

Permulaan kod memuat modul HTTP, menetapkan hostnamepemboleh ubah pelayan ke localhost(127.0.0.1), dan menetapkan portpemboleh ubah ke 3000. Kemudian ia membuat fungsi pelayan dan panggilan balik, dalam hal ini fungsi panah lemak yang selalu mengembalikan yang sama tindak balas kepada apa-apa permintaan: statusCode200 (kejayaan), jenis kandungan teks biasa dan maklum balas teks ”Hello World\n”. Akhirnya, ia memberitahu pelayan untuk mendengar di localhostport 3000 (melalui soket) dan menentukan panggilan balik untuk mencetak mesej log pada konsol ketika pelayan telah mula mendengar. Sekiranya anda menjalankan kod ini di terminal atau konsol menggunakan nodeperintah dan kemudian melayari ke localhost: 3000 menggunakan penyemak imbas Web pada mesin yang sama, anda akan melihat "Hello World" di penyemak imbas anda. Untuk menghentikan pelayan, tekan Control-C di tetingkap terminal.

Perhatikan bahawa setiap panggilan yang dibuat dalam contoh ini tidak segerak dan tidak menyekat. Fungsi panggil balik dipanggil sebagai tindak balas terhadap peristiwa. The createServerpanggil balik mengendalikan acara permintaan pelanggan dan mengembalikan jawapan. The listenpanggil balik mengendalikan listeningacara.

Perpustakaan Node.js

Seperti yang anda lihat di sebelah kiri gambar di bawah, Node.js mempunyai pelbagai fungsi di perpustakaannya. Modul HTTP yang kami gunakan dalam contoh kod sebelumnya mengandungi kelas klien dan pelayan, seperti yang anda lihat di sebelah kanan gambar. Fungsi pelayan HTTPS menggunakan TLS atau SSL tinggal dalam modul yang berasingan.

Satu masalah yang melekat pada gelung peristiwa utas tunggal adalah kekurangan penskalaan menegak, kerana utas gelung peristiwa hanya akan menggunakan satu teras CPU. Sementara itu, cip CPU moden sering memaparkan lapan atau lebih teras, dan rak pelayan moden sering mempunyai banyak cip CPU. Aplikasi single-threaded tidak akan memanfaatkan sepenuhnya core 24-plus di rak pelayan yang kuat.

Anda boleh memperbaikinya, walaupun memerlukan beberapa pengaturcaraan tambahan. Sebagai permulaan, Node.js dapat menelurkan proses anak dan menjaga hubungan antara ibu bapa dan anak-anak, sama dengan cara popen(3)panggilan sistem berfungsi, menggunakan child_process.spawn() dan kaedah yang berkaitan.

Modul kluster lebih menarik daripada modul proses kanak-kanak untuk membuat pelayan berskala. The cluster.fork()proses kaedah spawns pekerja yang berkongsi pelabuhan pelayan dengan ibubapa, menggunakan child_process.spawn()di bawah penutup. Master cluster mengedarkan sambungan masuk di kalangan pekerjanya menggunakan, secara lalai, algoritma round-robin yang peka terhadap beban proses pekerja.

Perhatikan bahawa Node.js tidak memberikan logik penghalaan. Sekiranya anda ingin mengekalkan keadaan merentasi sambungan dalam kluster, anda perlu menyimpan sesi dan objek log masuk di tempat selain RAM pekerja.

Ekosistem pakej Node.js

Pendaftaran NPM mempunyai lebih daripada 1.2 juta pakej kod Node.js percuma yang boleh digunakan semula, yang menjadikannya pendaftaran perisian terbesar di dunia. Perhatikan bahawa kebanyakan pakej NPM (pada dasarnya folder atau item pendaftaran NPM yang mengandungi program yang dijelaskan oleh fail package.json) mengandungi beberapa modul (program yang anda muatkan dengan requirepernyataan). Sangat mudah untuk mengelirukan kedua-dua istilah, tetapi dalam konteks ini mereka mempunyai makna yang spesifik dan tidak boleh ditukar ganti.

NPM dapat menguruskan pakej yang merupakan pergantungan tempatan dari projek tertentu, serta alat JavaScript yang dipasang secara global. Apabila digunakan sebagai pengurus ketergantungan untuk projek tempatan, NPM dapat memasang, dalam satu perintah, semua kebergantungan sebuah proyek melalui file package.json. Apabila digunakan untuk pemasangan global, NPM sering memerlukan hak sistem (sudo).

Anda tidak perlu menggunakan baris perintah NPM untuk mengakses pendaftaran NPM awam. Pengurus pakej lain seperti Facebook's Yarn menawarkan pengalaman pelanggan yang alternatif. Anda juga boleh mencari dan mencari pakej menggunakan laman web NPM.

Mengapa anda mahu menggunakan pakej NPM? Dalam banyak kes, memasang pakej melalui baris perintah NPM adalah yang terpantas dan paling mudah untuk mendapatkan versi stabil modul yang berjalan di persekitaran anda, dan biasanya kurang berfungsi daripada mengklon repositori sumber dan membuat pemasangan dari repositori. Sekiranya anda tidak menginginkan versi terbaru, anda dapat menentukan nombor versi ke NPM, yang sangat berguna apabila satu paket bergantung pada pakej lain dan mungkin pecah dengan versi kebergantungan yang lebih baru.

Sebagai contoh, kerangka Express, kerangka aplikasi web Node.js yang minimum dan fleksibel, menyediakan sekumpulan ciri yang kuat untuk membina aplikasi web tunggal dan berbilang halaman, dan hibrid. Walaupun repositori Expresscode yang mudah diklon berada di //github.com/expressjs/express dan dokumentasi Express ada di //expressjs.com/, cara cepat untuk mula menggunakan Express adalah memasangnya ke dalam pembangunan kerja tempatan yang sudah diinisialisasi direktori dengan npmarahan, contohnya:

$ npm pasang ekspres - simpan

Yang —savepilihan, yang sebenarnya secara lalai di dalam NPM 5.0 dan kemudian, memberitahu pengurus pakej untuk menambah modul Express ke senarai kebergantungan dalam fail package.json selepas pemasangan.

Cara cepat lain untuk mula menggunakan Express adalah dengan memasang generator yang boleh dilaksanakan express(1) secara global dan kemudian menggunakannya untuk membuat aplikasi secara tempatan dalam folder kerja baru:

$ npm install -g express-generator @ 4

$ ekspres / tmp / foo && cd / tmp / foo

Dengan itu, anda boleh menggunakan NPM untuk memasang semua kebergantungan yang diperlukan dan memulakan pelayan, berdasarkan kandungan fail package.json yang dibuat oleh penjana:

pemasangan $ npm

permulaan $ npm

Sukar untuk memilih sorotan daripada pakej berjuta-juta di NPM, tetapi beberapa kategori menonjol. Express adalah contoh kerangka Node.js yang tertua dan paling menonjol. Kategori besar lain di repositori NPM adalah utiliti pengembangan JavaScript, termasuk browserify, bundler modul; bower, pengurus pakej penyemak imbas; menggerutu, pelari tugas JavaScript; dan tegukan, sistem membina aliran. Akhirnya, kategori penting bagi pembangun perusahaan Node.js adalah pelanggan pangkalan data, di mana terdapat lebih daripada 8.000, termasuk modul popular seperti redis, mongoose, firebase, dan pg, pelanggan PostgreSQL.

Ringkasnya, Node.js adalah persekitaran runtime JavaScript lintas platform untuk pelayan dan aplikasi. Ia dibina di atas gelung acara tanpa utas tunggal, mesin JavaScript Google Chrome V8, dan I / O API tahap rendah. Pelbagai teknik, termasuk modul kluster, membolehkan aplikasi Node.js melampaui satu teras CPU. Di luar fungsi utamanya, Node.js telah mengilhami ekosistem lebih dari satu juta pakej yang didaftarkan dan diterbitkan dalam repositori NPM dan boleh dipasang menggunakan baris perintah NPM atau alternatif seperti Benang.