11 ポイント 投稿者 xguru 2023-10-26 | 1件のコメント | WhatsAppで共有
  • Buffer 型は Node.js 初期からバイナリデータ処理の土台だった
  • しかし今では Uint8Array が基本的な JavaScript の型であり、クロスプラットフォームでも動作する
  • Buffer は Uint8Array のインスタンスだが、他の JavaScript 環境では使えないさまざまなメソッドを導入した
    • そのため Buffer のメソッドを活用するコードはポリフィルが必要になり、多くの重要なパッケージがブラウザー互換でなくなっている
    • また Buffer#slice() と Uint8Array#slice() は動作が異なるため、予測できない結果が発生する可能性がある

計画

  • すべてのパッケージを Buffer から Uint8Array へ移行することにした
  • Buffer はおそらく決して削除されず、非推奨にもならないだろうが、少なくともコミュニティはバッファから徐々に離れていけるはず
  • 私の希望は、Node.js チームが少なくとも Buffer の利用を推奨しない方向に進み始めることだ

How

  • まず Uint8Array と Buffer の微妙な非互換性について把握すること
  • 移行を容易にするために uint8array-extras パッケージを作成した
  • あなたのコードが Buffer を受け取り、Buffer 関連のメソッドを使っていないなら、ドキュメントと型を Uint8Array に更新するだけでよい
    • 入力型を Buffer から Uint8Array に変更するのは、Buffer が Uint8Array のインスタンスであるため non-breaking な変更である
  • 戻り値の型を Buffer から Uint8Array に変更する場合は、利用側が Buffer 専用メソッドを使えるため breaking な変更になる
  • Uint8Array を Buffer にどうしても変換する必要がある場合は、Buffer.from(uint8Array)(データをコピー)または Buffer.from(uint8Array.buffer, uint8Array.byteOffset, uint8Array.byteLength)(コピーしない)を使える。ただし通常はもっと良い方法がある
  • 移行手順は以下の通り
    • import {Buffer} を 'node:buffer' import からすべて削除する
    • グローバルな Buffer の使用箇所をすべて削除する
    • Buffer 固有のメソッドの使用をやめる

質問

  • そもそもなぜ Buffer が存在したのか? : Buffer は Uint8Array が作られるずっと前に作られた
  • Uint8Array を使って Base64 の from/to 変換をするには? : 当面は uint8array-extras を使う。最終的には JavaScript で標準サポートされる可能性が高い

1件のコメント

 
dodok8 2023-10-27

おお、途中でそのライブラリはとても良いですね