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 ความคิดเห็น
โอ้ ระหว่างทางมีไลบรารีที่ดีมากอยู่ด้วยนะ