Phạm Văn Thư
Website và thương mại · Nội dung có hỗ trợ AI

Svelte: trình biên dịch giao diện web và đề xuất cho chuỗi nhà thuốc

Đăng ngày 12/10/2026

Mục lục bài nghiên cứu
Hình đại diện Svelte — website và thương mại điện tử mã nguồn mở

Svelte trong một trang: trình biên dịch giao diện và những lúc nó đáng chọn

Svelte là một dự án mã nguồn mở về giao diện web, nhưng cách tự giới thiệu của README khác với nhiều thư viện cùng nhóm: đây là một compiler (trình biên dịch) nhận các component khai báo rồi chuyển thành JavaScript cập nhật DOM một cách có chọn lọc [1]. Nói gọn, phần việc nặng được đẩy về giai đoạn build, còn trình duyệt chạy mã đã sinh ra. Bài viết này đọc tài liệu ở một commit cố định để trả lời câu hỏi thực tế: một doanh nghiệp Việt Nam có nên đưa Svelte vào dự án giao diện của mình hay không.

Khuyến nghị ngắn của bài là cân nhắc Svelte khi đội phát triển cần xây giao diện tương tác nhiều trạng thái, muốn cú pháp gần HTML và JavaScript thông thường, đồng thời chấp nhận bước build bằng Vite hoặc SvelteKit. Tài liệu bắt đầu nhanh khuyên dùng SvelteKit, khung ứng dụng chính thức của nhóm Svelte, và nêu cách dùng Svelte trực tiếp với Vite như một phương án thay thế [3].

Phần còn lại của bài đi từ kiến trúc, dòng dữ liệu và giấy phép đến một tình huống giả định cho chuỗi nhà thuốc, rồi kết thúc bằng kế hoạch thử nghiệm có tiêu chí dừng.

Vì sao giao diện web cần một bước biên dịch riêng

Một giao diện web hiện đại phải giữ đồng bộ ba thứ: dữ liệu trong bộ nhớ, cây DOM đang hiển thị và thao tác của người dùng. Khi lập trình viên tự viết từng lệnh cập nhật DOM, lỗi thường nằm ở chỗ quên cập nhật một phần giao diện sau khi dữ liệu đổi. Các thư viện giao diện ra đời để nhận trách nhiệm đó, mỗi thư viện chọn một chiến lược khác nhau.

Svelte chọn chiến lược biên dịch. README mô tả nó là trình biên dịch biến component khai báo thành JavaScript hiệu quả, cập nhật DOM một cách chính xác thay vì dựng lại toàn bộ [1]. Hệ quả thiết kế đáng chú ý là ngôn ngữ của Svelte có thể có cú pháp riêng mà trình duyệt không hiểu trực tiếp. Tài liệu về rune cho biết các ký hiệu có tiền tố dấu đô la được dùng để điều khiển compiler, và có thể xem như từ khóa của một ngôn ngữ [5].

Với doanh nghiệp, điểm cần hỏi không phải là chiến lược nào hay hơn về lý thuyết, mà là bài toán của mình có hưởng lợi hay không. Một màn hình quầy bán hàng chạy trên máy tính bảng cấu hình thấp, một trang tra cứu mà nhân viên mở hàng trăm lần mỗi ngày hoặc một bảng điều khiển có nhiều ô dữ liệu thay đổi liên tục là những ứng viên hợp lý để thử.

Từ tệp .svelte đến JavaScript: ba vùng trong một component

Đơn vị cơ bản của ứng dụng Svelte là component viết trong tệp .svelte, dùng một tập mở rộng của HTML. Tài liệu nêu rằng một tệp có tối đa ba vùng là script, style và phần markup, và cả ba đều tùy chọn [4]. Điều này cho phép một component rất nhỏ chỉ gồm vài dòng HTML, hoặc một component đầy đủ có logic, giao diện và kiểu dáng đi cùng nhau.

