Daily Archives: 12/09/2016

NodeJS – Cài đặt

Trước khi đi vào tìm hiểu các thành phần của Node thì chúng ta phải cài đặt Node trên máy đã.

Node có thể chạy trên hầu hết các hệ điều hành, từ Linux, MacOS X… cho đến Windows. Ngoài ra các máy tính nhỏ cũng có thể chạy được, như các CPU trên thiết bị di động ARM, Raspberry Pi…

Chúng ta có thể cài Node thông qua các hệ thống quản lý gói có sẵn trên các hệ điều hành UNIX (như apt-get trên Ubuntu, yum trên CentOS…), thông qua trình Installer trên Windows, hoặc build lại từ Source, mặc dù việc build từ source là khá khó và không nên dùng cách này vì phí thời gian.

Cài đặt trên các hệ điều hành UNIX

Đối với các hệ điều hành UNIX thì chúng ta sẽ sử dụng phần mềm quản lý gói có sẵn trong các hệ điều hành này. Việc dùng các chương trình này có một thuận lợi là chúng ta có thể cập nhật phiên bản mới nhất mọi lúc mọi nơi chỉ với một câu lệnh, ví dụ apt-get update. Và trước khi cài Node thì chúng ta cũng nên chạy câu lệnh này trước.

Sau đó để cài Node thì chúng ta gõ lệnh sau:

Với Debian:

$ apt-get install nodejs

Với Ubuntu:

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:chris-lea/node.js
$ sudo apt-get update
$ sudo apt-get install nodejs npm

Vậy là xong.

Cài đặt trên Windows

Để cài đặt trên Windows thì cách tốt nhất là chúng ta lên trang chủ của Node và tải trình Installer về cài đặt tại địa chỉ https://nodejs.org/en/download/

Sau đó chúng ta tiến hành cài đặt như bình thường. Lưu ý trong quá trình cài đặt chúng ta nên chọn để trình Installer gán địa chỉ thư mục vào biến môi trường PATH. Nếu không sau này khi code sẽ rất mệt.

capture

Kiểm tra phiên bản Node

Sau khi đã cài đặt thành công. Chúng ta có thể mở trình terminal (trong Windows là Command Prompt – cmd) lên và chạy lệnh node -v hoặc node --version để xem phiên bản Node trên máy cũng như kiểm tra xem Node đã được cài đặt thành công hay chưa.

C:\User\PhoCode>node -v
v4.5.0

NodeJS – Giới thiệu

 

Node là một nền tảng phát triển các ứng dụng web back-end được viết bằng JavaScript, tức là Node không được viết để chạy trên trình duyệt, nếu bạn đã từng học JavaScript thông thường thì bạn sẽ thấy Node chạy khác với những gì bạn đã học, bạn sẽ không thấy những thứ như document.getElementById()... mặc dù thực tế vẫn có một số thư viện hỗ trợ Node viết cho trình duyệt, tuy nhiên chúng ta sẽ không quan tâm đến chúng trong series này.

Ngoài việc chạy trên JavaScript thì Node có những tính năng đi kèm sau:

  • Có trình CLI (giao diện dòng lệnh)
  • Chạy theo mô hình REPL
  • Có các hàm quản lý tiến trình
  • Có các đối tượng hỗ trợ làm việc với dữ liệu nhị phân
  • Hỗ trợ TCP và UDP
  • Hỗ trợ hân giải DNS
  • Hỗ trợ HTTP và HTTPS
  • Có thể truy cập file và thư mục

Node cho phép bạn thực hiện các giao thức mạng ở cấp độ thấp một cách dễ dàng. Chẳng hạn như Node có module HTTP cho phép xây dựng một webserver chỉ với vài dòng code, tuy nhiên vì thế mà bạn sẽ phải học nhiều thứ hơn như học về các header của một gói tin HTTP, không như PHP vốn chỉ là một module mở rộng của một webserver có sẵn (như Apache hay NginX…) – tức là PHP dễ dùng hơn Node nhưng lại không cho phép coder thực hiện các công việc ở cấp độ thấp. Tuy nhiên vì NodeJS là một framework mã nguồn mở, do đó trên mạng cũng có một số thư viện hỗ trợ viết webserver nhanh hơn và dễ hơn cho coder.

Kiến trúc của Node

Node sử dụng kiển trúc lập trình hướng sự kiện không đồng bộ, và đây là một tính năng làm cho các ứng dụng Node có thể chạy với hiệu suất cao. Chẳng hạn như đối với các ứng dụng bình thường như một chương trình viết bằng C++ thì khi chúng ta viết chương trình để đọc dữ liệu, chương trình sẽ phải dừng lại ở đoạn code đọc dữ liệu để chờ cho đến khi có dữ liệu để đọc, nếu muốn chương trình tiếp tục vừa chạy các công việc khác vừa đọc dữ liệu thì phải dùng đến đa luồng (multi-threading), tuy nhiên việc dùng đa luồng rất phức tạp và có thể làm chậm server.

Node chỉ sử dụng một luồng duy nhất, các câu lệnh nhập xuất không cần phải chờ bằng cách sử dụng Event Loop, cứ mỗi lần có sự kiện xảy ra thì chuyển dữ liệu của sự kiện đó đến các hàm xử lý tương ứng, và trong khi các hàm xử lý đang chạy thì vòng lặp sự kiện vẫn tiếp tục nhận sự kiện và chuyển đến các hàm xử lý tương ứng khác.

Ví dụ giả sử chúng ta có dòng code lấy dữ liệu từ cơ sở dữ liệu như sau:

result = query('SELECT * from db');
// xử lý result

Đối với các chương trình bình thường thì khi chạy đến dòng code trên, luồng chạy chương trình đó sẽ phải dừng lại để đợi quá trình xử lý từ cơ sở dữ liệu thực hiện xong và trả về rồi mới tiếp tục được, trong quá trình đợi đó sẽ có nhiều yêu cầu khác xảy ra và hiệu suất phần mềm sẽ giảm do lãng phí tài nguyên, để giải quyết tình trạng đó thì chúng ta có thể dùng cơ chế đa luồng để xử lý, tuy nhiên đa luồng có một nhược điểm làm tiêu tốn nhiều bộ nhớ và CPU.

Thay vì dùng đa luồng thì Node sử dụng cơ chế Event Loop để giải quyết việc này, nói một cách đơn giản thì Node sẽ đưa các câu lệnh chờ trên vào một luồng khác là Event Loop để xử lý riêng, trong khi luồng chính vẫn sẽ chạy các công việc của riêng nó, và khi nào luồng chính “rảnh” rồi thì luồng Event Loop sẽ chuyển các công việc đã thực hiện xong trở về lại luồng chính. Và chính vì Node chỉ sử dụng 2 luồng nên tài nguyên hệ thống sẽ không bị chiếm nhiều như khi dùng cơ chế đa luồng, ngoài ra việc code sử dụng Event Loop đơn giản hơn nhiều, ví dụ:

query('SELECT * from db', function(err, result) {
    if (err) throw err;
    // xử lý result
});

Trong đoạn code trên, kết quả trả về từ hàm query() thay vì được gán vào một biến thì sẽ được truyền vào một hàm khác là function(err, result){...}, và hàm này sẽ được chuyển vào luồng Event Loop và chờ cho đến khi luồng chính “rảnh” thì mới được chuyển qua.

Tên gọi

Tên chính thức là Node.js, tuy nhiên chúng ta sẽ gọi tắt là Node cho đơn giản.