Tại sao các JavaScript framework hiện đại ngày càng giống nhau?

0 0 0

Người đăng: James Miller

Theo Viblo Asia

Bạn còn nhớ vài năm trước, việc chọn một framework frontend giống như một cuộc "nội chiến" không?

17562566132111433167669134394695.png

  • Phe React: Ca ngợi JSX là một thiết kế thiên tài, trong khi phe đối lập gọi nó là "sản phẩm lai tạp quái dị giữa HTML và JS".
  • Phe Angular: Kiên trì với giải pháp "tất cả trong một", bị fan Vue chế giễu là "quá cồng kềnh".
  • Phe Vue: Tự hào về con đường trung dung, cân bằng giữa tính dễ sử dụng và sự linh hoạt.

Trong các cuộc thảo luận cộng đồng, cảnh tượng thường thấy là các phe phái "cà khịa" lẫn nhau về đặc tính ngôn ngữ, triết lý kiến trúc, và hệ sinh thái công cụ.

Tuy nhiên, thực tế của năm 2025 là: sự khác biệt giữa các framework này đang ngày càng thu hẹp. Thậm chí đôi khi bạn chuyển sang một framework mới và phát hiện ra rằng trải nghiệm lập trình và phong cách API gần như có thể chuyển đổi một cách liền mạch.

Tại sao lại có xu hướng hội tụ này? Đằng sau nó không chỉ là sự tiến hóa tự nhiên của công nghệ, mà còn là sự thúc đẩy từ nhiều yếu tố như nhu cầu của lập trình viên, các nút thắt hiệu năng, và hệ sinh thái công cụ.


17562566477867114497692825758193.jpg

1. Mặt trận thống nhất về quản lý trạng thái: Signals

Trong tất cả các xu hướng hội tụ, sự thay đổi trong quản lý trạng thái phản ứng (reactive state management) là rõ ràng nhất.

Trước đây: Subscription & Re-render toàn bộ React ban đầu dựa trên Virtual DOM diff, sau khi trạng thái thay đổi sẽ thực thi lại các node bị ảnh hưởng trong cây component, đôi khi gây ra việc re-render hàng loạt. Vue 2.x tuy có theo dõi phụ thuộc chi tiết, nhưng cách triển khai lại khác. Angular thì dựa vào change detection (Zone.js) để duyệt qua tất cả các binding.

Hiện tại: Sự trỗi dậy của mô hình Signal Signal là một mô hình phản ứng theo dõi phụ thuộc một cách tường minh—khi một giá trị trạng thái thay đổi, nó chỉ cập nhật các tính toán hoặc view phụ thuộc trực tiếp vào nó, thay vì chạy lại toàn bộ quy trình render.

Hiện tại, các framework chính hỗ trợ như sau:

  • Angular 16+: Tích hợp sẵn Signals API.
  • Svelte 5: Tầng compiler dựa trên Signals, nhưng trong suốt với lập trình viên.
  • SolidJS / Qwik / Preact Signals: Các đại diện tiên phong của phe Signal.
  • Lit 3: Google cũng đã đưa Signal vào Web Components.

Vue tuy không gọi trực tiếp là "Signal", nhưng bản chất ref + effect của nó cũng cùng một tư tưởng. React hiện là "ngoại lệ", nhưng một trong những mục tiêu của React Compiler chính là giảm thiểu việc thực thi lại không cần thiết, điều này cũng tương đồng với tư duy của Signal.

Tại sao Signal có thể thống nhất giang hồ?

  • Ưu thế về hiệu năng: Tránh re-render hàng loạt, cải thiện độ mượt của tương tác.
  • Triển khai đơn giản: Logic tầng dưới có thể tái sử dụng cao, không phụ thuộc vào Virtual DOM.
  • Mô hình tư duy rõ ràng: Chuỗi phụ thuộc trạng thái rõ ràng, dễ debug.

2. Sự thống nhất hoàn toàn về triết lý component

Sự khác biệt ban đầu:

  • Angular ban đầu có khái niệm "directive", template và logic khá tách biệt.
  • React ngay từ đầu đã đề cao component dạng hàm/class, logic và view viết chung.
  • Vue duy trì sự tách biệt giữa HTML, CSS, JS trong khi dùng SFC (Single File Component) để tổ chức.

Sự đồng thuận ngày nay: Bất kể sự khác biệt về cú pháp, tư tưởng về component đã hoàn toàn thống nhất:

  • Props đi xuống: Dữ liệu chảy từ trên xuống dưới.
  • Events đi lên: Thông báo cho component cha thông qua callback hoặc event bubbling.
  • Lifecycle hooks: Thực thi logic ở các giai đoạn cụ thể.
  • Cơ chế tái sử dụng logic: Hooks, Mixins, Composable, v.v.

