CHƯƠNG 1: CƠ SỞ LÝ THUYẾT (SPA). Đây là một trong những thế mạnh khiến MEAN chạy trên mọi cấp độ của ứng dụng, trở thành một cách hiệu quả và hiện đại để phát triển web. CÁC THÀNH PHẦN CỦA MEAN STACK: Chữ MEAN là viết tắt của 4 công nghệ: ● MongoDB - Database server MongoDB là một cơ sở dữ liệu có dạng NoSQL. NoSQL là một thế hệ cơ sở dữ liệu có các đặc điểm chính là không ràng buộc (non- relational), phân tán (distributed), mã nguồn mở (open source), khả năng co giãn theo chiều ngang (Horizontal scalable) có thể lưu trữ, xử lý từ một lượng rất nhỏ cho tới dữ liệu cực lớn, lên đến hàng petabytes dữ liệu trong hệ thống cần có độ chịu tải, chịu lỗi cao với những yêu cầu về tài nguyên phần cứng thấp.
● ExpressJS - Web framework ExpressJS là một web application framework cho NodeJS, cung cấp các tính năng mạnh mẽ cho việc xây dựng một ứng dụng web đúng nghĩa hoặc ngược lại. Express cũng có thể sử dụng để xây dựng một API mạnh mẽ và thân thiện với người dùng, vì nó cung cấp rất nhiều tiện ích HTTP và middleware cho việc kết nối. Nó hoạt động dựa trên các thuộc tính mở rộng HTML (các attributes theo quy tắc của Angular). Đây là một Framework mã nguồn mở hoàn toàn miễn phí và được hàng ngàn các lập trình viên trên thế giới ưa chuộng và sử dụng.
● NodeJS - Web server (Back-end) Node.js nổi tiếng với việc xây dựng các ứng dụng thời gian thực có thể mở rộng và các ứng dụng web nhanh.js có thể biên dịch mã JavaScript thành mã máy gốc trước khi thực thi mã. Tính năng này rất hữu ích trong việc xây dựng các ứng dụng web JavaScript phía máy chủ. Các ứng dụng dựa trên kết thúc mạnh mẽ phục vụ để chứa các chức năng quan trọng cao bằng cách sử dụng Node. Tính năng được ngưỡng mộ nhất của Node.js là nó có thể sử dụng JavaScript làm cả ngôn ngữ front end và back end.
NODEJS 6 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1. KHÁI QUÁT VỀ NODEJS NodeJS là chữ N trong “MEAN”, tuy nằm ở cuối nhưng NodeJS lại là có vai trò quan trọng nhất, nó là nền tảng, là khởi nguồn cho cả stack này được tạo nên. NodeJS là một môi trường thực thi (runtime environment) được ra mắt vào năm 2009 cho phép JavaScript chạy trên Server-side. NodeJS là một mã nguồn mở, sử dụng mô hình event-drivent và non-blocking I/O được build trên Google V8 JavaScript engine để thực thi mã lệnh.
NodeJS thường được sử dụng trong việc xây dựng một môi trường cho các máy chủ và ứng dụng mạng, tuy nhiên khả năng và ứng dụng của NodeJS càng ngày càng được mở rộng. [5] NodeJS là nền tảng cơ bản nhất để xây dựng MEAN stack. ĐẶC ĐIỂM GIÚP NODEJS TRỞ NÊN MẠNH MẼ VÀ NỔI BẬT TRÊN THỊ TRƯỜNG GẦN ĐÂY? Nhanh: Một trong những ưu điểm làm nổi bật NodeJS nhất là tốc độ. Vì được thực thi trên Google V8 engine, mã JavaScript sẽ được build thẳng ra mã Assembly nên tốc độ xử lý của các ứng dụng NodeJS nhanh hơn Java, Python, PHP.
Và bên cạnh đó còn có các cơ chế Non-blocking I/O và Event Driven giúp mã lệnh thực thi trên NodeJS đạt hiệu năng cao hơn, ít tốn tài nguyên hơn. [6] Đơn giản: Không phải vì NodeJS là công nghệ mới mà việc học và sử dụng NodeJS khó khăn, ngược lại có thể rất dễ đối với những lập trình viên đã quen với JavaScript. Bởi vì NodeJS chỉ là một môi trường thực thi, còn mã lệnh được viết trên đó vẫn là JavaScript, vậy những lập trình viên Front-end đang sử dụng JavaScript đều có thể học và sử dụng NodeJS một cách nhanh chóng. Một điều đơn giản hơn nữa của NodeJS là được ứng dụng trong MEAN stack, một Technical Stack được viết toàn bộ bằng JavaScript (một ngôn ngữ trước đây bị đánh giá thấp là chỉ có thể chạy trên trình duyệt web).
Điều này giúp ích rất nhiều trong việc đỡ phải gặp rắc rối vì sử dụng nhiều ngôn ngữ lập trình một lúc. Hiệu năng cao: 7 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT Nhờ vào cơ chế Single Thread và Event Loop, mà JavaScript tiết kiệm tài nguyên hơn cho hệ thống Mutil thread trên hệ thống cũ: Hình 2: Multi thread trên hệ thống cũ Những hệ thống cũ, mỗi khi server tiếp nhận một request là bản thân server sẽ tự tách ra một Thread mới để xử lý request đó, việc này sẽ làm tốn rất nhiều tài nguyên nếu như số lượng request được tăng cao (1 ngàn đến 1 triệu request) vào cùng một thời điểm, dễ quá tải server. Single thread trên những hệ thống mới: Hình 3: Single Thread Với cơ chế Single Thread của NodeJS, thật ra ở bên trong của Thread đơn này, các tác vụ vẫn được xử lý đa luồng nhưng theo kiểu bất đồng bộ (asynchronous)[7] 8 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT Blocking I/O và Non-blocking I/O Blocking: Hình 4: Blocking Là cơ chế yêu cầu thực thi một tác vụ IO, sau khi hoàn thành thì trả kết quả lại. Khi xử lý một tác vụ Blocking, Thread bị block cho đến khi có kết quả trả về hoặc xảy ra ngoại lệ thì mới xử lý tiếp tác vụ tiếp theo.
Non-blocking: Yêu cầu thực thi một tác vụ IO và trả về ngay lập tức (timeout = 0). Nếu tác vụ chưa sẵn sàng để thực hiện thì thử lại sau. Tương đương với kiểm tra tác vụ IO có sẵn sàng ngay hay không, nếu có thì thực hiện và trả về, nếu không thì thông báo thử lại sau. Những tác vụ Non-blocking thường được viết theo cơ chế xử lý bất đồng bộ (Asynchronous) Hình 5: Non-blocking 9 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT Cơ chế non-blocking I/O này đã loại bỏ việc tạo thêm thread vì máy chủ có thể xử lý nhiều yêu cầu một lúc.
JavaScript là ngôn ngữ hướng sự kiện. Có 2 loại sự kiện chính ở trong NodeJS: Sự kiện hệ thống: C ++ core từ thư viện có tên libuv. Sự kiện tùy chỉnh: core JavaScript Hình 6: Event driven NodeJS Event driven là cơ chế mà NodeJS sử dụng để điều khiển luồng sự kiện trong nó. Vì là cơ chế đơn luồng (Single Thread) vì vậy mọi hàm xử lý được viết trong nodejs đều trả về một Event.
Package manager là gì? Package Manager (PM) hoặc package management system là một tập hợp các phần mềm dùng để quản lý và tự động hóa việc cài đặt, nâng cấp, gỡ bỏ các phần mềm hoặc thư viện (package). Trong một dự án cần sử dụng một số thư viện thay vì tự code để sử dụng. Việc sử dụng các thư viện có sẵn trên mạng và nhúng vào dự án khác sẽ gặp những vấn đề như: Khi nhiều thành viên cùng làm chung một dự án, đôi lúc sử dụng những phiên bản riêng, xung đột lẫn nhau. Dự án có thể chạy ở máy này nhưng lại không chạy ở máy khác.
10 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT Khi commit code vào source control, cần phải commit cả thư viện vào. Điều làm khiến cho dự án rất nhiều và nặng khi commit cũng như tải về. Khi deploy, việc copy cả một thư viện lên rất chậm và mất thời gian. Sử dụng PM, mọi vấn đề đều được giải quyết.
Vậy PM xử lý vấn đề này như thế nào? Thông thường, một hệ thống PM thường bao gồm các thành phần: Package Manager: Cài đặt trên máy developer, quản lý việc cài đặt các package Repository: Nơi chứa các package (trên mạng). Khi cần một package nào đó, PM sẽ tải package đó từ repository về. Local Package Database: Mỗi dự án sẽ có local package database riêng, chứa thông tin (metadata, bao gồm tên package, phiên bản, dependency) của các package trong dự án đó. Với 3 thành phần này, PM giải quyết các vấn đề trên rất dễ dàng: Mỗi khi cần thư viện, dùng PM để cài đặt.
PM sẽ tải thư viện từ Repository về, sau đó cập nhật Local Package Database. Khi commit code, bạn chỉ cần commit Local Package Database, đây thường chỉ là 1 file text rất nhẹ. Khi deploy hoặc share code qua máy khác, sẽ sử dụng PM. Dựa theo các package trong Local Package Database, PM sẽ tải đúng package phiên bản tương ứng.
Điều này đảm bảo mọi người đều dùng chung package, chung phiên bản. Code nằm trong source control cũng rất nhẹ, up nhanh tải nhanh mang lại hiệu quả cao. Tại sao lại sử dụng npm? NPM viết tắt của Node Package Manager là một công cụ quản lý các thư viện lập trình Javascript cho Node.js, công cụ này là thật sự cần thiết cho thế giới mã nguồn mở. Trong cộng đồng JavaScript, các lập trình viên chia sẻ hàng trăm nghìn các đoạn code giúp cho các dự án mới tránh phải viết lại các thành phần cơ bản, các thư viện lập trình hay thậm chí cả các framework.
Mỗi đoạn code này có thể phụ thuộc vào rất 11 do an CHƯƠNG 1: CƠ SỞ LÝ THUYẾT nhiều các mã nguồn mở khác, thật may mắn khi các công cụ quản lý thư viện ra đời, nếu không sẽ mất rất nhiều công sức trong việc quản lý các thư viện này [10]. NHƯỢC ĐIỂM CỦA NODEJS Dễ để cho lập trình viên có kinh nghiệm tìm hiểu nhưng lại khá khó cho người mới bắt đầu. Đặc biệt là những lập trình viên quen với kiểu lập trình tuần tự (Synchronous). Vì nó là công nghệ mới, vậy nên thường chỉ thích hợp với những start up.
Những dự án lớn, quan trọng của các công ty lớn sẽ ít chọn NodeJS để làm. KHÁI QUÁT VỀ EXPRESSJS Express là chữ “E” trong “MEAN”. ExpressJS là một trong những Framework quan trọng nhất của NodeJS. Khi xây dựng một web server, có rất nhiều đoạn mã về Routing, về Listening port, configure… phải lặp đi lặp lại rất nhiều và dài dòng, ExpressJS ra đời và giải quyết vấn đề về code dài, code không sạch của lập trình viên back-end khi xây dựng Web server.
Đây là một framework tối giản để xây dựng một loạt các ứng dụng web và di động cũng như các API. Rất nhiều ứng dụng phổ biến và các trang web như MySpace, Geekli.st, Klout, Segment.io và Yummly được xây dựng bởi Express.js cung cấp các tính năng khác nhau, như đơn giản hóa nhiều định tuyến, tích hợp cơ sở dữ liệu,… 1. ĐẶC ĐIỂM CỦA EXPRESSJS Tối ưu việc tạo server: Như đã được lưu ý ở trên, Node.js là một nền tảng không phải server. Điều này cho phép có thể sáng tạo trong việc thiết lập server và làm những việc mà các web server khác không thể làm.
Nó cũng khiến cho việc tạo và chạy các trang web căn bản trở nên khó khăn do phải viết nhiều hơn những lệnh cấu hình.