Bỏ qua điều hướng

Vue.js là gì? Giới thiệu framework JavaScript xây giao diện web

Vue.js là framework JavaScript tiệm tiến, xây giao diện dựa trên component với hệ thống phản ứng tự động và định dạng Single-File Component.

Tuan Tran Van
15 phút đọc
Mục lục (10 phần)
  1. Vue.js là gì?
  2. Vì sao Vue được gọi là framework tiệm tiến?
  3. Reactivity: vì sao giao diện tự cập nhật khi dữ liệu đổi?
  4. Single-File Component: template, script và style trong một file
  5. Composition API và Options API: chọn cái nào?
  6. Vue chạy ở đâu: từ thẻ script đến SPA, SSR và Nuxt
  7. Vue 3.6 và Vapor Mode: bỏ Virtual DOM ở nơi cần tốc độ
  8. Vue khác React ở điểm nào?
  9. Khi nào nên chọn Vue cho dự án của bạn?
  10. Tài liệu tham khảo

Vue.js là một framework JavaScript dùng để xây dựng giao diện người dùng (UI) dựa trên mô hình lập trình thành phần (component-based).

Framework này dựng trên nền HTML, CSSJavaScript tiêu chuẩn, cung cấp một mô hình lập trình khai báo để bạn phát triển hệ thống web từ đơn giản đến phức tạp mà vẫn giữ được cấu trúc. Mục tiêu của nó là tăng tốc độ phát triển mà không phải đánh đổi tốc độ phản hồi của ứng dụng.

Hai đặc tính định danh Vue về mặt kỹ thuật là render khai báo (Declarative Rendering) và hệ thống phản ứng (Reactivity).

Thay vì can thiệp thủ công vào cấu trúc DOM, bạn mô tả trạng thái mong muốn của giao diện, còn framework lo phần đồng bộ dữ liệu và hiển thị.

Vue vì thế không dừng ở một thư viện UI: nó là một hệ sinh thái mở rộng được theo từng bước, tùy quy mô dự án cần tới đâu.

Vue.js — framework JavaScript xây giao diện web theo hướng tiệm tiến

Vue.js là gì?

Về mặt kiến trúc, Vue hoạt động như một tầng trừu tượng nằm trên các ngôn ngữ web tiêu chuẩn. Nó không thay thế HTML, CSS và JavaScript mà bổ trợ cho chúng bằng một mô hình quản lý trạng thái ứng dụng rõ ràng. Ở mô hình lập trình mệnh lệnh (Imperative Programming), bạn phải chỉ thị từng bước thay đổi DOM. Vue áp dụng render khai báo để bạn chỉ tập trung mô tả kết quả cuối cùng dựa trên trạng thái (state) của dữ liệu.

So sánh lập trình mệnh lệnh tự tay sửa DOM với render khai báo mô tả trạng thái trong Vue

Cơ chế vận hành là một chu trình theo dõi dữ liệu, chạy liên tục suốt lúc ứng dụng hoạt động (runtime). Khi một biến JavaScript đổi giá trị, hệ thống tự xác định những phần giao diện có liên quan, tính ra khác biệt, rồi thực hiện đúng những cập nhật DOM tối thiểu cần thiết. Cách này cắt bỏ phần lớn chi phí tính toán thừa và tránh render lại toàn trang, nhờ đó giữ được độ mượt ngay cả với ứng dụng có mật độ dữ liệu lớn.

Với người làm kỹ thuật, Vue là điểm cân bằng giữa các thư viện nhỏ lẻ và những framework nặng nề. Nó cung cấp đủ công cụ cho phát triển hiện đại: quản lý vòng đời thành phần, xử lý sự kiện và ràng buộc dữ liệu hai chiều. Một ứng dụng Vue tối giản được khởi tạo rồi gắn vào một phần tử HTML như sau:

javascript
import { createApp } from "vue";
 
createApp({
  data() {
    return {
      count: 0,
    };
  },
}).mount("#app");

Vì sao Vue được gọi là framework tiệm tiến?

Triết lý "The Progressive Framework" là thứ giúp Vue đứng được trong nhiều bối cảnh kiến trúc khác nhau. Nhiều giải pháp bắt bạn thay đổi toàn bộ cấu trúc dự án ngay từ đầu; Vue thì được thiết kế để áp dụng dần (incrementally adoptable). Một đội kỹ thuật có thể bắt đầu bằng cách nhúng Vue như một script nhỏ để tăng cường tính năng cho trang HTML tĩnh, thay cho những thư viện cũ như jQuery, mà chưa cần dựng quy trình build nào cả.

Nấc thang áp dụng Vue: từ tăng cường HTML tĩnh đến Web Components, SPA và SSR/SSG

