NodeJS: mulai cepat



Halo semuanya! Segera, kursus Pengembang Node.js akan dimulai , sehubungan dengan yang kami lakukan pelajaran terbuka tradisional . Webinar memeriksa kekuatan dan kelemahan Node, dan juga membahas tugas apa yang paling sesuai untuk platform perangkat lunak ini dan untuk bahasa dan kerangka kerja apa yang harus dipilih. Dan, tentu saja, bukan tanpa latihan. Untuk menjalankan contoh dan software yang dibutuhkan untuk menginstal Node.js .

Dosen - Alexander Korzhikov , Dev IT Engineer di ING Group (Belanda).






Beberapa kata tentang Node.js


Node.js adalah runtime JavaScript asinkron berdasarkan konsep-konsep seperti Event Loop dan arsitektur berorientasi-peristiwa. Platform Node.js dan manajer paket NPM standar memungkinkan Anda membuat aplikasi yang efektif untuk berbagai bidang subjek - dari Web hingga Machine Learning.

Contoh server web paling sederhana ( node server.js):

const http = require('http')
const hostname = '127.0.0.1'
const port = 3000
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})

Melihat kode di atas, fitur berikut dari Node.js dapat dicatat:

  1. Kita dapat menjalankan kode JavaScript langsung di server, yaitu, dimungkinkan untuk mengeksekusi file JavaScript menggunakan perintah node.
  2. Modul CommonJS-format untuk memuat dependensi dan Modul ES didukung, dan kedua format dapat digunakan.
  3. Pustaka modul standar didukung, di mana HTTP merupakan bagiannya.
  4. API didasarkan pada pola Panggilan Balik asinkron, tetapi Janji juga didukung.
  5. Sintaks ES2015 didukung. Ngomong-ngomong, ini adalah tautan yang berguna yang selalu bisa Anda lihat di versi Node mana yang didukung fitur JS . Jika terjadi kesalahan, Anda dapat membandingkan dan memahami apa masalahnya.

Juga jangan lewatkan demo kecil (VSCode + Chrome Debug).

Sebuah perjalanan singkat ke dalam sejarah


Platform Node.js muncul pada tahun 2009, pengembang utama dan pencipta proyek ini adalah Ryan Dahl. Gagasan utamanya adalah membuat I / O (input-output) non-pemblokiran untuk server, terlebih lagi, menggunakan JavaScript. Pada saat itu, pendekatan seperti itu tidak terlalu umum, dan JavaScript adalah salah satu solusi terbaik.

Node.js menggunakan mesin Chromium di dalam dirinya sendiri, atau lebih tepatnya, bagian itu yang menginterpretasikan JavaScript - V8 . Karena kenyataan bahwa penerjemah pada satu waktu dipisahkan menjadi proyek V8 yang terpisah, menjadi mungkin untuk membuat ekosistem di sekitarnya. Sebenarnya, inilah yang dilakukan pencipta Node.js Ryan Dahl. Ngomong-ngomong, hari ini ada Node.js Foundation, sebuah organisasi yang mendukung proyek tersebut.



Struktur


Pertama, pustaka ditulis dalam C ++ dan JavaScript. Proyek itu sendiri terletak di GitHub , jadi jika Anda penasaran, Anda dapat membaca kode sumbernya. Anda dapat mempelajari studinya untuk waktu yang sangat lama)).

Kedua, seperti yang telah disebutkan, itu termasuk V8 (platform eksekusi JavaScript dari Google) dan libuv sebagai bagian dari Perulangan Peristiwa (perulangan peristiwa tak sinkron).

Yah, tentu saja, ada berbagai modul untuk bekerja dengan sistem operasi yang memungkinkan Anda untuk melakukan tugas-tugas bisnis yang Anda butuhkan.

Penting juga menyebutkan pola desain utama yang umum digunakan di Node.js:

  • Callback (sudah disebutkan);
  • Pengamat (pola acara sederhana);
  • Modul (meskipun sekarang diatur dalam bahasa JavaScript itu sendiri, di Node.js masih relevan);
  • Reactor (pola interaksi asinkron dengan beberapa sumber ketika Anda tidak memblokir aliran utama kode). Pola ini akrab bagi pengembang JS. Misalnya, jika kami bekerja di browser dan menulis frontend, kami tidak memblokir semua pekerjaan browser, tetapi hanya berlangganan acara dari pengguna, dan ketika suatu peristiwa terjadi (setelah "klik", "masukkan", dll.), Kami menjalankan kode kita.

Ngomong-ngomong, inilah sedikit kompetisi yang kami miliki di webinar)). Dan lanjutkan.

Modul Distribusi Standar Node




