Gần đây một số sinh viên thường hỏi tôi nên chọn hướng nào khi lập trình ứng dụng Web Spring Boot:

  1. Kiểu Server Side Rendering : sử dụng Thymeleaf (một view template engine)
  2. Kiểu Client Side Rendering : sử dụng Angular, React, Vue gọi vào REST API của Spring Boot?

Xu hướng làm app web mới thì kết hợp Spring boot với Thymeleaf hay là Spring boot với Angular (hoặc ReactJs)?
Cách nào tốt hơn?
Ưu/nhược điểm của mỗi cách
Với 1 câu nữa là phát biểu sau có đúng ko: Angular/ReActJs/VueJS “chỉ” hiệu quả khi viết app dạng SPA(Single Page Application) còn các app web thông thường thì dùng Jquery là đủ?

Server Side Rendering khác gì với Client Side Rendering?

Đặc điểmServer Side RenderingClient Side Rendering
Cơ chếHTML sinh ra ở web serverHTML sinh ra ở trình duyệt
Ngôn ngữ lập trìnhView Template Engine Syntax và ngôn ngữ lập trình web serverJavaScript kết hợp với cú pháp riêng từng framework
Trải nghiệm người dùngThường phải reload lại trang để làm mới thông tinGiao diện cập nhật từng phần, cập nhật liên tục và tự nhiên hơn
SEOThân thiện hơn với Search EngineGây nhiều khó khăn cho Search Engine
Ứng dụngHiển thị nội dung tĩnh, 80% read, 20% writeNhiều người cũng tham gia cập nhật, nội dung liên tục thay đổi
Mô hìnhPhù hợp và dễ triển khai với MonolithicsPhù hợp với mô hình microservice, API Gateway
Triển khaiĐóng gói thành 1 cụcFront end và Back end có thể triển khai độc lập

Server Side Rendering

Ưu và nhược điểm của Server Side Rendering

Ưu điểm

  • Dễ học, dễ debug, dễ đóng gói
  • Phù hợp ứng dụng web cổ điển, phần lớn thời gian người dùng đọc thông tin được truy vấn từ CSDL
  • Lần đầu tải khá nhanh
  • Có thể áp dụng cơ chế caching cả trang nội dung nếu nội dung ít khi thay đổi

Nhược điểm

  • Khó khăn trong việc lập trình cập nhật trạng thái từng phần trong cả một trang web
  • Cách reload lại trang không còn phù hợp với trải nghiệm người dùng hiện nay
  • Client Side Rendering

Ưu và nhược điểm của Client Side Rendering

Ưu điểm

  • Rất phù hợp để tạo ứng dụng web chủ động cập nhật làm mới từng phần giao diện: ứng dụng chat, biểu đồ động, ứng dụng mạng xã hội nhiều người cùng tạo thông tin
  • Giảm thiểu số lần reload lại cả trang web
  • Tách biệt rõ ràng công việc của lập trình web front end và lập trình back end tạo REST API. Kiểm thử từng bộ phận sẽ rành mạch hơn
  • Cập nhật phiên bản mới front end không ảnh hưởng hoạt động của back end
  • Nếu back end chỉ nâng cấp logic không thay đổi API thì nâng cấp back end không ảnh hưởng đến front end
  • REST API của back end có thể phục vụ cho cả ứng dụng di động

Nhược điểm

  • Với những ứng dụng nhỏ, sẽ tốn thêm lập trình viên front end
  • Để học và làm chủ Angular, React, Vue khó hơn làm chủ cú pháp HTML, CSS, View Template Syntax
  • Cấu hình DevOps sẽ phức tạp hơn, nhưng việc CI/CD sẽ liên tục hơn so với Server Side Rendering
  • Lần đầu load sẽ khá chậm vì phải tải về thư viện

Hỏi đáp

  1. Hỏi: Nếu tôi chọn Client Side Rendering thì tôi có nên dùng chính Spring Boot để host ứng dụng Angular, React, Vue?

    Trả lời: về nguyên tắc bạn có thể làm được, nhưng bạn không nên làm như vậy, vì chúng ta đang cố gắng tách bạch front end và back end. Làm sao để front end cập nhật không ảnh hưởng đến back end.
    Nên sử dụng Nginx làm web server để hosting ứng dụng front end.

  2. Hỏi: Tôi muốn học lập trình Web Front End thì nên bắt đầu như thế nào?
    Đáp: Bạn có thể tham khảo khoá học Web Front End 5 tháng tại Techmaster

Tham khảo