Node.js cuối cùng đã tham gia cuộc đua hỗ trợ TypeScript một cách tự nhiên, nhưng cộng đồng phát triển đang đặt câu hỏi liệu động thái này có đến quá muộn để tạo ra sự khác biệt hay không. Với phiên bản 23.6.0 cho phép loại bỏ kiểu dữ liệu theo mặc định, Node.js giờ đây có thể chạy mã TypeScript trực tiếp mà không cần transpilation, đánh dấu một sự thay đổi đáng kể cho runtime kỳ cựu này.
Việc triển khai cho phép các nhà phát triển thực thi các tệp TypeScript bằng các lệnh đơn giản, tự động loại bỏ các chú thích kiểu dữ liệu. Đối với cú pháp TypeScript cơ bản, không cần thêm cờ bổ sung nào trong các phiên bản mới nhất. Các tính năng phức tạp hơn như enums và namespaces yêu cầu cờ transform thử nghiệm, nhưng nền tảng hiện đã được thiết lập.
Lộ trình hỗ trợ TypeScript của Node.js:
- v22.6.0: Thử nghiệm loại bỏ kiểu dữ liệu với cờ
--experimental-strip-types
- v22.7.0: Thêm tính năng chuyển đổi cú pháp TypeScript với cờ
--experimental-transform-types
- v23.6.0: Tính năng loại bỏ kiểu dữ liệu được bật mặc định cho cú pháp TypeScript có thể xóa được
Cuộc chiến Runtime nóng lên
Phản ứng của cộng đồng cho thấy mối lo ngại ngày càng tăng về việc Node.js đang tụt lại phía sau so với các lựa chọn thay thế mới hơn. Các nhà phát triển ngày càng so sánh Node.js với các runtime hiện đại như Deno và Bun, những runtime đã cung cấp hỗ trợ TypeScript ngay từ đầu. Cuộc thảo luận làm nổi bật một câu hỏi cơ bản: liệu quy mô hệ sinh thái có còn quan trọng hơn các tính năng hiện đại?
Hiện tại hoàn toàn là về hệ sinh thái. Deno, Bun, bất kỳ runtime nào cũng hiện đại hơn. Thật tuyệt khi họ đang bắt kịp nhưng khi typescript trở thành công dân bản địa trong node, những runtime khác có thể đã giành được vương miện.
Tình cảm này phản ánh sự thất vọng rộng rãi trong ngành về việc Node.js chậm chạp trong việc áp dụng các tính năng thân thiện với nhà phát triển. Trong khi Node.js duy trì lợi thế hệ sinh thái khổng lồ, các đối thủ cạnh tranh cung cấp trải nghiệm tốt hơn ngay từ đầu với các tính năng như hỗ trợ TypeScript tích hợp, API hiện đại và công cụ được tinh giản.
Bối cảnh So sánh Runtime:
- Node.js: Hệ sinh thái lớn nhất, việc áp dụng TypeScript diễn ra từ từ
- Deno: Hỗ trợ TypeScript nguyên bản, API hiện đại, một số vấn đề tương thích
- Bun: Hiệu suất nhanh, TypeScript tích hợp sẵn, hệ sinh thái nhỏ hơn
Mối quan ngại về triển khai kỹ thuật
Cách tiếp cận kỹ thuật cũng đã thu hút sự xem xét kỹ lưỡng từ các nhà phát triển quen thuộc với công cụ TypeScript. Một số người đặt câu hỏi tại sao Node.js xây dựng bộ loại bỏ kiểu dữ liệu riêng thay vì tận dụng các giải pháp hiện có như TypeScript Compiler hoặc SWC trực tiếp. Quyết định này làm dấy lên lo ngại về việc duy trì tính tương thích khi TypeScript phát triển và thêm các cấu trúc ngôn ngữ mới.
Tuy nhiên, việc triển khai có sử dụng SWC bên dưới, điều này sẽ giúp cải thiện hiệu suất và tính tương thích. Cách tiếp cận loại bỏ kiểu dữ liệu có nghĩa là các tính năng TypeScript mới không nên phá vỡ chức năng hiện có, vì hệ thống chỉ đơn giản loại bỏ các chú thích kiểu dữ liệu thay vì phân tích cú pháp phức tạp.
Các tính năng TypeScript được hỗ trợ:
- Loại bỏ kiểu dữ liệu cơ bản: Tham số hàm, kiểu trả về, chú thích biến
- Chuyển đổi nâng cao: Enums, namespaces (yêu cầu cờ thử nghiệm)
- Hạn chế: Một số ràng buộc thử nghiệm được áp dụng (xem tài liệu API Node.js)
Lợi ích thực tế xuất hiện
Bất chấp các cuộc tranh luận, một số nhà phát triển báo cáo lợi ích thực tế ngay lập tức. Sự kết hợp giữa hỗ trợ TypeScript gốc với khả năng kiểm thử được cải thiện của Node.js đang loại bỏ nhu cầu về các pipeline build phức tạp trong môi trường phát triển. Các bài kiểm thử chạy nhanh hơn với ít phụ thuộc hơn, mặc dù các nhà phát triển vẫn cần tuân theo các thực hành cụ thể như chú thích import kiểu dữ liệu và sử dụng phần mở rộng tệp.
Tính năng này đại diện cho nỗ lực của Node.js trong việc hiện đại hóa trong khi duy trì tính tương thích ngược. Liệu chiến lược này có thể cạnh tranh với các runtime hiện đại được xây dựng có mục đích hay không vẫn là một câu hỏi mở khi hệ sinh thái JavaScript tiếp tục phát triển nhanh chóng.
Tham khảo: Running TypeScript Natively