Sẽ không tuyệt vời nếu bạn chỉ phải biết một ngôn ngữ lập trình để xây dựng một ứng dụng ngăn xếp đầy đủ. Ryan Dahl đưa suy nghĩ này thành hành động và tạo ra Node.js. Node.js là một khung công tác phía máy chủ được xây dựng dựa trên công cụ JavaScript V8 mạnh mẽ của Chrome. Mặc dù ban đầu được viết bằng C ++, các ứng dụng được chạy thông qua JavaScript.

Xem, vấn đề được giải quyết. Một ngôn ngữ để cai trị tất cả. Nhưng điều này cũng đưa bạn đến thực tế là bây giờ toàn bộ ứng dụng của bạn đang sử dụng cùng một ngôn ngữ. Điều đó có nghĩa là bạn cần một kiến ​​thức vững chắc về ngôn ngữ đó. Đó là chủ đề của bài viết này. 

Dưới đây là bốn khái niệm cơ bản mà bạn nên thực hành để trở nên tốt hơn tại Node.js. Tôi sẽ cố gắng để bài viết này ngắn. 

1. I / O không chặn hoặc không đồng bộ

Vì Node.js là khung công tác phía máy chủ, một trong những công việc chính của nó là xử lý các yêu cầu của trình duyệt. Trong các hệ thống I / O truyền thống, chỉ có thể đưa ra yêu cầu khi phản hồi (trang HTML) của yêu cầu trước đó đã đến. Đó là lý do tại sao, nó được gọi là chặn I / O. Máy chủ chặn các yêu cầu khác để xử lý yêu cầu hiện tại khiến trình duyệt phải chờ (vòng tròn xoay).

Node.js không tuân theo nguyên tắc I / O này. Nếu một yêu cầu dự định sẽ mất nhiều thời gian hơn, Node.js sẽ gửi yêu cầu đó trong một vòng lặp sự kiện  (tôi sẽ giải thích điều này trong một bài viết khác) và tiếp tục xử lý yêu cầu tiếp theo trong ngăn xếp cuộc gọi . Ngay khi yêu cầu đang chờ xử lý được xử lý xong, nó sẽ báo cho Node.js và phản hồi được hiển thị trên trình duyệt.


Hãy hiểu điều này với một ví dụ giả:

Chặn I / O

// take order for table 1 and wait...
var order1 = orderBlocking(['Coke', 'Iced Tea']);

// once order is ready, take order back to table.
serveOrder(order1);
// once order is delivered, move on to another table.

// take order for table 2 and wait...
var order2 = orderBlocking(['Coke', 'Water']);

// once order is ready, take order back to table.
serveOrder(order2);
// once order is delivered, move on to another table.

// take order for table 3 and wait...
var order3 = orderBlocking(['Iced Tea', 'Water']);

// once order is ready, take order back to table.
serveOrder(order3);
// once order is delivered, move on to another table.

Trong ví dụ này về một nhà hàng, người phục vụ nhận đơn đặt hàng, đợi đơn hàng được hoàn thành và sau đó quay trở lại bàn để phục vụ đơn hàng đó khi hoàn thành. Trong thời gian đặt hàng đang xử lý, người phục vụ chỉ chờ hoặc chặn đơn hàng từ các khách hàng khác.

Không chặn I / O

// take order for table 1 and move on...
orderNonBlocking(['Coke', 'Iced Tea'], function(drinks){
  return serveOrder(drinks);
});

// take order for table 2 and move on...
orderNonBlocking(['Beer', 'Whiskey'], function(drinks){
  return serveOrder(drinks);
});

// take order for table 3 and move on...
orderNonBlocking(['Hamburger', 'Pizza'], function(food){
  return serveOrder(food);
});

Trong ví dụ này, người phục vụ nhận một đơn đặt hàng và thông báo cho đầu bếp, sau đó quay lại để nhận một đơn đặt hàng khác. Sau khi đơn đặt hàng đầu tiên được xử lý xong, anh ta đưa đơn hàng đó đến bàn tương ứng và tiếp tục nhận đơn đặt hàng từ các khách hàng khác. Người phục vụ không lãng phí thời gian bằng cách chặn các đơn đặt hàng từ các khách hàng khác.

2. Nguyên mẫu

Nguyên mẫu là một khái niệm phức tạp về JavaScript. Vì bạn sẽ sử dụng các nguyên mẫu rất nhiều trong Node.js, mọi nhà phát triển JavaScript phải biết về khái niệm này.

Trong một ngôn ngữ thực hiện kế thừa cổ điển như Java hoặc C ++, với mục đích tái sử dụng mã, trước tiên bạn phải tạo một lớp (bản thiết kế cho các đối tượng của bạn) và sau đó tạo các đối tượng từ lớp đó hoặc mở rộng lớp đó. Nhưng, không có khái niệm về các lớp trong JavaScript. Trước tiên, bạn tạo một đối tượng trong JavaScript và sau đó tăng đối tượng của riêng bạn hoặc tạo các đối tượng mới từ nó. Điều này được gọi là kế thừa nguyên mẫu và được thực hiện thông qua nguyên mẫu.

Mỗi đối tượng JavaScript được liên kết với một đối tượng nguyên mẫu mà từ đó nó có thể kế thừa các thuộc tính. Các nguyên mẫu tương tự như các lớp trong các làn đường OO khác nhưng khác ở chỗ chúng là các đối tượng. Mọi đối tượng được liên kết với Object.prototype  được xác định trước bằng JavaScript.

