11 คะแนน โดย xguru 2023-10-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Buffer เป็นรากฐานของการจัดการข้อมูลไบนารีมาตั้งแต่ยุคแรกเริ่มของ Node.js
  • แต่ทุกวันนี้ Uint8Array เป็นชนิดข้อมูลมาตรฐานของ JavaScript และยังทำงานได้ข้ามแพลตฟอร์ม
  • Buffer เป็นอินสแตนซ์ของ Uint8Array แต่ได้เพิ่มเมธอดหลากหลายที่ใช้ไม่ได้ในสภาพแวดล้อม JavaScript อื่น ๆ
    • ดังนั้นโค้ดที่ใช้เมธอดของ Buffer จึงต้องพึ่งพา polyfill ทำให้แพ็กเกจสำคัญจำนวนมากไม่รองรับเบราว์เซอร์
    • นอกจากนี้ Buffer#slice() และ Uint8Array#slice() ยังทำงานต่างกัน จึงอาจทำให้เกิดผลลัพธ์ที่คาดเดาไม่ได้

แผนการ

  • จะย้ายแพ็กเกจทั้งหมดจาก Buffer ไปเป็น Uint8Array
  • Buffer คงจะไม่ถูกลบออกไปตลอดกาล และอาจจะไม่ถึงขั้นเลิกใช้ แต่ อย่างน้อยชุมชนก็น่าจะค่อย ๆ ถอยห่างจากบัฟเฟอร์ได้
  • สิ่งที่ผมหวังคือทีม Node.js จะเริ่มอย่างน้อยด้วยการไม่แนะนำให้ใช้ Buffer

วิธีทำ

  • ก่อนอื่นให้ทำความเข้าใจกับความเข้ากันไม่ได้เล็กน้อยระหว่าง Uint8Array และ Buffer
  • เพื่อให้การย้ายทำได้ง่ายขึ้น จึงได้สร้างแพ็กเกจ uint8array-extras ขึ้นมา
  • ถ้าโค้ดของคุณรับ Buffer และไม่ได้ใช้เมธอดเฉพาะของ Buffer ก็แค่อัปเดตเอกสารและชนิดข้อมูลเป็น Uint8Array
    • การเปลี่ยนชนิดอินพุตจาก Buffer เป็น Uint8Array เป็นการเปลี่ยนแบบ non-breaking เพราะบัฟเฟอร์เป็นอินสแตนซ์ของ Uint8Array
  • หากเปลี่ยนชนิดค่าที่คืนกลับจากบัฟเฟอร์เป็น Uint8Array จะเป็นการเปลี่ยนแบบ breaking เพราะฝั่งผู้ใช้ปลายทางอาจใช้เมธอดเฉพาะของบัฟเฟอร์อยู่
  • หากจำเป็นต้องแปลง Uint8Array เป็น Buffer จริง ๆ สามารถใช้ Buffer.from(uint8Array) (คัดลอกข้อมูล) หรือ Buffer.from(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength) (ไม่คัดลอก) ได้ แต่โดยทั่วไปมักมีวิธีที่ดีกว่า
  • ขั้นตอนในการเปลี่ยนผ่านคือ
    • ลบ import {Buffer} ทั้งหมดออกจากการ import 'node:buffer'
    • ลบทุกจุดที่มีการใช้งาน Buffer แบบ global
    • หยุดใช้เมธอดเฉพาะของ Buffer

คำถามต่าง ๆ

  • ทำไมถึงมี Buffer ตั้งแต่แรก? : Buffer ถูกสร้างขึ้นก่อนที่ Uint8Array จะมีขึ้นนานมาก
  • ถ้าจะใช้ Uint8Array แปลง from/to Base64 ล่ะ? : ตอนนี้ให้ใช้ uint8array-extras ไปก่อน และท้ายที่สุดมีโอกาสสูงที่ JavaScript จะรองรับเรื่องนี้ในตัว

1 ความคิดเห็น

 
dodok8 2023-10-27

โอ้ ระหว่างทางมีไลบรารีที่ดีมากอยู่ด้วยนะ