Khi dự án lớn dần, Vue mở rộng sang kiến trúc ứng dụng đơn trang (Single-Page Application — SPA) hoàn chỉnh với các công cụ build hiện đại như Vite. Ở cấp độ này bạn dùng được toàn bộ định dạng Single-File Component, hệ thống quản lý trạng thái và routing chuyên sâu. Tính "tiệm tiến" còn nằm ở chỗ Vue duy trì các thư viện chính thức như Vue RouterPinia nhưng không gộp chúng vào nhân framework, để dự án nhỏ không phải gánh dung lượng bundle mình không dùng.

Vue cũng chạy được trong những kịch bản phức tạp hơn như Server-Side Rendering (SSR) hay Static Site Generation (SSG). Nhờ vậy bạn chọn được mức độ can thiệp của framework đúng với bài toán: từ vài widget tương tác đơn giản đến cả một nền tảng thương mại điện tử quy mô lớn. Điều đáng giá là kiến thức cốt lõi bạn học ở cấp độ thấp nhất vẫn giữ nguyên giá trị khi tiến lên các mô hình triển khai cao hơn.

Reactivity: vì sao giao diện tự cập nhật khi dữ liệu đổi?

Hệ thống phản ứng (Reactivity) trong Vue 3 theo dõi và phản ứng với thay đổi dữ liệu một cách tự động. Vue làm được điều đó bằng cách dùng Proxy của JavaScript để chặn các thao tác đọc và ghi thuộc tính của đối tượng. Khi một giá trị được đọc trong lúc render, Vue chạy quy trình "track", ghi nhận thành phần đang render là một phụ thuộc (dependency) của dữ liệu đó. Khi dữ liệu bị ghi đè, quy trình "trigger" lập tức được gọi để thực thi các hiệu ứng cập nhật giao diện.

Vòng phản ứng của Vue: track thu thập phụ thuộc khi đọc dữ liệu, trigger cập nhật khi dữ liệu đổi

Một chi tiết kỹ thuật đáng nhớ là khác biệt giữa reactive()ref(). reactive() dùng Proxy cho đối tượng, còn ref() dùng cơ chế getter/setter cho các giá trị đơn lẻ thông qua thuộc tính .value. Hệ thống này cho độ chi tiết cao (fine-grained): chỉ những thành phần thực sự tiêu thụ dữ liệu vừa đổi mới phải cập nhật, thay vì quét lại toàn bộ cây thành phần như các framework dựa hẳn vào Virtual DOM — bản sao cây giao diện giữ trong bộ nhớ, đem ra so sánh trước mỗi lần vẽ lại.

Cơ chế này cũng kèm một lưu ý về ràng buộc biến. Gán lại hoặc destructure thuộc tính của một đối tượng reactive ra biến cục bộ có thể làm mất tính phản ứng, vì thao tác đó không còn kích hoạt bẫy get/set trên đối tượng gốc. Sự ngắt kết nối này chỉ ảnh hưởng tới bản thân việc ràng buộc biến: nếu biến đó trỏ tới một giá trị không nguyên thủy, chẳng hạn một object khác, thì sửa trực tiếp thuộc tính bên trong object đó vẫn giữ được tính phản ứng.

Single-File Component: template, script và style trong một file

Định dạng tệp .vue — Single-File Component (SFC) — giải quyết bài toán quản lý mã nguồn trong dự án web hiện đại. Cách chia tách theo loại tệp truyền thống làm logic của một thành phần nằm rải ba nơi; SFC gom template (HTML), script (JavaScript) và style (CSS) của cùng một thành phần về một chỗ. Lựa chọn này dựa trên một điểm đơn giản: các phần của một thành phần UI vốn đã dính chặt với nhau về mặt logic, nên đặt cạnh nhau thì đọc và bảo trì đều trực quan hơn.

Cấu trúc một file .vue với ba khối template, script và style trong cùng một Single-File Component

SFC không chỉ là đóng gói vật lý; nó còn cho phép công cụ build tối ưu sâu hơn. Trình biên dịch của Vue có thể phân tích chéo giữa template và script để nhận ra phần tĩnh của giao diện, rồi loại chúng khỏi chu trình cập nhật lúc chạy. SFC cũng hỗ trợ CSS phạm vi thành phần (scoped CSS), chặn rò rỉ kiểu dáng sang thành phần khác mà bạn không phải dựng những quy ước đặt tên phức tạp kiểu BEM.