Nếu bạn tra cứu một thuộc tính thông qua obj.propName hoặc obj ['propName'] và đối tượng không có thuộc tính như vậy có thể được kiểm tra qua obj.hasOwnProperty ('propName'), thời gian chạy của JavaScript sẽ tìm kiếm thuộc tính trong nguyên mẫu của nó vật. Nếu đối tượng nguyên mẫu cũng không có thuộc tính như vậy, nguyên mẫu của chính sẽ được kiểm tra lần lượt cho đến khi tìm thấy kết quả khớp hoặc nếu nó đã đạt đến Object.prototype . Nếu thuộc tính đó không tồn tại trong chuỗi nguyên mẫu, thì nó sẽ dẫn đến một giá trị không xác định .

Hãy hiểu với mã ví dụ sau:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    };

var otherPerson = Object.create(person);

Khi bạn tạo một đối tượng mới, bạn phải chọn một đối tượng phải là nguyên mẫu của nó. Ở đây, chúng ta đang thêm một phương thức tạo vào hàm Object. Phương thức tạo tạo một đối tượng mới sử dụng một đối tượng khác làm nguyên mẫu của nó được truyền cho nó làm đối số.

Khi chúng tôi thay đổi đối tượng mới, nguyên mẫu của nó vẫn không bị ảnh hưởng. Nhưng, khi chúng ta thay đổi đối tượng nguyên mẫu, những thay đổi sẽ hiển thị trong tất cả các đối tượng dựa trên nguyên mẫu đó.

Nguyên mẫu là một khái niệm phức tạp. Tôi sẽ trình bày chi tiết về nguyên mẫu trong một bài viết khác.

3. Mô-đun

Nếu bạn đã từng làm việc với các gói trong Java, các mô-đun trong Node.js không có gì khác biệt. Nếu không, đừng lo lắng. Các mô-đun là các tệp JavaScript đơn giản chứa mã cho một mục đích cụ thể. Mẫu mô-đun được sử dụng để làm cho mã của bạn dễ dàng điều hướng và làm việc với. Để sử dụng các thuộc tính của một mô-đun, bạn phải yêu cầu nó trong một tệp JavaScript giống như khi bạn nhập một gói trong một lớp Java.

Có hai loại mô-đun trong Node.js.

Các mô-đun cốt lõi - Đây là những mô-đun được biên dịch sẵn với thư viện Node.js. Mục đích của các mô-đun cốt lõi là cung cấp cho các nhà phát triển thường xảy ra và lặp lại các phần mã mà nếu không có sẵn sẽ dẫn đến một nhiệm vụ tẻ nhạt cho các nhà phát triển vì họ phải viết cùng một mã nhiều lần. Một số mô-đun lõi phổ biến là HTTP, URL, SỰ KIỆN, HỆ THỐNG TẬP TIN, v.v.

Các mô-đun do người  dùng xác định - Các mô-đun do người dùng xác định là các mô-đun mà nhà phát triển thực hiện cho một mục đích cụ thể trong ứng dụng của mình. Chúng được yêu cầu khi các mô-đun lõi không có khả năng đáp ứng các chức năng mong muốn.

Các mô-đun được trích xuất thông qua  chức năng yêu cầu . Nếu nó là một mô-đun cốt lõi, đối số chỉ đơn giản là tên của mô-đun đó. Nếu đó là mô-đun do người dùng xác định, thì đối số là đường dẫn của mô-đun đó trong hệ thống tệp. Ví dụ:

// extract a core module like this

var http = require('http);

// extract a user defined module like this

var something = require('./folder1/folder2/folder3/something.js');

4. Gọi lại

Trong JavaScript, các hàm được coi là các đối tượng hạng nhất. Điều đó có nghĩa là bạn có thể thực hiện tất cả các hoạt động với các chức năng mà bạn có thể làm với các đối tượng thông thường. Bạn có thể gán các hàm cho một biến, chuyển chúng dưới dạng đối số cho các phương thức, khai báo chúng như một thuộc tính của một đối tượng và thậm chí trả về chúng từ các hàm.

Gọi lại là các hàm ẩn danh trong JavaScript có thể được chuyển qua làm đối số cho các hàm khác và được thực thi hoặc trả về từ hàm đó để được thực thi sau. Đây là cơ sở của các cuộc gọi lại, mô hình lập trình chức năng được sử dụng rộng rãi nhất.

Khi chúng ta truyền một hàm gọi lại làm đối số cho một hàm khác, chúng ta chỉ truyền định nghĩa hàm ... nói cách khác, chúng ta không bao giờ biết khi nào hàm gọi lại đó sẽ thực thi. Điều đó hoàn toàn phụ thuộc vào cơ chế của chức năng gọi. Nó được gọi là trở lại trước đây vào một thời điểm sau đó, do đó có tên. Đây là cơ sở duy nhất của hành vi không chặn hoặc không đồng bộ của Node.js như được minh họa bằng ví dụ sau.

setTimeout(function() {
    console.log("world");
}, 2000)

console.log("hello");

Đây là một trong những ví dụ đơn giản nhất của một cuộc gọi lại. Chúng tôi đã chuyển một hàm ẩn danh dưới dạng một đối số chỉ đơn giản là ghi một số đầu ra trên bàn điều khiển vào hàm setTimeout. Vì nó chỉ là định nghĩa hàm, nên nó không biết khi nào thực thi. Điều đó được xác định bởi chức năng gọi setTimeout thông qua đối số thứ hai, sau 2 giây.

Đầu tiên, câu lệnh log thứ hai ghi lại đầu ra vào bàn điều khiển và sau đó sau hai giây, câu lệnh log trong hàm gọi lại ghi lại đầu ra.

// output

hello
world

Đó là nó. Đó là 4 khái niệm JavaScript hàng đầu của tôi phải được biết đến với người mới bắt đầu Node.js. Có gì trong danh sách của bạn? Hãy để lại tôi một bình luận!