Apakah Anda tahu modul mana yang termasuk dalam distribusi Node standar? Artinya, kita berbicara tentang modul yang sudah built-in, oleh karena itu, mereka tidak dapat diinstal. Secara umum, ada sekitar 50, mari kita daftar yang utama. Untuk memudahkan persepsi, kami membaginya secara konvensional menjadi 5 poin:

1. Utama (untuk operasi biasa):

  • fs;
  • pengatur waktu;
  • stream (untuk bekerja dengan stream).

2. Utilitas:

  • path (untuk bekerja dengan paths);
  • util;
  • zlib (pengarsipan dan unzip);
  • crypto (untuk fungsi kriptografi).

3. Proses (semua yang terkait dengan multiprosesing dan paralelisme):

  • child_process (modul utama untuk meluncurkan modul kecil, memberikan peluang besar untuk memulai dan memantau proses);
  • cluster (mirip dengan yang pertama, tetapi memungkinkan Anda untuk memparalelkan tugas pada inti prosesor Anda);
  • worker_threads (implementasi utas atau utas, tetapi tidak sepenuhnya aman, tetapi mengapa, lebih baik membaca di dokumentasi).

4. Protokol (semua jenis protokol):

  • http (s);
  • bersih;
  • dns.

5. Sistem (masing-masing, modul sistem, termasuk debugging):

  • os
  • v8;
  • async_hooks;
  • perf_hooks;
  • trace_events

Apa lagi yang harus ditambahkan:

- objek global - analog jendela;
- semua objek JavaScript yang tersedia di browser juga tersedia di Node.js;
- timeout - hampir seperti di browser;
- proses - representasi dari proses saat ini;
- Konsol tersedia.

Telepon balik


Callback - fungsi yang diteruskan sebagai argumen ke kode, yang melibatkan pelaksanaannya di beberapa titik waktu. Ngomong-ngomong, orang jarang berpikir bahwa eksekusi mereka bisa sinkron atau asinkron.

const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`)
})

Di Node, secara default, panggilan balik dijalankan dengan "kesalahan" dan hasilnya tidak sinkron:

fs.readFile('/etc/passwd', (err, data) => {
if (err) throw err
console.log(data)
})

Dan inilah yang terlihat seperti antipattern - contoh yang baik tentang cara menggunakan Callback secara tidak benar. Seperti yang mereka katakan, neraka Callback klasik :

fs.readdir(source, function (err, files) {
if (err) {
console.log('Error finding files: ' + err)
} else {
files.forEach(function (filename, fileIndex) {
console.log(filename)
gm(source + filename).size(function (err, values) {
if (err) {
console.log('Error identifying file size: ' + err)
} else {
console.log(filename + ' : ' + values)
aspect = (values.width / values.height)
widths.forEach(function (width, widthIndex) {
height = Math.round(width / aspect)
console.log('resizing ' + filename + 'to ' + height + 'x' + height)
this.resize(width, height).write(dest + 'w' + width + '_' + filename, function(err) {
if (err) console.log('Error writing file: ' + err)
})
}.bind(this))
}
})
})
}
})

Sekarang mari kita lihat cara membuat server web sederhana dan membuat indeks HTML sebagai respons klien:

const http = require('http')
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader('Content-Type', 'text/plain')
res.end('Hello World\n')
})

Untuk membaca file html lokal:

const fs = require('fs')
fs.readFile('./index.html', (err, text) => {
console.log(text)
})

Menyelesaikan topik panggilan balik, saya ingin menyebutkan Jenis Panggilan Balik. Ada panggilan balik yang hanya menghasilkan kesalahan jika ada kesalahan:

fs.access('/etc/passwd', fs.constants.R_OK, (err) => {
console.log(err ? 'no access!' : 'read')
})

Juga sekarang, semakin banyak modul dan API menggunakan Janji di luar kotak, yang bagus. Node mendukung Janji:

util.promisify()
fs.promises.*

Jenis pengembalian:

http.request('https://example.com', (error, response, body) => {
...
})

T&J Simpul


Saat menulis server web, Express sering digunakan, meskipun ada banyak pustaka dan kerangka kerja lain yang menerapkan fungsi serupa. Meskipun demikian, Express adalah yang paling populer dan stabil. Bisa dibilang ini adalah standar untuk server penulisan.

import express from "express";
const app = express();
const port = 3000;
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.listen(port, () => {
console.log(`Example app listening
});



Nah, sekarang Anda dapat mencoba membuat server web dengan generator-Express sendiri :

  • menggunakan giok, sesi cookie;
  • membuat logout masuk yang naif.

Atau lihat saja bagaimana guru melakukannya, yang menyiapkan solusi siap pakai dalam TypeScript.

Itu saja. Akhirnya - beberapa tautan bermanfaat:


Dan sampai jumpa di lapangan .

All Articles