45 votes

Supprimer tous les commentaires et les logs de la console avec ng build --prod, est-ce possible ?

J'utilise MEAN, Angular 2, Node/Express, Angular-CLI et ng build --prod pour construire mon application et j'ai une parodie de code jetable commenté et un milliard de déclarations de débogage console.log dans toute mon application. Existe-t-il un moyen de faire en sorte que le processus de construction supprime tous les commentaires et les instructions console.log lors de la construction ? L'idée de le faire manuellement est effrayante !

0 votes

J'imagine que les commentaires sont déjà supprimés, avez-vous regardé le résultat ? Mais comment est-il censé savoir quels journaux sont des fonctionnalités et lesquels ne sont que des débogages ?

0 votes

Angular-cli utilise webpack sous le capot, qui fait déjà une sorte de manipulation du javascript pendant le processus d'empaquetage. Je crois qu'il y a des plugins pour webpack pour supprimer la journalisation de la console et aussi les commentaires pendant le processus de traitement, mais je ne suis pas sûr de savoir comment synchroniser cela avec angular-cli.

1 votes

Vous pouvez utiliser Gulp avec gulp-strip-debug. Consultez cet article pour plus d'informations.

42voto

Sudhakar Points 117

J'ai une solution simple. Mettez ce code dans main.ts

if(env === 'prod') { // assuming you have env variable configured
  // check if window exists, if you render backend window will not be available 
  if(window){
      window.console.log = function(){};
   }
}

3 votes

Lol bonne idée, le problème est que j'ai plus d'instructions console.log dans mon code côté serveur :P merci quand même

3 votes

Vous pouvez faire de même pour le code du serveur. Mettez ce code dans server.js . Ne pas attacher à la fenêtre car elle n'existe pas dans l'environnement du nœud.

0 votes

Gr8 idée... tu as sauvé ma journée. :)

16voto

ahereza Points 270

Il suffit d'ajouter ceci window.console.log = function(){}; à `

if (environment.production) {
    enableProdMode();
}`

3 votes

Je ne le recommande pas car le navigateur continue d'exécuter la fonction de remplacement, ce qui représente un effort de traitement pour l'appareil de l'utilisateur. Voir : codementor.io/brijmcq/

5voto

Jan Points 119

Vous pouvez utiliser ng lint avec --fix et no-console dans le fichier de configuration de tslint. Et accrochez-le à votre appel de construction dans votre fichier de paquet.

eg. : ... "prebuild": "ng lint --fix", "build": "ng build -prod", ...

et construire l'application

npm run build

réf : https://github.com/angular/angular-cli/wiki/lint

1 votes

Est npm run build la même chose que de courir ng build --prod ?

2 votes

Oui, mais le prebuild commend ne se déclenche pas. Vous pouvez cependant faire deux appels : ng lint --fix && ng build -prod

0 votes

J'aime l'idée, mais l'exécution de lint avec l'option --fix ne supprime pas réellement les utilisations de la console dans mes fichiers. Une idée de la raison ?

1voto

gestj Points 41

Une autre option qui n'a pas été complètement expliquée est la suivante (si le linting ou le webpack personnalisé ne sont pas la solution) :

Pour retirer les déclarations de journal du code par votre construction.

Voici donc ce que j'ai fait (j'utilise nx en plus du CLI d'Angular) :

  1. Ajout d'un script personnalisé qui nettoie tous les appels à console.log

utils/clean-console.log.js

const glob = require('glob');
const replace = require('replace');

// list all directories you want to scan
// (I have a nx mono.repo with multiple involved projects & libs)
[
    './apps/<app>/src/**/*.ts',
    './libs/*/src/**/*.ts',
].forEach(pattern => glob(pattern, (err, files) => {
    if (err) {
        throw err;
    }
    files.forEach(item => replace({
        // change to your needs which levels you want to strip
        // the levels listed are removed from code
        regex: /.*console\.(log|info|debug|warn)\([^\)]*\);?.*/gm,
        replacement: '',
        paths: [item],
    }));
}));
  1. Mise à jour de package.json pour ma commande de construction

    node utils/clean-console.log.js && nx run <app>:build:prod


Cela fonctionne très bien pour moi (même pour les déclarations de journal multilignes) car j'ai un style de code cohérent. Chaque déclaration de journal est suivie d'une nouvelle ligne. Si vous n'avez pas cela, vous ne pouvez pas utiliser le script juste devant.

Btw. vous changez le code avec ceci. Mais pour moi, dans le contexte d'un pipeline, cela n'a pas d'importance puisque chaque construction sera vérifiée à nouveau et ce qui arrive au code à l'intérieur du pipeline n'a pas d'importance. Seule la sortie compilée compte...

1voto

N'oubliez pas de faire de même pour les autres consoles.

if (environment.production) {
    enableProdMode();
    if(window){
      window.console.log = function(){};
      window.console.warn = function(){};
      window.console.error = function(){};
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X