Vùng script chứa JavaScript, hoặc TypeScript khi thêm thuộc tính lang bằng ts. Mã trong vùng này chạy khi một thể hiện component được tạo, và biến khai báo ở cấp cao nhất có thể dùng trong markup [4]. Ngoài ra có thẻ script với thuộc tính module, chạy một lần khi module được nạp lần đầu thay vì mỗi thể hiện, và không cho phép export default vì mặc định xuất ra chính là component [4]. Một ví dụ trong tài liệu dùng nó để đếm số lần component được tạo.

Về cách đóng gói, tài liệu bắt đầu nhanh trình bày hai đường. Đường được khuyên dùng là SvelteKit, được mô tả là khung ứng dụng chính thức, chạy trên Vite. Đường còn lại là dùng Svelte với Vite qua vite-plugin-svelte; lệnh build sinh ra tệp HTML, JS và CSS trong thư mục dist, và trong hầu hết trường hợp cần chọn thêm một thư viện định tuyến [3]. Bài viết này chỉ khảo sát kho mã của chính Svelte; SvelteKit được nhắc trong tài liệu nhưng nằm ngoài phạm vi đã đọc.

Dòng phản ứng: một thay đổi trạng thái đi tới màn hình như thế nào

Muốn hiểu Svelte cho đúng, cần theo dõi đường đi của một giá trị. Trong Svelte 5, trạng thái phản ứng được khai báo bằng rune state. Tài liệu viết rằng khi dùng rune này, giao diện sẽ phản ứng khi giá trị đổi, và không có API riêng để tương tác: biến đếm chỉ là một con số, cập nhật như mọi biến khác [6]. Ví dụ chính thức là một nút bấm tăng biến đếm và hiển thị lại số lần bấm.

Với mảng và đối tượng đơn giản, kết quả là một proxy phản ứng sâu. Việc đọc hoặc ghi thuộc tính, kể cả qua phương thức mảng như push, kích hoạt cập nhật theo từng phần phụ thuộc. Đối tượng mới đẩy vào mảng cũng được bọc proxy [6]. Tài liệu cũng cảnh báo hai chỗ dễ nhầm. Thứ nhất, gán tách giá trị ra biến riêng thì các biến đó không còn phản ứng. Thứ hai, thể hiện của lớp không được bọc proxy; muốn phản ứng thì khai báo state ngay trong trường của lớp [6].

Với màn hình quầy, quy tắc thực dụng là giữ dữ liệu gốc ở máy chủ, còn trạng thái giao diện chỉ là bản sao tạm thời mà người dùng đang thao tác. Đây là đề xuất thiết kế của bài.

Những điều tài liệu xác nhận, đối chiếu theo từng tệp nguồn

Phần này liệt kê những gì thực sự được tìm thấy trong các tệp đã đọc, để người đọc phân biệt với phần suy luận ở nơi khác. README xác nhận Svelte là compiler biến component khai báo thành JavaScript cập nhật DOM có chọn lọc, dự án theo giấy phép MIT và được phát triển hoàn toàn nhờ tình nguyện viên, với khoản đóng góp qua Open Collective dùng để bù chi phí như lưu trữ [1].

Tài liệu về tệp .svelte xác nhận ba vùng script, style và markup, hỗ trợ TypeScript bằng thuộc tính lang, thẻ module chạy một lần, và CSS có phạm vi theo component [4]. Tài liệu rune xác nhận rune là cú pháp của ngôn ngữ chứ không phải hàm thông thường [5]. Tài liệu state xác nhận proxy phản ứng sâu, state trong trường của lớp, state.raw, state.snapshot và các lớp phản ứng dựng sẵn [6].

Ai hợp với Svelte, ai nên chờ

Nhóm phù hợp nhất là các đội nhỏ và vừa viết giao diện tương tác bằng JavaScript hoặc TypeScript, muốn mỗi component gói gọn cả logic, markup và kiểu dáng trong một tệp [4]. Cú pháp gần HTML cũng giúp người từng làm giao diện web truyền thống đọc được mã nhanh hơn, dù việc học rune và mô hình phản ứng vẫn cần thời gian riêng.

Đội đang cần xây công cụ nội bộ như màn hình quầy, bảng điều phối, trang tra cứu hay biểu mẫu nhiều bước cũng là đối tượng hợp lý. Họ thường tự quyết định công nghệ mà không bị ràng buộc bởi một hệ sinh thái lớn có sẵn. Với nhóm này, thử Svelte trên một màn hình độc lập có chi phí rủi ro thấp và dễ dừng nếu không đạt tiêu chí.

