← LOGBOOK

TypeScript trong một codebase SAPUI5

2025 — 2026 · Kỹ sư frontend

  • SAPUI5
  • TYPESCRIPT
  • NODE

Bối cảnh

Một ứng dụng SAPUI5 nội bộ, đội logistics dùng mỗi ngày. Khoảng bốn mươi controller, sáu năm lịch sử, ba người bảo trì. Mọi màn hình đều viết bằng JavaScript thuần trên hệ module của UI5.

Vấn đề

Lỗi lọt ra production hầu như không bao giờ là lỗi logic. Chúng là lỗi hình dạng dữ liệu: một trường bị đổi tên trên service OData, một đường model không còn phân giải được, một controller đọc thuộc tính mà entity set đã thôi trả về. Không có gì lộ ra cho tới khi ai đó mở đúng màn hình.

Cách giải

Việc chuyển đổi chạy theo từng thư mục, tính năng vẫn phát triển song song. Định nghĩa kiểu được sinh từ metadata của service thay vì viết tay, nhờ vậy hợp đồng OData vẫn là nguồn sự thật duy nhất. Controller chỉ được chuyển khi đang phải sửa vì lý do khác, nên diff của mỗi pull request vẫn đọc được.

Build giữ nguyên bộ tooling UI5 sẵn có. Thêm một bundler thứ hai đồng nghĩa với việc phải nuôi hai đường build suốt thời gian chuyển đổi.

Kết quả

Không có số đo đối chiếu — trước khi chuyển không hề có hệ thống theo dõi lỗi, nên mọi con số trước/sau đều là bịa. Thứ quan sát được: đổi tên trên service giờ làm hỏng bản build thay vì hỏng một màn hình, và ba lỗi hình dạng dữ liệu tìm thấy trong lúc chuyển đổi đều đang sống trên production.

Bài học

Việc sinh kiểu từ metadata của service quan trọng hơn bản thân cuộc chuyển đổi. Interface viết tay sẽ lệch khỏi backend chỉ sau một bản phát hành, mà một kiểu dữ liệu nói dối thì tệ hơn là không có kiểu nào.