SFC còn là môi trường lý tưởng cho TypeScript và các bộ tiền xử lý CSS như SASS hay LESS. Cú pháp <script setup> cắt bớt mã rác (boilerplate) và làm việc khai báo biến phản ứng gọn hẳn. Đây là phương thức được khuyến nghị cho mọi ứng dụng Vue quy mô doanh nghiệp, nhờ hỗ trợ IDE tốt, kiểm tra kiểu mạnh và cơ chế Hot Module Replacement (HMR — sửa mã là thấy đổi ngay, không phải tải lại trang) mượt trong lúc phát triển.

vue
<script setup>
import { ref } from "vue";
const count = ref(0);
const increment = () => count.value++;
</script>
 
<template>
  <div class="counter">
    <button @click="increment">Số lần bấm: {{ count }}</button>
  </div>
</template>
 
<style scoped>
.counter button {
  font-weight: bold;
  padding: 10px 20px;
  color: #42b983;
}
</style>

Composition API và Options API: chọn cái nào?

Vue có hai phong cách lập trình cùng tồn tại trên chung một hệ thống phản ứng bên dưới. Options API dựa trên mô hình instance (mỗi component là một thực thể), nơi mã nguồn được xếp vào các nhóm tùy chọn cố định như data, methodsmounted. Cách này trực quan với người mới hoặc người quen tư duy lập trình hướng đối tượng (OOP), vì nó dựng sẵn những thanh chắn giúp bạn tổ chức mã có kỷ luật mà không phải nghĩ nhiều về cấu trúc.

Options API gom mã theo nhóm tùy chọn, còn Composition API gom mã theo từng mạch logic

Composition API thì khai báo logic qua các hàm và biến phản ứng nhập trực tiếp. Phong cách này sinh ra để giải quyết chuyện tái sử dụng mã và quản lý những thành phần có logic phức tạp. Bạn không còn bị chia theo khối tùy chọn nữa mà nhóm được các đoạn mã theo đúng chức năng thực tế, nên việc tách logic ra tệp riêng (Composable) trở nên rất dễ. Khả năng suy luận kiểu (type inference) của TypeScript ở Composition API cũng vượt hẳn Options API.

Trên thực tế Options API được xây trên chính Composition API, nên khác biệt chỉ nằm ở tầng giao diện lập trình. Lựa chọn giữa hai phong cách thường phụ thuộc quy mô dự án và thói quen của đội:

  • Dùng Options API: khi dự án có độ phức tạp thấp đến trung bình, khi bạn ưu tiên sự đơn giản, hoặc khi không có quy trình build.
  • Dùng Composition API: khi xây ứng dụng quy mô lớn, cần tái sử dụng logic nhiều, muốn tối ưu dung lượng bundle qua tree-shaking (loại bỏ mã không dùng tới), hoặc khi ưu tiên TypeScript.

Vue chạy ở đâu: từ thẻ script đến SPA, SSR và Nuxt

Vue triển khai được ở rất nhiều dạng khác nhau. Ở mức đơn giản nhất, Vue chạy thẳng trên trình duyệt qua một thẻ <script> từ CDN, đủ để biến một trang HTML tĩnh thành trang có tương tác trong vài phút. Cách này rất hiệu quả cho dự án nhỏ, hoặc khi bạn muốn thử nhanh một ý tưởng mà chưa muốn tốn thời gian cấu hình Vite hay webpack.

Với ứng dụng đòi hỏi trải nghiệm cao hơn, Vue thường được triển khai dưới dạng SPA. Ở mô hình này toàn bộ ứng dụng tải một lần, còn các tương tác chuyển trang diễn ra tức thì mà không cần tải lại trình duyệt. Vue kết hợp với Vite cho môi trường phát triển phản hồi rất nhanh, hỗ trợ những tính năng như code-splitting để trình duyệt chỉ tải đúng phần cần thiết, qua đó rút ngắn thời gian tải trang đầu.

Ở quy mô cao hơn nữa, Vue hỗ trợ Server-Side Rendering để xử lý bài toán SEO và hiệu suất trên thiết bị cấu hình thấp. Thay vì để trình duyệt gánh toàn bộ việc render, máy chủ tạo sẵn mã HTML hoàn chỉnh rồi gửi tới người dùng. Nuxt là framework chuyên lo việc này trong hệ sinh thái Vue: nó tự động hóa quy trình, lo phần quản lý route, lấy dữ liệu từ server và cấu hình SEO, để bạn tập trung vào logic nghiệp vụ thay vì hạ tầng.

Vue 3.6 và Vapor Mode: bỏ Virtual DOM ở nơi cần tốc độ

