11 points par xguru 2023-10-26 | 1 commentaires | Partager sur WhatsApp
  • Le type Buffer a été la pierre angulaire du traitement des données binaires depuis les débuts de Node.js
  • Mais aujourd’hui, Uint8Array est le type JavaScript de base et fonctionne aussi en cross-platform
  • Buffer est une instance de Uint8Array, mais il a introduit diverses méthodes qui ne peuvent pas être utilisées dans d’autres environnements JavaScript
    • Par conséquent, le code qui exploite les méthodes de Buffer a besoin de polyfills, ce qui rend de nombreux packages importants incompatibles avec le navigateur
    • De plus, Buffer#slice() et Uint8Array#slice() ont un comportement différent, ce qui peut entraîner des résultats imprévisibles

Plan

  • Décision de faire migrer tous les packages de Buffer vers Uint8Array
  • Buffer ne sera probablement jamais supprimé et ne deviendra sans doute jamais obsolète, mais au moins la communauté pourra progressivement s’en éloigner
  • Mon espoir est que l’équipe Node.js commence au moins à ne plus recommander l’usage de Buffer

How

  • D’abord, bien comprendre les subtiles incompatibilités entre Uint8Array et Buffer
  • J’ai créé le package uint8array-extras pour faciliter la migration
  • Si votre code reçoit un Buffer sans utiliser de méthodes spécifiques à Buffer, il suffit de mettre à jour la documentation et les types vers Uint8Array
    • Changer le type d’entrée de Buffer à Uint8Array est une modification non breaking, car un buffer est une instance de Uint8Array
  • En revanche, changer le type de retour de buffer à Uint8Array est une modification breaking, car les consommateurs peuvent utiliser des méthodes propres à buffer
  • Si vous devez absolument convertir un Uint8Array en Buffer, vous pouvez utiliser Buffer.from(uint8Array) (copie des données) ou Buffer.from(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength) (sans copie). Mais il existe généralement une meilleure approche
  • Les étapes de la transition sont
    • Supprimer tous les import {Buffer} depuis l’import 'node:buffer'
    • Supprimer globalement tous les usages de Buffer
    • Cesser d’utiliser les méthodes spécifiques à Buffer

Questions

  • Pourquoi Buffer existait-il au départ ? : Buffer a été créé bien avant Uint8Array
  • Comment convertir depuis/vers Base64 avec Uint8Array ? : Pour l’instant, utilisez uint8array-extras. À terme, cela sera probablement pris en charge nativement par JavaScript

1 commentaires

 
dodok8 2023-10-27

Oh, cette bibliothèque au milieu est vraiment très bien.