- 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件のコメント
おお、途中でそのライブラリはとても良いですね