Một cách kiểm tra nhanh trước khi quyết định là cho hai lập trình viên dựng cùng một màn hình mẫu trong vài ngày và so sánh cảm nhận của họ về độ dễ đọc của mã.

Đề xuất tình huống: màn hình hẹn lấy thuốc cho một chuỗi nhà thuốc

Đây là tình huống giả định để minh họa, không phải ca triển khai đã xảy ra. Hãy hình dung một chuỗi nhà thuốc khoảng vài chục điểm bán tại các thành phố Việt Nam. Khách đặt trước qua điện thoại hoặc ứng dụng nhắn tin, nhân viên quầy cần thấy nhanh đơn nào đang chờ chuẩn bị, đơn nào đã sẵn sàng và đơn nào quá giờ hẹn. Hệ thống quản lý bán hàng và tồn kho hiện có vẫn giữ vai trò nguồn dữ liệu chính.

Đề xuất là xây một ứng dụng giao diện riêng bằng Svelte chạy trên máy tính bảng đặt ở quầy. Ứng dụng chỉ gọi vào một API nội bộ để đọc danh sách đơn hẹn và cập nhật trạng thái chuẩn bị. Mỗi thẻ đơn là một component nhỏ; trạng thái bộ lọc, ô tìm kiếm và danh sách đơn nằm trong rune state, nên khi nhân viên đổi trạng thái một đơn thì chỉ phần giao diện liên quan được cập nhật [6]. Logic sắp xếp theo giờ hẹn có thể tách vào tệp .svelte.ts để kiểm thử riêng bằng Vitest [5][7].

Vì dữ liệu sức khỏe là nhóm nhạy cảm, thiết kế nên hiển thị tối thiểu: mã đơn, tên rút gọn và thời gian hẹn, không hiển thị danh mục thuốc kê đơn trên màn hình hướng ra khách. Việc xử lý đơn thuốc, kiểm tra tồn kho và các quy định ngành dược phải tuân theo quy trình dược sĩ và pháp luật hiện hành; Svelte không cung cấp bất kỳ kiểm soát nào cho phần này, và bài viết không đưa ra nhận định pháp lý.

Build, kiểm thử và phát hành màn hình quầy

Về vận hành, ứng dụng Svelte trước hết là sản phẩm của một chuỗi build. Nếu dùng Svelte với Vite, lệnh build sinh các tệp HTML, JS và CSS trong thư mục dist, và các tệp này có thể được phục vụ như tài nguyên tĩnh [3]. Với SvelteKit, cách đóng gói và phục vụ phụ thuộc vào bộ điều hợp triển khai mà bài này chưa đọc, nên đội cần đọc tài liệu SvelteKit riêng trước khi cam kết kiến trúc máy chủ.

Chuỗi kiểm thử nên có ba lớp, bám theo tài liệu. Lớp đơn vị cho logic trong tệp .svelte.js dùng Vitest. Lớp component dựng thành phần trong jsdom hoặc trình duyệt thật, có thể dùng Testing Library để tránh kiểm tra quá chi tiết vào cấu trúc DOM dễ đổi. Lớp đầu cuối dùng Playwright mô phỏng người dùng qua DOM, không phụ thuộc Svelte [7]. Tài liệu còn khuyên cân nhắc trước khi viết kiểm thử component, nếu thật ra logic bên trong mới cần kiểm thử thì nên tách ra [7].

Tóm lại, vận hành Svelte là vận hành một chuỗi build kèm kiểm thử, không phải vận hành một máy chủ riêng của Svelte; phần máy chủ phụ thuộc vào khung bao quanh bạn chọn.

Bảo mật và quyền riêng tư của một ứng dụng giao diện

Svelte là thư viện giao diện, vì vậy phần lớn kiểm soát bảo mật nằm ở nơi khác. Các tệp đã đọc không có tài liệu mô tả mô hình mối đe dọa hay chính sách bảo mật của dự án; README chỉ hướng dẫn đóng góp và hỗ trợ cộng đồng [1]. Do đó bài không khẳng định Svelte an toàn hay không an toàn, mà chỉ nêu các điểm cần tự kiểm tra.

