Tutorial Node.js: Memulai Node.js

Node.js, lingkungan runtime JavaScript lintas platform untuk server dan aplikasi, menawarkan banyak manfaat. Penggunaan memori yang rendah, kinerja yang baik, dan ekosistem paket yang besar, yang saat ini berjumlah sekitar 475.000, telah menjadikan Node.js pilihan populer untuk membangun server web, REST API, aplikasi jaringan waktu nyata (misalnya obrolan, permainan), dan bahkan aplikasi desktop lintas platform.

Jika Anda belum memulai dengan Node.js, mungkin inilah saatnya. Lihat penjelas Node.js saya untuk mempelajari cara kerja sihir Node.js. Dalam artikel ini, kita akan melangkah melalui penginstalan Node.js dan pengelola paket NPM, menjalankan server web sederhana, dan menggunakan modul klaster Node.js untuk memanfaatkan beberapa inti CPU.

Kami juga akan melihat cara menginstal modul Node.js tambahan dan paket JavaScript lainnya menggunakan manajer paket NPM. Dan kita akan mencoba menggunakan kerangka kerja Node.js, dalam hal ini Koa, untuk membuat server Node.js yang lebih kaya fitur dan fleksibel.  

Mari kita mulai.

Cara memasang Node.js dan NPM

Mulailah dengan menjelajahi //nodejs.org:

Yayasan Node.js

Klik pada tombol untuk mengunduh LTS (dukungan jangka panjang), kecuali jika Anda mengetahui bahwa Anda memerlukan beberapa fitur baru di rilis saat ini. Persisnya tampilan penginstal yang diunduh dapat bervariasi di antara sistem operasi, tetapi di Mac terlihat seperti ini di awal:

Setelah penginstalan selesai, akan terlihat seperti ini:

Sekarang Anda harus memastikan bahwa Node.js dan NPM diinstal dengan benar. Buka shell baris perintah (Terminal di Mac; Prompt Perintah di Windows) dan periksa versi yang diinstal dari keduanya:

$ node —version

v6.11.3

$ npm —versi

3.10.10

Jika Anda mendapatkan kesalahan yang menyatakan bahwa Node.js atau NPM tidak ditemukan, coba mulai ulang aplikasi shell Anda atau reboot komputer Anda. Jika tidak berhasil, Anda mungkin harus mengedit $ PATH (Mac dan Linux) atau PATH (Windows) dan memulai ulang lagi.

Baik Node.js dan NPM cocok dengan versi yang dimaksudkan di tangkapan layar Terminal di atas, jadi saya siap untuk melanjutkan dan benar-benar mengembangkan sesuatu dengan Node.js. Mari kita mulai dengan sesuatu yang mudah dibuat dengan Node murni.

Anda memerlukan editor kode atau IDE, lebih disukai yang mendukung JavaScript dan Node.js seperti Sublime Text, Visual Studio Code, Brackets, Atom, atau WebStorm.

Contoh Node.js: Server web sederhana

Untuk memulai dengan sangat sederhana, mari kita curi contoh sederhana dari situs Node.js. Salin kode dan tempelkan ke editor kode Anda (saya menggunakan Visual Studio Code, tetapi editor apa pun yang menyimpan teks biasa sudah cukup), lalu simpan sebagai example.js.

const http = membutuhkan ('http');

const hostname = '127.0.0.1';

port const = 3000;

const server = http.createServer ((req, res) => {

   res.statusCode = 200;

   res.setHeader ('Content-Type', 'text / plain');

   res.end ('Halo Dunia \ n');

});

server.listen (port, nama host, () => {

   console.log (`Server berjalan di // $ {hostname}: $ {port} /`);

});

Buka shell di direktori tempat Anda menyimpan file, dan jalankan file dari baris perintah Anda:

$ node example.js

Server berjalan di //127.0.0.1:3000/

Dalam kasus saya, saya menggunakan jendela Terminal dalam Visual Studio Code. Saya hampir bisa dengan mudah beralih ke jendela shell independen.

Sekarang telusuri ke URL yang terdaftar oleh server:

Tekan Control-C di Terminal untuk menghentikan server Node.

