Các nhà phát triển tranh luận về phương pháp tốt nhất cho giao tiếp an toàn kiểu dữ liệu giữa ứng dụng Rust và TypeScript

Nhóm Cộng đồng BigGo
Các nhà phát triển tranh luận về phương pháp tốt nhất cho giao tiếp an toàn kiểu dữ liệu giữa ứng dụng Rust và TypeScript

Một showcase gần đây về ứng dụng web kết hợp Rust và TypeScript đã khơi mào cuộc thảo luận sôi nổi trong cộng đồng nhà phát triển về các phương pháp tốt nhất để duy trì tính an toàn kiểu dữ liệu giữa các ngôn ngữ lập trình khác nhau. Dự án gốc sử dụng đặc tả OpenAPI để tạo ra các client an toàn kiểu dữ liệu, nhưng các thành viên cộng đồng đã chia sẻ nhiều phương pháp thay thế khác nhau và đặt ra những câu hỏi quan trọng về kiến trúc.

Nhiều công cụ xuất hiện để tạo kiểu dữ liệu đa ngôn ngữ

Cộng đồng phát triển đã xác định được một số công cụ ngoài OpenAPI để tạo định nghĩa TypeScript từ mã Rust. Crate ts-rs đã trở nên phổ biến nhờ khả năng tự động tạo định nghĩa TypeScript có thể được sao chép trực tiếp vào các ứng dụng web. Một lựa chọn khác là typeshare từ 1Password, cung cấp chức năng tương tự mặc dù có một số điểm kỳ quặc. Những công cụ này nhằm giải quyết thách thức cơ bản là giữ cho các định nghĩa kiểu dữ liệu được đồng bộ hóa giữa codebase backend và frontend mà không cần bảo trì thủ công.

Lưu ý: Crate là một package hoặc thư viện Rust có thể được chia sẻ và tái sử dụng trong các dự án khác nhau.

Các Công Cụ Tạo Type Phổ Biến

Công Cụ Ngôn Ngữ Mô Tả
ts-rs Rust → TypeScript Tự động tạo định nghĩa TypeScript
typeshare Rust → TypeScript Giải pháp chia sẻ type của 1Password
FastAPI + Pydantic Python → TypeScript Tạo spec OpenAPI để sinh type
poem-openapi Rust Định nghĩa dịch vụ OpenAPI một cách ergonomic
utoipa-axum Rust Tích hợp OpenAPI cho framework Axum

Tích hợp WebAssembly mở ra những khả năng mới

Một số nhà phát triển đã bày tỏ sự quan tâm đến WebAssembly ( WASM ) như một phương pháp thay thế để kết hợp Rust và TypeScript. Trong khi một số lưu ý rằng tính năng import Rust trực tiếp của Parcel đã bị loại bỏ trong phiên bản 2, những người khác chỉ ra rằng việc tích hợp đầu ra wasm-pack vào các dự án Vite vẫn rất đơn giản. Phương pháp WASM cho phép mã Rust chạy trực tiếp trong trình duyệt, có khả năng loại bỏ nhu cầu về các dịch vụ backend riêng biệt trong một số trường hợp.

Lựa chọn kiến trúc đặt ra câu hỏi về hiệu suất

Thiết lập dual-server thường được sử dụng trong những ứng dụng này đã tạo ra cuộc tranh luận về overhead và độ phức tạp. Trong quá trình phát triển, các dự án thường chạy các server riêng biệt cho frontend và API, nhưng việc triển khai production lại rất khác nhau. Một số nhà phát triển đóng gói cả hai dịch vụ vào một container duy nhất với proxy nội bộ, trong khi những người khác kích hoạt phục vụ file tĩnh trên endpoint API hoặc triển khai chúng như các dịch vụ hoàn toàn độc lập.

Tôi thích không bị gọi vào ban đêm, vì vậy tôi rất ưa thích backend rust. Tôi có kinh nghiệm với backend TS, Python và Rust và các backend Rust hiếm khi gặp lỗi đối với tôi.

Lựa chọn framework ảnh hưởng đến trải nghiệm nhà phát triển

Việc lựa chọn giữa các web framework đã trở thành điểm thảo luận, đặc biệt là giữa Poem và Axum cho backend Rust. Trong khi Axum có độ phổ biến rộng rãi hơn, việc tích hợp OpenAPI của Poem thông qua poem-openapi cung cấp khả năng định nghĩa API ergonomic hơn. Đối với các nhà phát triển ưa thích Axum, crate utoipa-axum cung cấp chức năng OpenAPI tương tự, mặc dù với các pattern cú pháp và workflow khác nhau.

Các Thành Phần Kiến Trúc Dự Án

  • Backend: Rust với framework web Poem
  • Frontend: TypeScript với SvelteKit
  • Hệ Thống Build: Vite cho phát triển và sản xuất
  • Type Safety: Tạo OpenAPI spec và tạo client
  • Phát Triển: Terminal multiplexer Zellij với layout tùy chỉnh

Tính an toàn kiểu dữ liệu đa ngôn ngữ mở rộng ra ngoài Rust

Cuộc trò chuyện đã mở rộng để bao gồm các kết hợp ngôn ngữ khác, với các nhà phát triển Python và TypeScript chia sẻ các giải pháp của riêng họ. FastAPI với Pydantic đã nổi lên như một lựa chọn phổ biến cho backend Python, tự động tạo ra các đặc tả OpenAPI có thể được chuyển đổi thành kiểu TypeScript. Phương pháp này loại bỏ việc xác minh kiểu thủ công bằng cách tạo kiểu frontend trực tiếp từ định nghĩa backend.

Cuộc thảo luận đang diễn ra làm nổi bật cách mà tính an toàn kiểu dữ liệu giữa các ngôn ngữ lập trình khác nhau vẫn là một lĩnh vực đổi mới tích cực, với các công cụ và phương pháp mới tiếp tục xuất hiện khi các nhà phát triển tìm kiếm những cách hiệu quả hơn để xây dựng các ứng dụng web đáng tin cậy.

Tham khảo: Rust + TypeScript Web Application