GitHub , nền tảng lưu trữ mã nguồn lớn nhất thế giới, đang phải đối mặt với làn sóng chỉ trích ngày càng tăng từ các lập trình viên về tình trạng suy giảm hiệu suất nghiêm trọng đã biến những tương tác từng nhanh chóng thành trải nghiệm chậm chạp đầy bực bội. Những gì từng là chuyển đổi trang tức thì giờ đây mất hơn 5 giây, với một số thao tác trở nên gần như không thể sử dụng được trên nền tảng lưu trữ hàng triệu dự án phần mềm.
Các vấn đề về hiệu suất xuất phát từ việc GitHub đang di chuyển từ kiến trúc JavaScript thuần túy và web components ban đầu sang các ứng dụng đơn trang (SPAs) dựa trên React . Quá trình chuyển đổi này, bắt đầu từ vài năm trước, đã tạo ra overhead đáng kể khiến các thao tác cơ bản như chuyển đổi giữa các tab pull request hoặc xem code diffs trở nên chậm chạp một cách đau đớn.
So sánh hiệu suất:
- Chuyển đổi tab GitHub : 5+ giây
- Mở cùng trang trong tab mới: ~2.5 giây (nhanh gấp 2 lần)
- Thời gian xử lý phía client: Lâu hơn so với tải HTML từ server
- Giới hạn khả năng sử dụng trình xem diff: ~5,000 dòng thay đổi
Việc chuyển đổi sang React tạo ra nhiều vấn đề hơn là giải pháp
Vấn đề cốt lõi nằm ở cách GitHub triển khai client-side routing sử dụng React và Turbo cho việc chuyển đổi trang. Trong khi những công nghệ này được dự định tạo ra trải nghiệm người dùng mượt mà hơn bằng cách tránh tải lại toàn bộ trang, chúng lại đạt được hiệu ứng ngược lại. Phân tích từ cộng đồng cho thấy việc xử lý client-side giờ đây mất nhiều thời gian hơn so với việc đơn giản tải HTML từ server - một thất bại cơ bản của phương pháp SPA .
Sự mỉa mai đặc biệt rõ ràng khi xem xét rằng việc mở các trang GitHub trong tab mới thực sự nhanh gấp đôi so với việc điều hướng thông qua ứng dụng đơn trang. Điều này phá hủy hoàn toàn mục đích của client-side routing, vốn nên cung cấp chuyển đổi tức thì giữa các trang.
Trình xem Diff trở nên không thể sử dụng với các file lớn
Một trong những tính năng bị ảnh hưởng nặng nề nhất là trình xem diff của GitHub , gặp khó khăn với các file chứa hơn vài nghìn dòng thay đổi. Hệ thống cố gắng render số lượng node DOM khổng lồ - đôi khi hơn 100.000 - khiến trình duyệt bị đóng băng trong vài giây. Ngay cả các thao tác đơn giản như thay đổi kích thước developer tools cũng có thể khiến giao diện bị khóa trong hơn 3 giây.
Vấn đề được усугубляется bởi các thực hành rendering không hiệu quả, chẳng hạn như tạo ra hàng nghìn nút ẩn với các biểu tượng SVG inline giống hệt nhau. Những lựa chọn triển khai này tạo ra overhead tính toán không cần thiết mà các trình duyệt hiện đại gặp khó khăn trong việc xử lý hiệu quả.
Các vấn đề kỹ thuật đã xác định:
- Hơn 100.000 DOM node được render trong một số view
- Hàng nghìn nút bấm vô hình với các biểu tượng SVG inline giống hệt nhau
- 14+ API request cho các trang tổng quan file đơn giản
- 5+ GraphQL API request cho danh sách issue
- Trình duyệt bị đóng băng 3 giây khi thay đổi kích thước cửa sổ
![]() |
---|
Phân tích hiệu suất của trình xem diff GitHub làm nổi bật các vấn đề gặp phải khi hiển thị các tệp lớn, như đã thảo luận trong bài viết |
Hỗn loạn điều hướng và các tính năng cơ bản bị hỏng
Ngoài các vấn đề về hiệu suất, việc chuyển đổi sang React của GitHub đã phá hủy các tính năng duyệt web cơ bản mà người dùng đã dựa vào trong nhiều thập kỷ. Nút back của trình duyệt giờ đây hoạt động không thể đoán trước, đôi khi nhảy nhiều bước trong lịch sử hoặc tải các trang bị hỏng không bao giờ hoàn thành việc rendering. Các tính năng như Ctrl+Enter để mở liên kết trong tab mới đã bí ẩn ngừng hoạt động.
Mọi thứ đều trở nên tệ hơn kể từ khi viết lại bằng React . Mọi thứ chậm hơn và giật lag hơn rất nhiều. Và những thứ như 'nút back' liên tục hoạt động kỳ lạ.
Những vấn đề này cũng mở rộng đến các trình duyệt di động, nơi GitHub trở nên hoàn toàn không thể sử dụng trên Safari cho iOS trong khoảng thời gian 9-12 tháng, ngăn người dùng xem mã nguồn hoặc tham gia thảo luận mà không chuyển sang các trình duyệt thay thế.
Các tính năng bị hỏng:
- Điều hướng bằng nút quay lại/tiến tới của trình duyệt
- Ctrl+Enter để mở liên kết trong tab mới
- Tương thích với Safari iOS (thời gian ngừng hoạt động 9-12 tháng)
- Giữ lại vị trí cuộn trong quá trình chuyển đổi trang
- Cập nhật bình luận theo thời gian thực trong các cuộc thảo luận
Nguyên nhân gốc rễ về mặt kỹ thuật
Các vấn đề hiệu suất có nguồn gốc từ sự khác biệt cơ bản trong cách React xử lý quản lý state so với các framework hiện đại khác. Mô hình reactivity đảo ngược của React có nghĩa là toàn bộ component function phục vụ như một reactive callback, yêu cầu các lập trình viên phải explicitly opt out khỏi các thay đổi state thay vì opting in. Phương pháp này trở nên ngày càng có vấn đề ở quy mô lớn, vì nó đòi hỏi tối ưu hóa cẩn thận thông qua các kỹ thuật memoization mà nhiều lập trình viên bỏ qua.
Trong khi đó, các framework như Vue , Svelte và Solid sử dụng signals-based reactivity nhắm mục tiêu các subscriber cụ thể, dẫn đến các cập nhật hiệu quả hơn. Lựa chọn React của GitHub , mặc dù phổ biến cho mục đích tuyển dụng, đã tạo ra một khoản nợ kỹ thuật biểu hiện dưới dạng trải nghiệm người dùng kém.
Cộng đồng tìm kiếm các giải pháp thay thế
Trải nghiệm suy giảm đã thúc đẩy một số lập trình viên tìm kiếm các giải pháp thay thế. Các giải pháp self-hosted như Gitea và Forgejo đang thu hút sự chú ý nhờ tốc độ và độ tin cậy, mặc dù chúng thiếu hiệu ứng mạng lưới và tính đầy đủ tính năng của GitHub . Một số doanh nhân đang xây dựng các giải pháp thay thế giao diện GitHub hứa hẹn hiệu suất tốt hơn trong khi duy trì khả năng tương thích với các API của GitHub .
Tình hình này làm nổi bật một xu hướng rộng lớn hơn trong phát triển web nơi việc theo đuổi các thực hành phát triển hiện đại đôi khi đi với cái giá là trải nghiệm người dùng. Khi GitHub tiếp tục là nền tảng chính cho phát triển mã nguồn mở và hợp tác mã nguồn doanh nghiệp, những vấn đề hiệu suất này ảnh hưởng đến hàng triệu lập trình viên trên toàn thế giới phụ thuộc vào nền tảng này cho công việc hàng ngày của họ.
Đội ngũ kỹ thuật của GitHub thừa nhận các vấn đề hiệu suất và đã thực hiện các nỗ lực kéo dài cả năm giữa các team để giải quyết chúng, mặc dù những cải thiện đáng kể vẫn còn khó nắm bắt. Cho đến khi có những thay đổi đáng kể được thực hiện, các lập trình viên phải tiếp tục điều hướng một nền tảng đã chuyển đổi từ cơ sở hạ tầng đáng tin cậy thành một nút thắt cổ chai ngày càng bực bội trong quy trình làm việc của họ.
Tham khảo: Why is GitHub UI getting so much slower?