Điều này có nghĩa là, đối với lập trình viên, đường cong học tập khi chuyển đổi giữa các framework đã giảm đi đáng kể.


17562566743744653192708664708485.jpg

3. Sự trở lại của Server-side Rendering (SSR) và Hydration

Cách render của các framework frontend đã trải qua nhiều giai đoạn:

  1. Ban đầu: Chủ yếu là Server-side Rendering (SSR), trình duyệt chỉ đảm nhiệm tương tác tối thiểu.
  2. Thời kỳ SPA: Mọi logic render được chuyển sang phía client, màn hình đầu tiên phụ thuộc vào một lượng lớn JS.
  3. Sự trở lại hiện đại: Ưu tiên render phía server (Server-First), client kích hoạt theo nhu cầu (on-demand).

Ngày nay, dù là Next.js, Nuxt, SvelteKit, Astro, hay các nhánh thử nghiệm của Angular, tất cả đều đang thúc đẩy mô hình SSR + Hydration theo nhu cầu (Partial Hydration).

Lợi ích là:

  • First-paint nhanh hơn: Server trả về HTML trực tiếp, giảm thời gian màn hình trắng.
  • Giảm lượng JS truyền tải: Chỉ tải code cần thiết tại các node có tương tác.
  • Thân thiện với SEO: Dễ dàng hơn cho các công cụ tìm kiếm phân tích.

Khi debug kiến trúc này trên máy local, bạn thường cần chạy nhiều dịch vụ cùng lúc (Node, database, cache, v.v.). Sử dụng một môi trường phát triển local như ServBay có thể khởi động nhiều dịch vụ cùng một lúc, giúp bạn tiết kiệm công sức quản lý cổng và các phiên bản phụ thuộc.


4. File-based Routing trở thành "tiêu chuẩn ngành"

Vài năm trước, việc cấu hình router là một "nỗi đau":

  • Import component thủ công, viết các ánh xạ đường dẫn.
  • Kết hợp với các quy tắc nested routing phức tạp.

File-based routing do Next.js khởi xướng đã thay đổi tất cả—cấu trúc thư mục trực tiếp ánh xạ thành đường dẫn router, giảm thiểu việc cấu hình lặp đi lặp lại.

Hiện tại, SvelteKit, Nuxt, Astro, Remix, v.v., gần như tất cả đều đã áp dụng cách này.

Ưu điểm rất rõ ràng: Ước lệ hơn cấu hình (convention over configuration), giảm khả năng xảy ra lỗi, và làm cho cấu trúc thư mục trở thành tài liệu khi làm việc nhóm.


17562567282733300784105797645359.png

5. Sự hội tụ của các chiến lược tối ưu hóa hiệu năng

Dù bạn dùng framework nào, các phương pháp tối ưu hóa phổ biến cũng đã gần như giống hệt nhau:

  • Code Splitting: Chỉ đóng gói các module cần thiết cho trang hiện tại.
  • Lazy Loading: Trì hoãn việc tải các component không hiển thị ngay lập tức.
  • Tree Shaking: Loại bỏ code không được tham chiếu.
  • Tối ưu hóa hình ảnh: Tự động tạo nhiều kích thước, lazy load.

Xu hướng này giúp lập trình viên gần như không cần phải học lại các phương pháp tối ưu hóa hiệu năng khi chuyển đổi framework.


6. Cuộc chạy đua vũ trang về trải nghiệm lập trình viên (DX)

Một điểm hội tụ khác giữa các framework là trải nghiệm lập trình viên (DX):

  • Hot Module Replacement (HMR): Lưu là làm mới, tăng hiệu suất phát triển gấp bội.
  • TypeScript là công dân hạng nhất: Giảm lỗi kiểu dữ liệu, tăng khả năng bảo trì.
  • Công cụ CLI: Thống nhất quy trình khởi tạo, build, và publish dự án.

Trong mô hình phát triển này, sự ổn định của môi trường local ảnh hưởng trực tiếp đến DX. Sử dụng một nền tảng như ServBay có thể giúp bạn dựng các dịch vụ Node, PHP, database chỉ bằng một cú nhấp chuột, làm cho việc phát triển full-stack đa ngôn ngữ trở nên mượt mà hơn.


7. Cuộc chiến Compiler và xu hướng tương lai

Năm 2024, React ra mắt React Compiler, với mục tiêu giảm thiểu việc render và thực thi không cần thiết ở giai đoạn biên dịch. Runes API của Svelte 5 thì trực tiếp triển khai tính phản ứng dựa trên Signal.

