TypeScript 7 ra mắt với trình biên dịch dựa trên Go giúp giảm thời gian kiểm tra kiểu xuống chỉ còn 1/10 so với trước đây và cắt giảm mức tiêu thụ bộ nhớ lên đến 1/4, một thay đổi mà lập trình viên sẽ cảm nhận được ngay khi nhấn “save” trong VS Code.

Quyết định viết lại phần lõi của dịch vụ ngôn ngữ bằng Go của Microsoft diễn ra sau nhiều năm nhận được phàn nàn rằng trình kiểm tra tăng dần (incremental checker) của TypeScript có thể bị đình trệ trên các monorepo lớn. Bằng cách chuyển các tác vụ nặng—phân tích cú pháp (parsing) và kiểm tra kiểu (type-checking)—ra khỏi bản triển khai JavaScript lâu đời, đội ngũ phát triển đã mở khóa khả năng xử lý song song ở cấp độ ngôn ngữ và giảm bớt gánh nặng (overhead) của runtime Node.js.

Tại sao việc viết lại này lại quan trọng

Các ứng dụng web hiện đại được xây dựng với các framework như Next.js hoặc Nuxt thường xuyên kéo theo hàng nghìn module. Trong những môi trường đó, thời gian để hiển thị lỗi kiểu đầu tiên có thể chiếm phần lớn chu trình chỉnh sửa-biên dịch-gỡ lỗi (edit-compile-debug loop). Trình biên dịch mới giúp giảm thời gian tìm lỗi đầu tiên trong VS Code từ 17,5 giây xuống dưới 1,3 giây, tốc độ nhanh hơn 11,9 lần chỉ riêng trên trình soạn thảo này. Các bài kiểm tra hiệu năng (benchmark) độc lập từ nhiều dự án khác nhau cũng xác nhận những cải tiến tương tự:

  • VS Code: nhanh hơn 11,9×
  • Sentry: nhanh hơn 8,9×
  • Bluesky: nhanh hơn 8,7×
  • Playwright: nhanh hơn 8,7×
  • Tldraw: nhanh hơn 7,7×

Mức sử dụng bộ nhớ cũng được cải thiện. TypeScript server của VS Code hiện tiêu thụ ít RAM hơn 18%, Bluesky giảm 26% và Tldraw tiết kiệm được 15%.

Những con số này chuyển hóa thành năng suất thực tế: một lập trình viên lưu tệp sau mỗi vài giây giờ đây có thể lặp lại (iterate) nhanh hơn gấp mười lần, giúp giảm đáng kể sự cản trở hàng ngày khi làm việc trên các codebase lớn.

Các tùy chỉnh mới để kiểm soát chi tiết

Trình biên dịch Go giới thiệu một bộ các cờ (flags) dòng lệnh cho phép các đội ngũ điều chỉnh hiệu năng phù hợp với phần cứng và quy trình làm việc của họ:

  • Xử lý song song (--checkers--builders) chạy phân tích cú pháp và kiểm tra kiểu đồng thời, cho phép người dùng cân bằng giữa tốc độ và áp lực bộ nhớ.
  • Chế độ đơn luồng (--singleThreaded) đơn giản hóa việc gỡ lỗi và phù hợp với các môi trường ít tài nguyên.
  • Các worker có thể mở rộng cho phép các worker kiểm tra kiểu được mở rộng độc lập với các worker xây dựng (builder workers), cho phép tạo ra các pipeline xây dựng tùy chỉnh.
  • Chế độ watch được cải tiến thay thế trình quét tệp dựa trên Node cũ bằng một trình theo dõi tệp (file watcher) bằng Go, loại bỏ các lần quét đệ quy tốn kém của các cây node_modules khổng lồ.

Những tùy chọn này mang lại cho các tổ chức lớn khả năng tận dụng thêm hiệu năng từ các pipeline CI mà không cần phải đại tu mã nguồn hiện có.

Rủi ro và những ý kiến trái chiều

Việc viết lại một thành phần cốt lõi bằng một ngôn ngữ khác không phải là không có tranh cãi. Một số lập trình viên lo ngại rằng việc chuyển sang Go có thể gây ra các lỗi mới hoặc sự không tương thích mà bản triển khai JavaScript trưởng thành đã khắc phục được. Thay đổi này cũng thêm một sự phụ thuộc vào runtime Go vào bộ công cụ (toolchain) TypeScript, điều này có thể làm phức tạp các môi trường đang bị ràng buộc chặt chẽ với Node.js. Những người dùng sớm sẽ cần xác nhận rằng các plugin tùy chỉnh và các tiện ích mở rộng language server của họ vẫn hoạt động bình thường mà không có thay đổi.

Những điều cần theo dõi tiếp theo

Microsoft đã đặt trình biên dịch dựa trên Go làm mặc định trong bản phát hành chính thức, nhưng công cụ JavaScript cũ vẫn có sẵn để dự phòng. Việc theo dõi tỷ lệ áp dụng trên các IDE và dịch vụ CI lớn sẽ cho thấy liệu những cải tiến về hiệu năng có vượt qua được những trở ngại khi chuyển đổi hay không. Ngoài ra, phản hồi từ cộng đồng về các cờ mới sẽ định hình cách trình biên dịch phát triển—nếu các lập trình viên thấy các tùy chọn song song khó điều chỉnh, Microsoft có thể sẽ giới thiệu các thiết lập sẵn (presets) ở cấp độ cao hơn.

Điểm mấu chốt: Việc viết lại bằng Go của TypeScript 7 mang lại tốc độ kiểm tra kiểu nhanh hơn gấp mười lần và tiết kiệm bộ nhớ đáng kể, một sự chuyển dịch có thể giúp việc phát triển JavaScript quy mô lớn cảm thấy mượt mà hơn ngay lập tức—miễn là hệ sinh thái thích nghi mượt mà với runtime mới.