11 điểm bởi xguru 2023-10-26 | 1 bình luận | Chia sẻ qua WhatsApp
  • Kiểu Buffer đã là nền tảng của việc xử lý dữ liệu nhị phân từ những ngày đầu của Node.js
  • Nhưng ngày nay, Uint8Array là kiểu JavaScript mặc định và cũng hoạt động đa nền tảng
  • Buffer là một instance của Uint8Array, nhưng đã đưa vào nhiều phương thức không thể dùng trong các môi trường JavaScript khác
    • Vì vậy, mã sử dụng các phương thức của Buffer cần polyfill, khiến nhiều gói quan trọng không tương thích với trình duyệt
    • Ngoài ra, Buffer#slice()Uint8Array#slice() hoạt động khác nhau nên có thể dẫn đến kết quả khó đoán

Kế hoạch

  • Quyết định chuyển tất cả package từ Buffer sang Uint8Array
  • Buffer có lẽ sẽ không bao giờ bị loại bỏ, và cũng sẽ không hoàn toàn ngừng được dùng, nhưng ít nhất cộng đồng có thể dần dần rời xa buffer
  • Hy vọng của tôi là đội ngũ Node.js ít nhất sẽ bắt đầu không còn khuyến khích dùng Buffer

Cách thực hiện

  • Trước tiên, hãy nắm rõ những điểm không tương thích tinh vi giữa Uint8ArrayBuffer
  • Tôi đã tạo package uint8array-extras để việc chuyển đổi trở nên dễ dàng hơn
  • Nếu mã của bạn nhận Buffer nhưng không dùng các phương thức riêng của Buffer, chỉ cần cập nhật tài liệu và kiểu sang Uint8Array
    • Việc đổi kiểu đầu vào từ Buffer sang Uint8Array là thay đổi không phá vỡ tương thích, vì buffer là một instance của Uint8Array
  • Nếu đổi kiểu trả về từ buffer sang Uint8Array, đó là thay đổi phá vỡ tương thích vì phía sử dụng có thể đang dùng các phương thức chỉ có ở buffer
  • Nếu bắt buộc phải chuyển Uint8Array sang Buffer, bạn có thể dùng Buffer.from(uint8Array) (sao chép dữ liệu) hoặc Buffer.from(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength) (không sao chép). Nhưng nhìn chung vẫn có cách tốt hơn
  • Các bước chuyển đổi gồm
    • Xóa mọi import {Buffer} từ node:buffer
    • Xóa mọi chỗ sử dụng Buffer ở phạm vi toàn cục
    • Ngừng sử dụng các phương thức đặc thù của Buffer

Câu hỏi

  • Vì sao ngay từ đầu lại có Buffer? : Buffer được tạo ra từ rất lâu trước khi Uint8Array xuất hiện
  • Làm sao chuyển đổi from/to Base64 bằng Uint8Array? : Hiện tại hãy dùng uint8array-extras. Về lâu dài, rất có thể JavaScript sẽ hỗ trợ sẵn việc này

1 bình luận

 
dodok8 2023-10-27

Ồ, thư viện ở giữa bài rất hay.