JavaScriptバンドラおよびミニファイアであるesbuildは、JavaScriptのバンドルおよびミニファイプロセスで桁違いの速度向上をもたらすことを目指している。esbuildは、ネイティブコードにコンパイルされたGoで記述され、タスクを並列化してマルチコアプロセッサを活用し、データ変換を最小限に抑えることで、その速度を実現する。
@figmadesignのCTO兼共同創設者であり、esbuildの作成者であるEvan Wallace氏は、JavaScriptコミュニティの期待されるパフォーマンスをリセットすることを目指していると説明した:
[…]] Web用の現在のビルドツールは、本来よりも少なくとも1桁遅くなっています。このプロジェクトが、JavaScriptツールがはるかに高速になるという「存在証明」として役立つことを願っています。
[…] JavaScriptエコシステム全体と競合して、何でもビルドできる非常に柔軟なビルドシステムを作成しようとはしていません。
私は、a) ユースケースの特定のスイートスポット (JavaScript、TypeScript、そしておそらくCSSのバンドル) でうまく機能し、b) JavaScriptビルドツールの意味に対するコミュニティの期待をリセットする高速なビルドツールを作成しようとしています。
Wallace氏は、esbuildの主要なユースケースはプロダクション用の大規模なコードベースのパッケージ化であると述べた。これには、ネットワーク転送時間を短縮するコードのミニファイ、およびデバッグに重要なソースマップの作成が含まれる。
Wallace氏は、esbuildが1秒未満のビルド時間を達成し、他のツールのビルド時間が30秒から1分以上の間で変化することを示すカスタムメイドのJavaScriptベンチマークを提供した。提供されているTypeScriptベンチマークでも同様の結果が見られる:
開発者は別のマシンでベンチマークを実行し、速度向上の確認結果を再現した。Parcelバンドラの作成者であるDevon Govett氏は、esbuildとparcelの間のパフォーマンスギャップの背後にある1つの理由のヒントを示した:
[…] これを見て、なぜParcelの表示がはるかに遅いのか疑問に思っている人にとっては、デフォルトでBabelを実行しているのに対し、webpackなどは実行していないためです。これらのツールが同様に構成されている場合、またはParcelがこれをスキップするように構成されている場合、結果はより近くなると思います。
ベンチマークの方法論は現実的なシナリオを反映するように改良する必要があるが、esbuildによって達成されるビルド時間は印象的であり、JavaScriptまたはTypeScriptで記述された代替バンドラの中で前例のないものである。esbuildはGoで記述されており、ネイティブコードにコンパイルされる。esbuildはさらに、並列処理を最大化するアーキテクチャに依存し (たとえば、ソースマップのパース、プリント、生成時) 、キャッシュの局所性を向上させるために、可能な限り少ない完全抽象構文ツリー (AST) パスを実行しようとし、インクリメンタルビルドをサポートする。
esbuildは定数畳み込みをサポートし、次のようなコードを含む可能性のあるReactなどのライブラリを処理できる:
if (process.env.NODE_ENV === 'production') {
module.exports = require('./cjs/react.production.min.js');
} else {
module.exports = require('./cjs/react.development.js');
}
コマンドラインで渡されたprocess.env.NODE_ENV
の値に従って、前のコードブランチの1つがバンドルから削除される。
開発者は速度の向上を歓迎している。CTOでfourTheoremの共同創設者であるEoin Shanaghy氏は最近のQCon Londonのパネルで次のように述べている:
私はES Buildと呼ばれる最近の開発ツールを試しました。これは、Golangで記述されたネイティブトランスパイラであり、他のどれよりも大幅に高速です。メリットがあるので、最終的にはそれが起こると思います。それが必要です。 […] すべてのJavaScriptツールをJavaScriptで作成する必要はありません。
esbuildはまだ活発に作業中であり、プロダクション環境で使用する準備ができていないようである。esbuildは、オープンソースのMITライセンスプロジェクトである。執筆時の最新リリースは0.5.0で、TypeScriptデコレータのサポートとともにGoとJavaScript (ブラウザ) APIの両方が含まれている。