Le développement de mon application pour la production est très long avec ng build --prod
Parfois, il échoue même avec
ERREUR FATAL: Mark-compacts inefficace près de la limite de tas Échec d'allocation - La mémoire JavaScript est insuffisante
Est-ce que je peux faire quelque chose pour réduire le temps de construction?
Certaines choses peuvent être faites pour réduire le temps de construction.
La commande de construction est exécutée par noeud, un processus unique ayant une limite de mémoire maximale de 1,76 Go sur des ordinateurs 64 bits. Il peut être augmenté en ajoutant l’argument --max-old-space-size
À la commande de construction.
Étant donné que cet argument doit être transmis au processus de noeud lui-même, la commande doit être exécutée directement avec noeud. Un exemple d'allocation de 4096 Mo (4 Go) de RAM au processus serait:
node --max-old-space-size=4096 ./node_modules/@angular/cli/bin/ng build
L'augmentation de la limite de mémoire empêchera également l'erreur "mémoire insuffisante".
Il semble y avoir une limite à la quantité de mémoire utilisée par le processus. Un de mes projets a vu son temps de construction considérablement réduit par une augmentation de la mémoire à 12 Go - mais son augmentation à 32 Go n'apporte aucune amélioration supplémentaire.
Référencer des feuilles de style externes à partir de node_modules en utilisant des chemins relatifs a un impact négatif sur les performances du processus de construction et doit être évité.
Le processus de construction utilise le sass-loader
De Webpack, qui prend en charge une syntaxe dans laquelle l'emplacement de node_modules est référencé avec le tilde ~
.
L'utilisation du tilde au lieu du chemin relatif réduit considérablement le temps de génération. Donc, au lieu d’importer des feuilles de style css externes avec
import "../../../../../node_modules/x/whatever.css"
utilisation
import "~node_modules/x/whatever.css"
Par défaut, la version de production utilise la configuration de votre fichier angular.json
. Les valeurs par défaut sont
"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
}
Ne vous écartez pas des valeurs par défaut de la production, sauf si vous avez une très bonne raison.
Celles-ci contribuent grandement à maintenir le temps de construction au minimum (en désactivant particulièrement SourceMap et en activant buildOptimizer).
Le Angular CLI teamb améliore continuellement la vitesse du processus de construction.
Il est à noter que la mise à niveau des performances de construction de la version 6 à la version 7 est importante, il est donc toujours judicieux de maintenir la bibliothèque @angular/cli
À jour.
Pour avoir une application de construction rapide, vous devez faire très attention aux bibliothèques que vous importez.
De nombreuses bibliothèques populaires telles que jQuery, lodash et moment sont de très grande taille et ne sont pas correctement optimisées pour le processus de construction de Webpack.
Recherchez les bibliothèques prenant en charge Tree-Shaking de Webpack pour permettre au processus de construction de regrouper uniquement les parties de la bibliothèque réellement utilisées dans votre application.
En outre, ne tombez pas dans le piège de l'ajout d'une bibliothèque d'utilitaires complète (telle que lodash) si vous n'avez besoin d'utiliser qu'une seule fonction de celle-ci (comme _get()
).
La compression des ressources (souvent des images) est en grande partie une tâche triviale (il suffit de Google "compresser les images en ligne"), et cela peut augmenter les performances du processus de construction et de l'application elle-même.
Comme Javascript est un seul thread, les avantages d'avoir plusieurs cœurs de processeur n'accéléreront pas le processus de construction.
En fait, si vous surveillez votre CPU pendant la construction, vous verrez qu'un seul cœur est sous la charge de 100% presque tout au long du processus.
Si vous construisez régulièrement votre application avec l'indicateur de production dans le cadre de votre configuration d'intégration continue, vous pouvez envisager d'utiliser une machine dotée de performances élevées en un seul thread (pour les tests, reportez-vous à cpubenchmark.net ).