Điểm đầu tiên là cơ chế xác thực và phân quyền ở API phía sau. Ứng dụng giao diện chạy trong trình duyệt của người dùng, nên mọi quy tắc quyền truy cập phải được máy chủ thực thi; việc ẩn một nút trên màn hình không phải là kiểm soát truy cập. Điểm thứ hai là cách hiển thị nội dung do người dùng nhập. Danh mục tài liệu có một mục về chèn HTML thô trong cú pháp mẫu; vì chưa đọc nội dung nên bài chỉ khuyến nghị rà soát mọi chỗ dùng cơ chế này trước khi đưa vào sản xuất.

Điểm thứ ba là dữ liệu cá nhân. Trong tình huống chuỗi nhà thuốc, thông tin khách hàng và đơn hàng cần được giới hạn khi hiển thị, không lưu lâu trong bộ nhớ trình duyệt và không ghi vào nhật ký lỗi gửi ra ngoài. Cần tham vấn bộ phận pháp lý về quy định bảo vệ dữ liệu cá nhân hiện hành.

Giấy phép MIT và những gì nó không bao phủ

Tệp LICENSE.md tại commit khảo sát là giấy phép MIT, ghi bản quyền của những người đóng góp Svelte từ năm 2016 đến 2025 [2]. Văn bản cho phép sử dụng, sao chép, sửa đổi, hợp nhất, xuất bản, phân phối, cấp phép lại và bán bản sao phần mềm, với điều kiện giữ nguyên thông báo bản quyền và thông báo cấp phép trong mọi bản sao hoặc phần đáng kể của phần mềm [2]. Phần mềm được cung cấp nguyên trạng, không bảo hành [2]. README cũng gọi dự án là mã nguồn mở theo MIT [1].

Bài viết không dựa vào trường giấy phép của API GitHub để kết luận, mà đã đọc văn bản. Tuy nhiên chỉ một tệp giấy phép ở thư mục gốc được đọc; kho không có tệp giấy phép bổ sung nào được thu thập trong dữ liệu khảo sát, và bài không rà từng thư mục con hay từng gói phụ thuộc. Vì vậy kết luận chỉ áp dụng cho mã nguồn ở commit này, không suy ra cho toàn bộ hệ sinh thái.

Ranh giới cần nhớ: giấy phép này không bao phủ SvelteKit và các gói khác nếu chúng nằm ở kho riêng, không bao phủ plugin cộng đồng, thư viện component bên thứ ba, phông chữ hay hình ảnh mà ứng dụng của bạn dùng, và không bao phủ dịch vụ lưu trữ hoặc công cụ build. Mỗi thành phần có giấy phép riêng cần được kiểm kê.

Các tệp đã đọc không có ghi chú về thỏa thuận cấp quyền cho người đóng góp hay chính sách nhãn hiệu, và cũng không nêu phiên bản thương mại hay tính năng trả phí tách riêng; README chỉ nói về việc ủng hộ qua Open Collective [1].

Chi phí và nguồn lực: tính bằng người, thiết bị và thời gian vận hành

Svelte được phát hành miễn phí theo MIT [2], nhưng tổng chi phí sở hữu không bằng không. Bài không đưa ra giá tiền, vì chưa có nguồn nào để trích dẫn; thay vào đó là danh mục loại nguồn lực cần dự trù.

Về con người, cần ít nhất một lập trình viên giao diện có kinh nghiệm JavaScript hoặc TypeScript và hiểu mô hình phản ứng của Svelte 5. Giai đoạn đầu cần thời gian học rune và quy ước tổ chức mã. Cần thêm một người phụ trách kiểm thử và một người phụ trách API phía sau, có thể kiêm nhiệm trong đội nhỏ. Với tình huống chuỗi nhà thuốc, cần có đại diện nghiệp vụ là dược sĩ hoặc quản lý cửa hàng tham gia đánh giá màn hình.