Sebelum melanjutkan, mari kita pisahkan kodenya.

const http = membutuhkan ('http');

Penggunaan baris 1 require, begitulah cara Anda memuat modul di Node.js. Pernyataan tersebut memuat modul http Node.js, yang memasok createServermetode yang dipanggil di baris 6 hingga 10 dan listenmetode yang dipanggil di baris 12 hingga 14. Operator "panah gemuk" =>di baris 6 dan 12 adalah singkatan untuk membuat fungsi Lambda anonim , yang sering digunakan di aplikasi Node.js.

const server = http.createServer ((req, res) => {

  res.statusCode = 200;

  res.setHeader ('Content-Type', 'text / plain');

  res.end ('Halo Dunia \ n');

});

The resargumen untuk createServer()sejalan 6 digunakan untuk membangun respon; yang reqargumen berisi permintaan HTTP masuk, yang diabaikan dalam kode ini. The res.endMetode menetapkan data menanggapi 'Hello World \ n' dan memberitahu server bahwa itu semua dilakukan menciptakan respon.

server.listen (port, nama host, () => {

  console.log (`Server berjalan di // $ {hostname}: $ {port} /`);

});

Penutupan server yang dihasilkan oleh server.listen()metode memberi tahu server untuk mendengarkan permintaan pada host yang ditentukan (127.0.0.1, misalnya localhost) dan port (3000). Penutupan yang dihasilkan oleh createServer()metode menangani permintaan saat mereka masuk ke host dan port yang ditentukan.

Gagasan bahwa penutupan JavaScript didefinisikan sebagai pengendali kejadian adalah salah satu bagian Node.js yang paling halus dan kuat, dan merupakan kunci dari arsitektur non-pemblokiran asinkron Node. Node.js menyembunyikan event loop-nya, tetapi selalu kembali ke penanganan event jika tidak terlibat. Selain itu, penutupan JavaScript menggunakan lebih sedikit memori daripada cara alternatif menangani beberapa koneksi klien, seperti pemijahan utas atau proses forking.

Contoh Node.js: Server web multi-proses

Selain hanya mencetak "Hello World", contoh di atas hanya berjalan dalam satu utas, artinya hanya dapat menggunakan satu inti dari komputer host. Ada kalanya Anda akan memiliki banyak core yang ingin Anda curahkan ke server.

Contoh resmi untuk modul cluster Node menunjukkan cara memperbaikinya. Seperti sebelumnya, kami akan mencuri kode dan menjalankannya. Jelajahi dokumentasi cluster Node.js, salin kodenya, tempelkan ke editor kode atau IDE Anda, dan simpan sebagai server.js.

const cluster = membutuhkan ('cluster');

const http = membutuhkan ('http');

const numCPUs = membutuhkan ('os']. cpus (). length;

if (cluster.isMaster) {

console.log (`Master $ {process.pid} sedang berjalan`);

// Pekerja garpu.

untuk (leti = 0; i

cluster.fork ();

}

cluster.on ('exit', (pekerja, kode, sinyal) => {

console.log (`pekerja $ {worker.process.pid} meninggal`);

});

} lain {

// Pekerja dapat berbagi koneksi TCP apa pun

// Dalam hal ini adalah server HTTP

http.createServer ((req, res) => {

res.writeHead (200);

res.end (`halo dunia dari $ {process.pid} \ n`);

}). dengarkan (8000);

console.log (`Pekerja $ {process.pid} mulai`);

}

Saat Anda mengeksekusi node server.jsdari baris perintah, log akan menampilkan ID proses untuk proses master dan pekerja. Jumlah pekerja harus sebanyak komputer Anda memiliki inti logis — delapan untuk MacBook Pro saya dengan prosesor Core i7, yang memiliki empat inti perangkat keras dan hyper-threading.

Jika Anda menelusuri ke localhost: 8000 atau 127.0.0.1:8000, Anda akan melihat “hello world” ditampilkan. Anda dapat menekan Control-C di jendela terminal untuk menghentikan proses server Node.

const cluster = membutuhkan ('cluster');

const http = membutuhkan ('http');

