Cloudflare và VoidZero phát triển tsrs: Bản chuyển TypeScript sang Rust nhanh gấp 8 lần
Cloudflare và VoidZero đang hợp tác cùng Max Schwenk của Owner.com để xây dựng tsrs, bản chuyển trình biên dịch TypeScript sang Rust, với mục tiêu tăng tốc độ kiểm tra mã nguồn và giảm mạnh mức tiêu thụ bộ nhớ. Dự án được ươm tạo trong hệ sinh thái Oxc, giữ nguyên triết lý phát triển của TypeScript và hướng tới khả năng chạy trong trình duyệt nhờ WebAssembly.

Cloudflare và VoidZero vừa công bố hợp tác cùng Max Schwenk của Owner.com để phát triển tsrs, một bản chuyển trình biên dịch TypeScript sang ngôn ngữ Rust. Công việc này được thực hiện với sự phối hợp chặt chẽ của đội ngũ TypeScript và được ươm tạo trong bộ công cụ trình biên dịch JavaScript Oxc.
Mục tiêu của dự án khá rõ ràng: giúp lập trình viên giảm thời gian chờ đợi khi kiểm tra mã nguồn và dành nhiều thời gian hơn cho việc xây dựng sản phẩm. Việc tăng tốc TypeScript và tối ưu bộ nhớ cũng mở ra khả năng đưa môi trường phát triển đầy đủ đến nhiều nơi hơn, bao gồm cả chạy trực tiếp ngay trong trình duyệt.
Kiến trúc tổng quan của dự án tsrs
Không phải fork, mà là bản chuyển trung thành
Điểm quan trọng cần nhấn mạnh: nhóm phát triển khẳng định không fork TypeScript. Họ cho rằng đội ngũ TypeScript nên tiếp tục nắm toàn quyền quyết định thiết kế và định hướng của ngôn ngữ này.
"Chúng tôi tin rằng đội ngũ TypeScript nên tiếp tục nắm toàn quyền kiểm soát thiết kế và định hướng của ngôn ngữ. Chúng tôi không muốn thay đổi điều đó."
Lý do nằm ở chỗ, có những tính năng mà đội ngũ TypeScript dành nhiều năm để thử nghiệm các phương án và tạo nguyên mẫu trước khi chọn cách triển khai phù hợp. Một bản chuyển sang Rust buộc phải bám sát những quyết định đó, nếu không sẽ dần trở nên lệch lạc và mất tương thích. Vì vậy, tsrs phải bảo toàn ngôn ngữ TypeScript dựa trên đúng bản triển khai gốc.
Hiệu năng ấn tượng trong các thử nghiệm đầu tiên
Kết quả benchmark ban đầu của bản chuyển Rust khá hứa hẹn. Theo công bố, tsrs nhanh hơn tới 8 lần và dùng ít hơn khoảng 70% bộ nhớ so với TypeScript 7.0 khi cấu hình cùng số lượng worker kiểm tra kiểu.
Đáng chú ý là bản thân TypeScript 7.1 beta cũng đã nhanh hơn tới 2,5 lần so với TypeScript 7.0, và một phần các tối ưu đó được đóng góp ngược từ tsrs. Nhóm phát triển kỳ vọng còn tìm ra nhiều cải tiến hơn nữa trong tương lai.
Họ cũng lưu ý rằng nhiều benchmark gần đây của các bản chuyển TypeScript khác nhau đưa ra những con số khác biệt, thường do dùng cấu hình máy mạnh hơn hoặc tùy chọn khác so với mặc định của TypeScript. Để đảm bảo công bằng, các phép đo của tsrs được thực hiện với cùng cấu hình như của đội ngũ TypeScript.
Người dùng có thể trải nghiệm phiên bản thử nghiệm bằng cách cài gói tsrs từ npm:
npm install tsrs
npx tsrs
Kết quả đo hiệu năng của tsrs so với TypeScript
Vì sao chọn Rust thay vì Go?
Một câu hỏi hợp lý được đặt ra: bản chuyển TypeScript sang Go của chính đội ngũ TypeScript đã nhanh hơn khoảng 10 lần và tiết kiệm bộ nhớ hơn nhiều so với bản viết bằng TypeScript, vậy tại sao vẫn cần Rust?
Câu trả lời nằm ở khả năng chạy trên WebAssembly. Câu chuyện Rust kết hợp Wasm vốn đã rất mạnh, một phần nhờ thiết kế ngôn ngữ. Khi biên dịch chương trình Go sang Wasm, bạn phải mang theo cả bộ thu gom rác (garbage collector) của Go. Trong khi đó, mô hình quản lý bộ nhớ của Rust cho phép tương tác bộ nhớ gọn gàng giữa môi trường Wasm khách và máy chủ — đây chính là yếu tố then chốt giúp Rust phù hợp hơn nhiều với Wasm.
Cloudflare Workers đã hỗ trợ Wasm từ lâu, và mới đây còn bổ sung hỗ trợ Rust gốc thông qua mục tiêu Emscripten mới cho wasm-bindgen. Dấu chân bộ nhớ nhỏ giúp các quy trình build và triển khai chạy hiệu quả hơn nhiều, mở ra khả năng vận hành các hệ thống phát triển hoàn chỉnh ở những nơi trước đây không thể.
Điều này đặc biệt ý nghĩa khi kết hợp với các tác nhân AI: giờ đây có thể chạy trọn bộ công cụ phát triển trong môi trường sandbox hoàn toàn trên Cloudflare, hoặc chạy an toàn ngay trên trình duyệt, trên thiết bị nhúng hay ứng dụng IoT.
Minh họa khả năng chạy tsrs trên WebAssembly và trình duyệt
Cách duy trì và đồng bộ với bản gốc
Về kế hoạch bảo trì, nhóm phát triển đang phối hợp với Theo Browne để hợp nhất tsc-rs và tsrs thành một gói duy nhất, hỗ trợ mọi tính năng của TypeScript gồm cả Language Server Protocol (LSP) và content mappers.
Quy trình đồng bộ với bản gốc lấy cảm hứng từ cách Cloudflare duy trì Vinext song hành cùng Next.js. Cụ thể, mỗi sáng, một tác nhân AI sẽ rà soát thay đổi, tải diff và mở issue theo dõi mọi nội dung có thể ảnh hưởng. Mỗi tối, ma trận tương thích được tạo lại bằng cách chạy bộ kiểm thử của Next.js trên Vinext. Khi phát hiện chênh lệch, các tác nhân có thể xác định thay đổi trên cả hai mã nguồn, dựng bản tái hiện, chuyển các bài kiểm thử liên quan và đề xuất bản sửa.
Quy trình này sẽ được áp dụng cho TypeScript, với sự cẩn trọng cao để không tạo ra hành vi lệch khỏi bản gốc. Khi tìm thấy cải tiến hiệu năng, nhóm sẽ cố gắng đóng góp ngược lại mã nguồn TypeScript viết bằng Go để tất cả cùng hưởng lợi.
Nhóm phát triển cũng thừa nhận hiện vẫn còn một số khác biệt so với bản TypeScript gốc, ví dụ thứ tự in chẩn đoán lỗi, và đặt mục tiêu thu hẹp tối đa những khác biệt này trước khi phát hành bản ổn định.
Điều gì tiếp theo?
Cloudflare vốn là ngôi nhà của nhiều công cụ Rust mã nguồn mở và miễn phí đang vận hành hệ sinh thái JavaScript như Vite, Rolldown, Oxlint và Oxfmt. Với hơn 10 triệu lập trình viên xây dựng trên nền tảng của mình, họ đặc biệt quan tâm đến việc làm cho chuỗi công cụ phát triển trở nên nhanh hơn, dễ di chuyển hơn và dễ chạy ở nhiều nơi hơn.
Nhóm phát triển bày tỏ mong muốn thử nghiệm tích hợp tsrs sâu hơn vào hệ thống của mình, chẳng hạn cho các quy tắc lint nhận biết kiểu trong Oxlint. Mục tiêu cuối cùng là duy trì tsrs như một dự án mã nguồn mở lành mạnh, có bảo trì tốt, mà không cản trở chính TypeScript.
Với cộng đồng lập trình viên Việt Nam đang ngày càng tiếp cận nhiều hơn với TypeScript trong các dự án web và ứng dụng, một công cụ nhanh hơn và tiết kiệm bộ nhớ hơn như tsrs có thể giúp rút ngắn đáng kể thời gian chờ khi build và kiểm tra mã, đồng thời mở ra hướng chạy công cụ phát triển trực tiếp trên trình duyệt — điều đặc biệt hữu ích với các nhóm làm việc trên thiết bị cấu hình thấp.