Có thể thấy trước, trong tương lai compiler sẽ trở thành một tiêu điểm cạnh tranh mới của các framework:

  • Tự động tối ưu hóa hiệu năng.
  • Tạo ra code với mức độ chi tiết cao hơn, giảm chi phí runtime.
  • Xuất ra nhiều mục tiêu: cùng một code có thể xuất ra phiên bản Web, Native, thậm chí là WASM.

Tại sao các framework lại hội tụ?

  1. Nút thắt hiệu năng buộc phải hội tụ: Tất cả các framework đều phải đối mặt với những giới hạn trình duyệt và độ trễ mạng như nhau.
  2. Chi phí chuyển đổi của lập trình viên cao: Giảm gánh nặng tư duy có thể mở rộng cộng đồng người dùng.
  3. Các tính năng xuất sắc dễ dàng được học hỏi: Giao lưu cộng đồng đã đẩy nhanh quá trình "chép bài" lẫn nhau.
  4. Sự thống nhất của chuỗi công cụ: Vite, ESBuild, Rollup, v.v., đã làm cho tầng build phía dưới trở nên tương đồng.

Gợi ý cho lập trình viên

  • Khái niệm quan trọng hơn cú pháp: Hiểu về tính phản ứng, component, SSR có giá trị hơn là nhớ thuộc lòng API.
  • Theo kịp chuỗi công cụ: Nắm vững các công cụ xuyên framework như Vite, TS, ESLint.
  • Chú ý đến các mô hình chung: Các xu hướng như Signal, file-based routing, partial hydration sẽ tồn tại lâu dài.
  • Đừng bỏ qua việc quản lý môi trường: Một môi trường đa dịch vụ local có thể tái sử dụng (như ServBay) sẽ giảm đáng kể chi phí khi chuyển đổi dự án.

Tổng kết

Các JS framework hiện đại đang dần hội tụ ở các hướng sau:

  • Mô hình phản ứng kiểu Signal.
  • Kiến trúc component.
  • Render ưu tiên server.
  • File-based routing.
  • Chiến lược tối ưu hóa hiệu năng.
  • Trải nghiệm lập trình viên nhất quán.

Điều này có nghĩa là rào cản học tập khi chuyển đổi framework của lập trình viên sẽ ngày càng thấp. Sự đổi mới tiếp theo có thể là gì? Có lẽ là sự phổ biến của trạng thái có thể phục hồi (Resumability), hoặc sự đổ bộ toàn diện của tối ưu hóa tự động bằng compiler.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Thủ thuật nhỏ để căn chỉnh image với object-fit

Chào các bạn,. Có lẽ trong hành trình code của các bạn thì không ít lần gặp vấn đề méo ảnh do fix cứng cả width, height của ảnh nhỉ? Hoặc kể cả khi bạn set value cho 1 thuộc tính weigth hoặc height còn thuộc tính còn lại để auto thì nhiều lúc ảnh cũng không được hiển thị toàn vẹn cho lắm.

0 0 65

- vừa được xem lúc

Tìm hiểu về CSS framework - Bulma

Mở đầu:. Mấy bữa nay đang lướt web thấy có giới thiệu framework bulma này, được mọi người giới thiệu gọn nhẹ và dễ sử dụng, nên mình mới tìm hiểu thử và hôm nay xin viết 1 bài viết giới thiệu sơ qua với các bạn.

0 0 48

- vừa được xem lúc

Một số mẹo vặt "hay ho" của ES6 có thể bạn chưa biết - Phần 4

Xin chào, ở 3 bài trước của series "Một số mẹo vặt "hay ho" của ES6", mình đã chia sẻ 1 số tips/tricks nhỏ với ES6, hy vọng ít nhiều nó sẽ có ích với các bạn khi áp dụng vào thực tế. Hôm nay, xin mời các bạn theo dõi phần 4 của series này.

0 0 62

- vừa được xem lúc

Tìm hiểu về Jest Mocks Test phía frontend

Giới thiệu. Chắc hẳn không ai phủ nhận rằng UnitTest là 1 phần quan trọng trong giai đoạn phát triển phần mềm, đảm bảo cho code được coverage tránh các bug không mong muốn.

0 0 52

- vừa được xem lúc

Convert từ SVG sang Icon Font như thế nào?

Chào các bạn. Như câu hỏi trên title của bài viết, hôm nay mình sẽ hướng dẫn các bạn cách convert 1 file svg 1 cách khá đơn giản và vô cùng tiện lợi cho các bạn. https://icomoon.io/app/#/select.

0 0 72

- vừa được xem lúc

Một vài thủ thuật làm việc với các dạng layout - Phần 4

. Chào mọi người, cũng đã lâu rồi mình không thấy nhau. Để tiếp tục với series's về các dạng layout hôm nay mình sẽ chia sẻ thêm một trick thú vị nữa về step layout.

0 0 55