Về thiết bị, một nhóm máy tính bảng hoặc máy tính quầy đại diện cho các cấu hình thực tế, từ cũ đến mới, để kiểm tra trải nghiệm. Tài liệu hỗ trợ trình duyệt là điểm tham chiếu để chọn thiết bị thử [8]. Về hạ tầng, ít nhất một máy chủ hoặc dịch vụ lưu trữ tĩnh cho tệp build, cộng với môi trường tích hợp liên tục chạy bộ kiểm thử theo gợi ý trong tài liệu [7].

So sánh ở cấp độ cách tiếp cận

Cách hữu ích để so sánh là hỏi mỗi phương án đặt công việc ở đâu. Svelte đặt phần lớn công việc suy luận về cập nhật giao diện vào lúc biên dịch [1]. Các thư viện giao diện phổ biến khác như React hay Vue được biết đến với mô hình khác, trong đó thư viện chạy cùng ứng dụng; bài viết không khảo sát chúng nên không so sánh hiệu năng hay kích thước. Quyết định nên dựa trên thử nghiệm với bài toán thật.

Phương án thứ hai là dùng HTML sinh ở máy chủ, bổ sung bằng JavaScript nhẹ như HTMX hay Alpine. Cách này giảm độ phức tạp chuỗi build và hợp với trang ít tương tác, nhưng với màn hình có nhiều trạng thái cục bộ, bạn tự gánh việc đồng bộ. Svelte đặt trạng thái và giao diện vào cùng một mô hình khai báo [6].

Phương án thứ ba là ứng dụng đa nền tảng hoặc ứng dụng gốc cho thiết bị di động. Nó đáng xét nếu cần truy cập phần cứng hay chạy ngoại tuyến sâu, nhưng chi phí phát hành qua cửa hàng ứng dụng và duy trì nhiều nền tảng cao hơn. Tài liệu Svelte đã đọc không trình bày hướng này.

Hạn chế và những điều kiện không nên dùng

Hạn chế đầu tiên thuộc về bằng chứng của bài: đây là nghiên cứu tài liệu tại một commit, không có thử nghiệm chạy thật, không có đo hiệu năng, và README không cung cấp số liệu so sánh [1].

Hạn chế thứ hai là độ phủ của nguồn. Tôi chỉ có thể nói về các tệp đã đọc. Nhiều mảng như truyền dữ liệu bất đồng bộ, hoạt ảnh, hiển thị phía máy chủ, hydrat hóa, định tuyến và hệ sinh thái thư viện thuộc các tài liệu hoặc kho khác chưa được xem xét. Một số tính năng mới cũng có thể còn thay đổi giữa các bản phát hành, và tài liệu có những chỗ còn ghi chú việc cần viết thêm, chẳng hạn một phần mô tả hành vi của export được đánh dấu là chưa hoàn thiện trong chính tệp .svelte [4].

Không nên chọn Svelte khi: ứng dụng chỉ là trang tĩnh; đội không có người thạo JavaScript hoặc không thể duy trì chuỗi build; tổ chức yêu cầu một nhà cung cấp thương mại chịu trách nhiệm hỗ trợ có hợp đồng; hoặc bạn cần hỗ trợ trình duyệt vượt ngoài bảng tối thiểu của dự án [8]. Trong các trường hợp đó, một phương án đơn giản hơn hoặc có hỗ trợ thương mại thường phù hợp hơn.

Kế hoạch thử nghiệm sáu tuần cho màn hình hẹn lấy thuốc

Kế hoạch dưới đây là đề xuất, các ngưỡng cần được điều chỉnh theo thực tế. Giai đoạn một, tuần một và hai: dựng bản mẫu một màn hình danh sách đơn với dữ liệu giả, không dùng dữ liệu khách thật. Chọn Svelte kèm Vite hoặc SvelteKit theo khuyến nghị tài liệu [3]. Thiết lập Vitest cho logic sắp xếp và lọc, và một bộ kiểm thử đầu cuối cho luồng đổi trạng thái đơn [7]. Tiêu chí qua giai đoạn: bộ kiểm thử chạy ổn định trên máy tích hợp liên tục, và đội ghi lại được những khó khăn khi học rune.

