Vấn đề tương thích trình duyệt ảnh hưởng đến kỹ thuật SQLite sáng tạo trên GitHub Pages

Nhóm Cộng đồng BigGo
Vấn đề tương thích trình duyệt ảnh hưởng đến kỹ thuật SQLite sáng tạo trên GitHub Pages

Một kỹ thuật thông minh để lưu trữ cơ sở dữ liệu SQLite trên các nền tảng tĩnh như GitHub Pages đã vấp phải một trở ngại đáng kể: các vấn đề tương thích trình duyệt ngăn nhiều người dùng trải nghiệm cách tiếp cận sáng tạo này đối với các trang web tĩnh có sử dụng cơ sở dữ liệu.

Phương pháp này, ban đầu được trình diễn vào năm 2021, biên dịch SQLite sang WebAssembly và triển khai một hệ thống tệp ảo tải về các phần của cơ sở dữ liệu thông qua các yêu cầu HTTP Range. Điều này cho phép truy vấn các tập dữ liệu khổng lồ (lên đến 670MB trong bản demo gốc) trong khi chỉ tải về dữ liệu cụ thể cần thiết cho mỗi truy vấn. Cách tiếp cận này hứa hẹn sẽ loại bỏ các máy chủ backend cho các trang web tĩnh nhiều dữ liệu, nhưng các cuộc thảo luận gần đây trong cộng đồng đã tiết lộ những vấn đề chức năng lan rộng.

Phương pháp kỹ thuật ban đầu:

  • SQLite được biên dịch sang WebAssembly thông qua Emscripten
  • Hệ thống file ảo sử dụng HTTP Range requests
  • Kích thước trang 1 KiB để phân đoạn tối ưu
  • Hệ thống tải trước với kích thước yêu cầu tăng theo cấp số nhân
  • Các thao tác cơ sở dữ liệu chỉ đọc trên các máy chủ tĩnh

Lỗi Yêu cầu Phạm vi trên Firefox

Nhiều người dùng báo cáo gặp phải lỗi mạng khi cố chạy các bản demo SQLite, với người dùng Firefox bị ảnh hưởng đặc biệt. Vấn đề cốt lõi bắt nguồn từ cách Firefox xử lý các yêu cầu HTTP Range đối với nội dung được nén.

Nó sẽ thuyết phục hơn nếu mọi ví dụ, ít nhất là đối với tôi, không trả về [error: NetworkError: A network error occurred.]

Vấn đề liên quan đến việc diễn giải không rõ ràng các đặc tả HTTP xung quanh mã hóa nội dung. Firefox thêm 'identity' vào danh sách các mã hóa được hỗ trợ trong Accept-Headers, trong khi các trình duyệt khác thay thế danh sách bằng 'identity'. Khi GitHub Pages nhận được một yêu cầu phạm vi từ Firefox, nó có thể trả về các phần của tệp nén mà trở nên không thể đọc được đối với công cụ SQLite. Sự suy giảm chức năng này không phải lúc nào cũng tồn tại - một số người dùng lưu ý rằng các bản demo đã hoạt động chính xác trong các phiên bản Firefox trước đó.

Các Vấn Đề Tương Thích Trình Duyệt Chính:

  • Firefox: Lỗi HTTP Range request với nội dung nén (Bug 1874840)
  • Safari: Một số người dùng báo cáo lỗi không nhất quán
  • Chrome/Chromium: Nhìn chung hoạt động chính xác
  • Edge: Nhìn chung hoạt động chính xác

Lo ngại về Độ tin cậy Đa trình duyệt

Các vấn đề tương thích không chỉ dừng lại ở Firefox. Một số người dùng Safari cũng báo cáo lỗi, mặc dù vấn đề có vẻ ít nhất quán hơn trên trình duyệt của Apple. Thách thức cơ bản nằm ở cách các trình duyệt khác nhau diễn giải các đặc tả yêu cầu phạm vi HTTP và cách các nhà cung cấp dịch vụ lưu trữ tĩnh xử lý những yêu cầu này. GitHub Pages, dù xuất sắc cho nội dung tĩnh tiêu chuẩn, có thể không xử lý tối ưu sự kết hợp cụ thể giữa yêu cầu phạm vi và nén mà hệ thống tệp ảo HTTP của SQLite yêu cầu.

Các Cách tiếp cận Thay thế Xuất hiện

Bất chấp những thách thức về tương thích này, khái niệm ban đầu đã truyền cảm hứng cho một số giải pháp thay thế đầy hứa hẹn. DuckDB WASM đã thu hút được sự chú ý như một sự thay thế hiện đại, cung cấp chức năng tương tự với khả năng hỗ trợ trình duyệt tốt hơn. Một nhà phát triển đã chia sẻ kinh nghiệm của họ khi sử dụng DuckDB WASM trên GitHub Pages để hiển thị xu hướng kinh doanh, mặc dù họ lưu ý thời gian tải ban đầu vào khoảng 10 giây cho các tập dữ liệu lớn.

Nhóm phát triển chính thức của SQLite kể từ đó đã bổ sung hỗ trợ WebAssembly vào bản phân phối của họ, viện dẫn các dự án cộng đồng trước đó như nguồn cảm hứng. Một cách tiếp cận khác sử dụng IndexedDB làm backend lưu trữ liên tục, coi cơ sở dữ liệu cục bộ của trình duyệt như các khối đĩa ảo cho các hoạt động của SQLite. Những phát triển này cho thấy ý tưởng cốt lõi vẫn còn giá trị, ngay cả khi triển khai ban đầu phải đối mặt với rào cản tương thích trình duyệt.

Các Công Nghệ Thay Thế:

  • DuckDB WASM: Giải pháp thay thế hiện đại với hỗ trợ trình duyệt tốt hơn
  • Official SQLite WASM: Hiện đã bao gồm hỗ trợ WebAssembly
  • absurd-sql: Sử dụng IndexedDB làm backend lưu trữ
  • sqlite-wasm-http: Bản phân phối SQLite chính thức với hỗ trợ HTTP

Hạn chế Thực tế và Giải pháp Khắc phục

Đối với các nhà phát triển đang cân nhắc cách tiếp cận này, các vấn đề tương thích trình duyệt tạo ra những trở ngại thực tế. Kỹ thuật này đòi hỏi phải kiểm tra cẩn thận trên nhiều trình duyệt và có thể cần các cơ chế dự phòng cho người dùng bị ảnh hưởng. Một số triển khai đã phải dùng đến việc tải toàn bộ tệp khi yêu cầu phạm vi thất bại, mặc dù điều này làm mất đi mục đích ban đầu đối với các tập dữ liệu lớn. Sự đồng thuận trong cộng đồng cho thấy rằng, dù thanh lý thuyết, việc triển khai thực tế đòi hỏi tính mạnh mẽ hơn để sử dụng trong môi trường sản xuất.

Sự phát triển liên tục trong lĩnh vực này cho thấy sự quan tâm không ngừng trong việc đẩy ranh giới của dịch vụ lưu trữ tĩnh. Khi các tiêu chuẩn web phát triển và hành vi trình duyệt trở nên nhất quán hơn, những kỹ thuật này cuối cùng có thể đạt được độ tin cậy cần thiết để được chấp nhận rộng rãi. Hiện tại, các nhà phát triển phải cân nhắc giữa tiềm năng sáng tạo và những lo ngại về tương thích rất thực tế mà phản hồi từ cộng đồng đã nêu bật.

Tham khảo: Hosting SQLite databases on Github Pages