Q/A NodeJS là cái gì?
NodeJS là gì?
Anh ui, NodeJS là cái gì vậy anh?
Định nghĩa của NodeJS trên trang chủ nè:
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
Đù, Một cái đinh nghĩa thui mà cả tá thuật ngữ chuyên ngành, em hem hiểu gì hết trơn
Javascript engine là cái quần gì?
event-driven là quần gì?
non-blocking nữa, vậy blocking là sao?
I/O model ???
package ecosystem là seo?
Javascript chạy như thế nào?
Chắc hẳng chú thường nghe nói Javascript chạy trên trình duyệt web ( browser ) đúng không?
Thì trình duyệt web nó cũng là một phèn mìm ( phần mềm ) thui, có gì đâu.
Giống như Microsoft Word để gõ văn bản vậy đó. Nhưng mà trình duyệt nào cũng vậy, để chạy được thì cần phải có 3 chương trình con trong nó. Nếu coi trình duyệt như một ông giám đốc thì cần có 3 thằng nhân viên:
DOM interpreter: thằng này để dịch HTML sang mã máy
CSS interpreter: thằng này để địch CSS sang mã máy
Javascript Engine: thằng này để dịch Javascript sang mã máy
Tại sao cần phải dịch?
Máy tính nó như người nguyên thủy sống giữa thời hiện đại vậy đó, nó chỉ hiểu ngôn ngữ cực thấp là
Binary code ( mã máy ) là 0 với 1 thôi. Chú có muốn viết code giống này không? Ăn rồi ngồi bấm lỗ 0 với 1 thôi nhé:
Chu choa mẹ ơi, nhìn cool vl anh à, em cũng muốn học binary code quá
Ừa, chú có thể vào đây học viết binary code để tặng gấu nè
Em làm gì có gấu, mà em hiểu sơ sơ rồi, tức là trình duyệt nó muốn chạy một trang web thì trình duyệt đó cần 3 phần mềm dịch bên trong nó để dịch code sang mã máy đúng không?
Chuẩn
À, hèn gì học lập trình web là phải học HTML, CSS với Javascript. Ủa vậy thì Chrome, Firefox, IE nó khác nhau thế nào?
Thì nó xài Javasript Engine khác nhau.
Mozilla
Spidermonkey
Chrome
V8
Safari
JavaScriptCore ( hay gọi là Nitro )
IE and Edge
Chakra
Đù gì tùm lum vậy, em chỉ muốn biết NodeJS là gì thôi mà?
Thì NodeJS xài V8 engine đó, hem thấy hả?
Nhưng trình duyệt mới cần Javascript Engine chứ, NodeJS cần mẹ gì?
Thì NodeJS dùng để viết web server đúng không, mà Javascript chạy được khi có Javascript Engine thôi, nên mới cần NodeJS.
Nhưng mà web server là gì?
Bây giờ máy tính của chú muốn lên Facebook được đúng không? Thì phải gõ vô trình duyệt web là
facebook.com. Ok chưa? Thực ra facebook.com là tên miền thôi, nó sẻ trỏ qua địa chỉ IP này 31.13.95.36
Khoan, sao anh biết biết địa chỉ IP của Facebook gê vậy?
Dễ ẹt, vô Terminal ( máy Mac ) hoặc Command Prompt ( Windows) gõ:
ping facebook.com
Nó sẽ ra địa chỉ thôi:
Sẽ có một cái máy tính khác đặt ở bên Mỹ ( ví dụ thôi chứ không biết nó đặt ở đâu nha ) có địa chỉ IP này.
Và giả sử máy tính hiện tại của chú có IP là 69.96.69.96 nha, thì khi chú truy cập đến facebook.com sẽ nhận kết quả trả về, người ta gọi đó là mô hình client - server:
Ví dụ, khi yêu cầu vào đường dẫn facebook.com thì web server nó trả về trang newsfeed
Tức là cái web server cùi bắp nhất phải làm những được việc sau:
Giao tiếp trên Internet
Nhận request là gửi response cho client
Kết nối với database
Quản lý FileFile
Xử lý nhiều request cùng lúc từ users
vv
Đó là lý do NodeJS ra đời.
Ừa, tạm hiểu, nhưng em vẫn không hiểu tại sao NodeJS xài V8 engine làm gì?
Ok, ta vô trang chủ V8 engine xem nó là gì nhá:
V8 is Google's open source JavaScript engine.
V8 implements ECMAScript as specified in ECMA-262.
V8 is written in C++ and is used in Google Chrome, the open source browser from Google.
V8 can run standalone, or can be embedded into any C++ application.
Để ý câu cuối là can be embedded into any C++ nha. Tức là NodeJS là một library lớn hơn nhưng trong đó có xài V8 engine. Mục đích là để tạo nên một web server có những tính năng như: Nhận request là gửi response cho client, vv ( đã nói ở trên ) mà vẫn sử dụng Javascript chứ không phải C++ hay Python.
A, thì ra là vậy
Đó vậy là đã hiểu ý đầu "Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine" rồi đúng không.
Vậy là còn:
event-driven là quần gì?
non-blocking nữa, vậy blocking là sao?
I/O model ???
package ecosystem là seo?
Ừa, vậy event-driven là gì vậy anh?