Giai đoạn hai, tuần ba và bốn: nối với API nội bộ ở môi trường thử, chạy trên ít nhất ba loại thiết bị quầy đại diện, đối chiếu với bảng trình duyệt tối thiểu [8]. Đo bằng công cụ của doanh nghiệp: thời gian từ lúc mở ứng dụng đến lúc thấy danh sách, thời gian cập nhật trạng thái hiển thị, và số lỗi giao diện ghi nhận. Ngưỡng đặt ra do doanh nghiệp quyết định trước khi đo, không đặt sau khi xem kết quả.

Tiêu chí dừng: nếu không đạt ngưỡng đã định về độ ổn định, hoặc đội đánh giá chi phí bảo trì vượt khả năng, ngừng và giữ lại phần logic đã tách vì nó có thể dùng lại. Tiêu chí tiếp tục: đạt ngưỡng ổn định, kiểm thử tự động bao phủ các luồng chính, và có người chịu trách nhiệm nâng cấp phiên bản.

Kết luận

Svelte đáng được thử khi bài toán là giao diện tương tác nhiều trạng thái và đội có thể chấp nhận chuỗi build. Điểm mạnh trong tài liệu nằm ở mô hình component gọn, compiler điều khiển bằng rune và bộ hướng dẫn kiểm thử rõ ràng [4][5][6][7]. Đây là những điều đọc được, chưa phải kết quả đã chạy.

Điều chưa biết cũng rõ ràng: hiệu năng thực tế trên thiết bị của bạn, chi phí chuyển đổi, độ trưởng thành của hệ sinh thái thư viện cần dùng và chất lượng định tuyến hay hiển thị phía máy chủ trong khung bao quanh. Do đó khuyến nghị là thử trên một màn hình độc lập với tiêu chí đo được, thay vì chuyển cả sản phẩm.

Với tổ chức muốn dựng hệ thống tri thức hoặc trang nghiên cứu riêng, chẳng hạn một kho bài nghiên cứu như phamvanthu.com, Svelte có thể là lớp trình bày cho trang tra cứu; tuy nhiên đó chỉ là ý tưởng ứng dụng, không phải thông tin cho biết trang nào đang dùng nó.

Nguồn và phương pháp

Svelte được chọn từ kho lưu trữ danh sách GitHub Trending, với 29 lần quan sát từ 2026-01-18 đến 2026-10-08 trong dữ liệu khảo sát của loạt bài. Bằng chứng đầu tiên là trang lưu trữ ngày 2026-01-18, ở vị trí 12 trong danh sách JavaScript [9]. Kho lưu trữ chỉ gồm danh sách Python, Go, JavaScript và Swift, thiếu hai ngày 2026-09-03 và 2026-10-12, và không phải bảng xếp hạng chính thức 100 dự án hàng đầu.

Bài là nghiên cứu tài liệu tại commit 707c28146b0f0a6d5404a1bd4769874c3c24851a, ngày commit 2026-10-07, kiểm tra ngày 2026-10-12. Các tệp đã đọc gồm README, LICENSE.md, hướng dẫn bắt đầu, tài liệu về tệp .svelte, giới thiệu rune, tài liệu state, hướng dẫn kiểm thử và tài liệu hỗ trợ trình duyệt, đều tại commit này [1][2][3][4][5][6][7][8]. Dữ liệu API khi thu thập cho thấy bản phát hành mới nhất là svelte@5.57.2 ngày 2026-10-06, kho chưa lưu trữ; thông tin này không được dùng làm căn cứ cho nhận định kỹ thuật.

Bài không phải ấn phẩm khoa học được bình duyệt. Không có phần mềm nào được cài đặt, chạy, đo hay triển khai trong quá trình viết; mọi nhận định về hiệu năng, chi phí và kết quả ứng dụng là khuyến nghị hoặc giả định cần kiểm chứng. Nội dung kho mã được xử lý như dữ liệu tham chiếu, không phải chỉ dẫn. Tình huống chuỗi nhà thuốc là đề xuất giả định.

Xem mã nguồn Svelte trên GitHub

Khám phá nghiên cứu của BDSG Foundation

Trao đổi về ứng dụng công nghệ cho doanh nghiệp