const numCPUs = membutuhkan ('os']. cpus (). length;

Baris 1 dan 2 harus terlihat familiar dari contoh terakhir. Baris 3 sedikit berbeda. Alih-alih hanya membutuhkan osmodul, ia juga memanggil cpus()fungsi anggota dan mengembalikan panjang array yang dikembalikan, yang merupakan jumlah CPU. Array itu sendiri dan ostautan modul kemudian tidak dapat dijangkau, dan mungkin sampah dikumpulkan oleh mesin JavaScript di lain waktu.

if (cluster.isMaster) {

   console.log (`Master $ {process.pid} sedang berjalan`);

   // Pekerja garpu.

   untuk (let i = 0; i <num CPUs; i ++) {

      cluster.fork ();

   }

   cluster.on ('exit', (pekerja, kode, sinyal) => {

      console.log (`pekerja $ {worker.process.pid} meninggal`);

   });

}

Baris 5 memulai blok yang hanya berjalan untuk proses master. Ini mencatat PID-nya, bercabang pada pekerja per CPU yang tersedia, dan membuat penutupan untuk menangani dan mencatat peristiwa keluar cluster.

} lain {

   // Pekerja dapat berbagi koneksi TCP apa pun

   // Dalam hal ini adalah server HTTP

   http.createServer ((req, res) => {

      res.writeHead (200);

      res.end ('halo dunia \ n');

   }). dengarkan (8000);

   console.log (`Pekerja $ {process.pid} mulai`);

Blok yang dimulai pada baris 16 hanya dijalankan oleh proses pekerja. Kode ini seharusnya terlihat familier dari contoh sebelumnya: Ini membuat server web yang menanggapi permintaan apa pun dengan “hello world”.

Jelas dari keluaran yang kita lihat di atas bahwa kode ini berjalan delapan kali pada mesin saya, membuat delapan pekerja server web berbagi koneksi TCP proses induk pada port 8000. Tetapi bagaimana sistem membagi beban di antara mereka?

Dokumentasi mengatakan bahwa modul cluster Node.js menggunakan algoritme round-robin yang dimodifikasi secara default, kecuali di Windows. Algoritma dikendalikan oleh cluster.schedulingPolicyproperti.

Bagaimana kita tahu bahwa ini berhasil? Mari kita uji. Ini hanya perlu mengubah satu baris kode. Edit baris 21 untuk membaca:

      res.end (`halo dunia dari $ {process.pid} \ n`);

Perhatikan bahwa Anda tidak hanya harus menambahkan from ${process.pid}, tetapi Anda juga harus mengubah pembatas dari tanda kutip tunggal menjadi tanda kutip belakang, sehingga JavaScript akan melakukan substitusi variabel pada string.

Simpan file, hentikan instance yang berjalan sebelumnya, dan jalankan lagi. Anda mungkin berpikir bahwa setiap kali Anda menyegarkan klien browser, ID proses yang dikembalikan akan berubah, tetapi Anda salah. Browser terlalu pintar, dan kami belum menandai halaman web sebagai halaman yang kedaluwarsa, jadi browser akan menyimpan respons dalam cache saat pertama kali dijalankan dan terus menampilkan nomor yang sama. Ini akan melakukannya bahkan jika Anda membuat beberapa tab browser atau halaman yang mengarah ke URL yang sama. Namun, Anda dapat melihat bahwa pengiriman round-robin dari master bekerja dengan menjalankan beberapa browser secara bersamaan, dalam hal ini Chrome, Safari, dan Opera:

Jika Anda terbiasa dengan server web lain, Anda mungkin berharap melihat skema permintaan perutean, dan untuk mempertahankan status persisten untuk mempertahankan login setiap pengguna dan lingkungan di Node. Sayangnya, Node tidak memiliki bawaan itu. Jangan takut: Ada banyak kerangka kerja web yang dibangun di atas Node.js yang melakukan semua yang Anda harapkan.

Cara menginstal modul Node.js dengan NPM

Untuk menggunakan sebagian besar modul Node, pada dasarnya Anda hanya menginstal modul dari registri NPM, baik secara global atau dalam direktori proyek, dan kemudian require()dari kode Anda. Seringkali sebuah proyek bergantung pada beberapa modul NPM dan menyimpan daftar itu dalam file project.json-nya. Alih-alih menginstal setiap dependensi dari command line, Anda dapat menginstal semuanya sekaligus, seringkali setelah memeriksa project dari repositori GitHub:

$

$ cd proyek_saya

$ npm instal

Tidak semua paket NPM bekerja seperti itu. Beberapa, termasuk React, memiliki aplikasi "pabrik" untuk membuat aplikasi pemula sebagai salah satu opsi penginstalannya.

$ npm install -g buat-reaksi-aplikasi

$ cd ~ / kerja

$ create-react-app my-app

$ cd aplikasi-saya /

$ npm mulai

Bukan hal yang aneh jika alat dipasang secara global. Misalnya, alat baris perintah Angular Ng menginstal secara global. Anda kemudian menjalankannya secara lokal untuk membuat aplikasi di dalam folder.

$ npm instal -g @ angular / cli

$ cd ~ / kerja

$ ng aplikasi-saya baru

Angular kebetulan memiliki metode instalasi lain yang lebih mirip dengan pola standar. Itu untuk seed Angular QuickStart:

Panduan memulai $ git clone //github.com/angular/quickstart.git

$ cd panduan memulai

$ npm instal

File package.json di folder quickstart memberi tahu npm installuntuk mengambil daftar dependensi yang hampir sama dengan instalasi CLI.

Contoh Node.js: Server web Koa

Meskipun React dan Angular adalah bagian dari ekosistem Node.js, dan membutuhkan Node.js dan NPM untuk pengembangan, keduanya bukan kerangka kerja Node.js — mereka dapat berjalan di browser. Saya membahas lusinan kerangka kerja Node.js yang sebenarnya di "Panduan lengkap untuk kerangka kerja Node.js."

Misalnya, Express adalah server web Node yang telah disempurnakan, menangani aplikasi web, permintaan dan respons HTTP, perutean, dan middleware. Opsi yang lebih baru, Koa, menggunakan generator daripada callback untuk middleware.

Anda menginstal Koa dengan pola standar di dalam folder aplikasi Anda:

$ npm instal koa  

Di bawah ini adalah kode untuk aplikasi Koa “Hello World”, yang dapat Anda simpan dan jalankan seperti pada contoh sebelumnya.

const Koa = membutuhkan ('koa');

aplikasi const = Koa baru ();

// x-waktu-respons

app.use (async (ctx, next) => {

const mulai = Date.now ();

menunggu next ();

const ms = Date.now () -mulai;

ctx.set ('X-Response-Time', `$ {ms} ms`);

});

// logger

app.use (async (ctx, next) => {

const mulai = Date.now ();

menunggu next ();

const ms = Date.now () -mulai;

console.log (`$ {ctx.method} $ {ctx.url} - $ {ms}`);

});

// respon

app.use (async ctx => {

ctx.body = 'Halo Dunia';

});

app.listen (3000);

Ada perbedaan antara generator middleware yang digunakan oleh Koa dan callback seperti yang digunakan oleh Express dan framework Node.js lainnya. Banyak implementasi callback hanya melewati kontrol melalui serangkaian fungsi sampai salah satunya kembali, sementara Koa menghasilkan "downstream", lalu kontrol mengalir kembali "upstream".

Dalam contoh di atas, x-response-time “membungkus” generator respons, dengan  await next() pernyataan yang menandai panggilan tersebut. Penggunaan fungsi asynchronous ini lebih fleksibel daripada pemanggilan fungsi eksplisit, karena memudahkan untuk memasukkan generator lain ke dalam urutan, misalnya web logger antara timer dan respon.

Anda mungkin akan menemukan lebih tua Koa kode yang menggunakan yield nextbukan await next(). Perbedaannya adalah Koa sekarang mendukung ES2015 dan fungsi async. Aliran kontrol berjumlah sama: Aliran berpindah ke penangan berikutnya dalam rantai saat yield nextpanggilan, dan kemudian kembali saat semua penangan selesai.