web-dev-qa-db-fra.com

Uglify-js peut-il supprimer les instructions console.log?

J'utilise uglify-js pour réduire le code source. Je souhaite supprimer les instructions console.log du code source d'origine. C'est possible? Ou y a-t-il un autre outil de compression qui supporte cela?

J'utilise le code comme ci-dessous dans Node.js.

var uglify = require('uglify-js');
var originalSourceCode = 'var name = function(){var str = "test"; return str}; console.log("log data");';
var minifiedCode = uglify.minify(originalSourceCode, {
                fromString : true,
                mangle: {},
                warnings: true
            });
console.log(minifiedCode);

La sortie est:

$node m.js
{ code: 'var name=function(){var a="test";return a};console.log("log data");',
  map: 'null' }

Dans le code détaillé, le fichier console.log n'est pas supprimé.

38
Jeffrey

Dans la dernière version d'uglify-js (v2.4.3), une nouvelle option de compression ‘pure_funcs’ est ajoutée. Si j'ajoute les fonctions console.log à ce tableau, il sera supprimé du fichier js minifié. Le code de test ci-dessous montre comment cette option fonctionne. C'est exactement ce que je veux.

// file: m.js
var uglify = require('uglify-js');
var originalSourceCode = 'var name = function(){var str = "test"; return str}; console.log("log data" + name());';
var minifiedCode = uglify.minify(originalSourceCode, {
                fromString : true,
                mangle: {},
                warnings: true,
                compress:{
                    pure_funcs: [ 'console.log' ]
                }
            });
console.log(minifiedCode);

$node m.js
WARN: Dropping side-effect-free statement [?:1,53]
{ code: 'var name=function(){var n="test";return n};',
  map: 'null' }

Citations de https://github.com/mishoo/UglifyJS2

pure_funcs - null par défaut. Vous pouvez transmettre un tableau de noms et UglifyJS supposera que ces fonctions ne produisent pas d’effets secondaires . DANGER: ne vérifiera pas si le nom est redéfini dans la portée. Un exemple cas ici, par exemple var q = Math.floor (a/b). Si la variable q n'est pas utilisé ailleurs, UglifyJS le laissera tomber, mais gardera toujours le Math.floor (a/b), ne sachant pas ce qu'il fait. Vous pouvez passer pure_funcs: [ 'Math.floor'] pour lui faire savoir que cette fonction ne produira aucun effet secondaire, auquel cas la déclaration entière serait écartée . L'implémentation actuelle ajoute un surcoût (la compression sera Plus lente).

26
Jeffrey

Il y a aussi une autre option appelée drop_console qui a été ajoutée récemment (fin 2013)

drop_console -- default false. Pass true to discard calls to console.* functions

Ceci est ajouté à la configuration de grunt init comme ceci:

grunt.initConfig({
  uglify: {
    options: {
      compress: {
        drop_console: true // <-
      }
    },
    my_target: {
      files: {
        'dest/output.min.js': ['src/input.js']
      }
    }
  }
});

Tiré de des documents grith-contrib-uglify github

72
Joshua

Vous pouvez utiliser Groundskeeper pour le faire, bien que ce soit une étape distincte.

3

pour -c option, définissez drop_console pour qu'il soit vrai : uglifyjs app.js -m -c drop_console=true -o app.min.js  

2
KiwenLau

Si vous utilisez gulp, utilisez 'gulp-strip-debug' pour supprimer console, alerte et débogueur . https://www.npmjs.com/package/gulp-strip-debug

0
pratik nagariya