ลาก่อน Node.js Buffer ถึงเวลาย้ายไปใช้ Uint8Array แล้ว
(sindresorhus.com)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 ความคิดเห็น
โอ้ ระหว่างทางมีไลบรารีที่ดีมากอยู่ด้วยนะ