私のアプリケーションは、ng build --prod
を使用して本番用にビルドするのに非常に長い時間がかかります
時にはそれで失敗することさえあります
致命的なエラー:ヒープ制限に近い無効なマークコンパクトの割り当てに失敗しました-JavaScriptヒープのメモリ不足
ビルド時間を短縮するためにできることはありますか?
ビルド時間を短縮するためにできることがいくつかあります。
ビルドコマンドは、64ビットマシンで1つのプロセスの最大メモリ制限が1.76 GBであるノードによって実行されます。ビルドコマンドに_--max-old-space-size
_引数を追加することで増やすことができます
この引数はノードプロセス自体に渡す必要があるため、コマンドはnodeで直接実行する必要があります。プロセスへのRAM=の4096 MB(4GB)の割り当て例は次のとおりです。
_node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build
_
メモリ制限を増やすと、「メモリ不足」エラーも防止されます。
プロセスが使用するメモリ量には制限があるようです。私のプロジェクトでは、メモリを12GBに増やすことでビルド時間が大幅に短縮されましたが、32GBに増やしてもそれ以上の改善はありませんでした。
相対パスを使用してnode_modulesから外部スタイルシートを参照すると、ビルドプロセスのパフォーマンスが低下するため、避ける必要があります。
ビルドプロセスはWebpackの_sass-loader
_を使用します。これは、node_modulesの場所がチルダ_~
_で参照される構文をサポートします。
相対パスの代わりにチルダを使用すると、ビルド時間が大幅に短縮されます。したがって、外部CSSスタイルシートをインポートする代わりに
_import "../../../../../node_modules/x/whatever.css"
_
つかいます
_import "~node_modules/x/whatever.css"
_
デフォルトでは、プロダクションビルドは_angular.json
_ファイルの設定を使用します。デフォルト値は
_"production": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"extractCss": true,
"namedChunks": false,
"aot": true,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true
}
_
特別な理由がない限り、実動ビルドのデフォルトから変更しないでください。
これらは、ビルド時間を短く保つための大きな部分です(特にsourceMapを無効にし、buildOptimizerを有効にする)。
Angular CLI teambは、ビルドプロセスの速度を継続的に改善します。
ビルドのパフォーマンスがバージョン6から7に大幅にアップグレードされることは注目に値するため、_@angular/cli
_ライブラリを常に最新の状態に保つことをお勧めします。
高速なビルドアプリケーションを使用するには、インポートするライブラリに非常に注意する必要があります。
JQuery、lodash、momentなどの多くの一般的なライブラリはサイズが非常に大きく、Webpack構築プロセス用に適切に最適化されていません。
Webpackの Tree-Shaking をサポートするライブラリを探して、ビルドプロセスがアプリケーションで実際に使用されるライブラリの部分のみをバンドルできるようにします。
また、単一の関数(_get()
など)のみを使用する必要がある場合は、ユーティリティライブラリ全体(lodashなど)を追加するというaddingに陥らないでください。
アセット(多くの場合、イメージ)の圧縮は、大部分が些細な作業(Googleで「オンラインでイメージを圧縮する」)であり、ビルドプロセスとアプリケーション自体のパフォーマンスを向上させることができます。
Javascriptはシングルスレッドであるため、複数のCPUコアを持つ利点はビルドプロセスの速度を上げません。
実際、ビルド中にCPUを監視すると、プロセス全体でほぼ1つのコアに100%の負荷がかかっていることがわかります。
継続的インテグレーションのセットアップの一部として生産フラグを使用してアプリケーションを定期的に構築している場合は、高いシングルスレッドパフォーマンスを備えたマシンの使用を検討できます(ベンチマークについては、 cpubenchmark.net を参照してください)