Phiên bản Vue 3.6 — hiện đang ở giai đoạn Release Candidate — đánh dấu một bước tiến đáng kể với Vapor Mode, một chiến lược biên dịch mới lấy cảm hứng từ những framework như Solid. Vapor Mode biên dịch Single-File Component thẳng thành các thao tác DOM hiệu quả, không đi qua tầng Virtual DOM. Điều này bỏ hẳn chi phí runtime của VDOM, giảm đáng kể kích thước bundle cơ bản và tăng tốc xử lý cho những ứng dụng cực kỳ nhạy cảm về hiệu suất.

Đường đi qua tầng Virtual DOM so với đường Vapor Mode biên dịch thẳng thành thao tác DOM

Cùng chu kỳ, Vue 3.6 đại tu nhân @vue/reactivity dựa trên thư viện alien-signals. Đợt refactor này vừa cải thiện tốc độ phản ứng dữ liệu vừa tối ưu bộ nhớ rõ rệt. Hệ thống mới làm việc quản lý các hiệu ứng phản ứng (effect) nhẹ đi, điều này đặc biệt quan trọng ở những ứng dụng phải theo dõi hàng nghìn điểm dữ liệu cùng lúc.

Vapor Mode là tính năng opt-in — mặc định tắt, bạn tự chọn bật cho từng thành phần bằng từ khóa vapor trong tệp SFC. Với ứng dụng thuần Vapor, bạn dùng createVaporApp() để khởi tạo mà không kéo theo runtime của Virtual DOM vào gói sản phẩm cuối. Ở thời điểm hiện tại, Vapor Mode được khuyến nghị cho những trang cần tối ưu hiệu suất rất cao hoặc ứng dụng nhỏ cần dung lượng tải về tối thiểu, chứ chưa phải bản thay thế đại trà cho VDOM.

Vue khác React ở điểm nào?

Khác biệt lớn nhất giữa Vue và React nằm ở mô hình thực thi và cách quản lý vòng đời. Trong React, Hook chạy lại mỗi khi thành phần re-render, nên bạn phải tự quản lý mảng phụ thuộc trong useEffect hay useMemo để tránh lỗi "stale closure" — hàm giữ lại giá trị cũ từ lần render trước. Hàm setup của Composition API thì chỉ chạy đúng một lần lúc thành phần khởi tạo, khiến mã nguồn gần với tư duy JavaScript thuần và loại bỏ hẳn rủi ro closure cũ.

Ba khác biệt giữa Vue và React: setup chạy một lần, thu thập phụ thuộc tự động, tối ưu tự động

Cơ chế cập nhật giao diện của hai bên cũng theo hai triết lý khác nhau. React dựa trên so sánh Virtual DOM diện rộng và mặc định dễ dẫn tới render lại quá mức, nên bạn phải dùng các kỹ thuật memoization (nhớ lại kết quả đã tính) thủ công để tối ưu. Vue tận dụng hệ thống phản ứng lúc chạy để tự thu thập phụ thuộc chính xác đến từng thuộc tính dữ liệu, nhờ đó biết rõ thành phần nào cần cập nhật mà không cần bạn khai báo gì thêm.

Cách xử lý các phép tính tốn kém cũng cho trải nghiệm khác hẳn. Ở React, bạn bọc logic vào useMemo và phải giữ danh sách phụ thuộc luôn chính xác để tránh tính lại vô ích. Ở Vue, thuộc tính computed tự cache và chỉ tính lại khi các phụ thuộc phản ứng thực sự đổi. Khác biệt này giảm đáng kể lượng thứ bạn phải ôm trong đầu, để bạn tập trung vào logic thay vì canh chừng chu kỳ render của framework.

Khi nào nên chọn Vue cho dự án của bạn?

Vue là lựa chọn hợp lý khi đội của bạn cần cân bằng giữa tốc độ ra sản phẩm và hiệu suất vận hành lâu dài. Nhờ khả năng mở rộng tiệm tiến, dự án có thể khởi đầu nhẹ nhàng rồi phức tạp hóa dần theo yêu cầu, thay vì phải trả trước bằng những đợt refactor lớn. Vue cũng đặc biệt hợp khi bạn muốn nâng cấp dần một hệ thống cũ sang kiến trúc hiện đại, vì nhúng được vào từng phần.

Thứ Vue mang lại, xét về kỹ thuật, là sự ổn định và dễ đoán: hệ thống phản ứng tự lo việc cập nhật, còn mô hình component giữ mã nguồn rõ ràng. Dù bạn đang dựng một công cụ nội bộ đơn giản hay một hệ thống SaaS quy mô lớn, Vue đều đủ công cụ để hệ thống chạy ổn định và dễ bảo trì về dài hạn.

Tài liệu tham khảo

Chia sẻ bài viết

X / TwitterFacebookLinkedIn