Debería estar quitando la consola.¿registro del código de producción?


Actualmente tengo esta declaración JS en todas partes en mi código:

window.console && console.log("Foo");

Me pregunto si esto es costoso en absoluto, o tiene algún efecto secundario negativo en la producción.

¿Soy libre de dejar el inicio de sesión del lado del cliente, o debería desaparecer?

EDITAR: Al final, supongo que el mejor argumento I(y cualquier otra persona?) puede venir para arriba con es que hay una cantidad posiblemente no despreciable de datos adicionales transferidos entre el servidor y el cliente dejando mensajes de registro a la izquierda en. Si el código de producción debe ser completamente optimizado, el registro tendrá que ser eliminado para reducir el tamaño de javascript que se envía al cliente.

Author: Sean Anderson, 2011-11-04

10 answers

Debe no agregar herramientas de desarrollo a una página de producción.

Para responder a la otra pregunta: El código no puede tener un efecto secundario negativo:

  • window.console se evaluará como falso si console no está definido
  • console.log("Foo") imprimirá el mensaje a la consola cuando esté definido (siempre que la página no sobrescriba console.log por una no-función).
 31
Author: Rob W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-03 21:30:38

Otra forma de lidiar con esto es 'stub' el objeto de la consola cuando no está definido para que no se produzcan errores en contextos que no tienen la consola, es decir,

if (!window.console) {
  var noOp = function(){}; // no-op function
  console = {
    log: noOp,
    warn: noOp,
    error: noOp
  }
}

Entiendes la idea... hay una gran cantidad de funciones definidas en las diversas implementaciones de la consola, por lo que podría stub todas o solo las que usa (por ejemplo, si solo usa console.log y nunca las usó console.profile, console.time etc...)

Esto para mí es una mejor alternativa en desarrollo que agregar condicionales delante de cada llamada, o no usarlas.

Ver también: Es una mala idea dejar "console.log () " llamadas en su código JavaScript de producton?

 41
Author: craigb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:33

UglifyJS2

Si está utilizando este minificador, puede configurar drop_console opción :

Pase true para descartar llamadas a la consola.* funciones

Así que sugeriría dejar console.log las llamadas como son para la parte más complicada del código base.

 25
Author: terales,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-21 08:29:12

Si la minificación es parte de su proceso de compilación, puede usarla para eliminar el código de depuración, como se explica aquí con el compilador de cierre de Google: Excluir el código JavaScript de depuración durante la minificación

if (DEBUG) {
  console.log("Won't be logged if compiled with --define='DEBUG=false'")
}

Si compila con optimizaciones avanzadas, este código incluso se identificará como muerto y se eliminará por completo

 14
Author: wutz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:25

Sí. consola.log lanzará una excepción en los navegadores que no tienen soporte para ella (no se encontrará el objeto de consola).

 5
Author: MK_Dev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-03 21:30:40

Generalmente sí, no es una gran idea exponer mensajes de registro en su código de producción.

Idealmente, debería eliminar dichos mensajes de registro con un script de compilación antes de la implementación; pero muchas (la mayoría) personas no usan un proceso de compilación (incluyéndome a mí).

Aquí hay un breve fragmento de código que he estado usando últimamente para resolver este dilema. Corrige los errores causados por un console indefinido en IE antiguo, así como deshabilita el registro si está en "development_mode".

// fn to add blank (noOp) function for all console methods
var addConsoleNoOp =  function (window) {
    var names = ["log", "debug", "info", "warn", "error",
        "assert", "dir", "dirxml", "group", "groupEnd", "time",
        "timeEnd", "count", "trace", "profile", "profileEnd"],
        i, l = names.length,
        noOp = function () {};
    window.console = {};
    for (i = 0; i < l; i = i + 1) {
        window.console[names[i]] = noOp;
    }
};

// call addConsoleNoOp() if console is undefined or if in production
if (!window.console || !window.development_mode) {
    this.addConsoleNoOp(window);
}

estoy bastante seguro de que tomó mucho de lo anterior addConsoleNoOp f'n de otra respuesta en SO, pero no puede encontrar en este momento. Añadiré una referencia más tarde si la encuentro.

Editar: No es el post que estaba pensando, pero aquí hay un enfoque similar: https://github.com/paulmillr/console-polyfill/blob/master/index.js

 4
Author: Zach Lysobey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-12 20:17:09
var AppLogger = (function () {
  var debug = false;
  var AppLogger = function (isDebug) {
    debug = isDebug;
  }
  AppLogger.conlog = function (data) {
    if (window.console && debug) {
        console.log(data);
    }
  }
  AppLogger.prototype = {
    conlog: function (data) {
        if (window.console && debug) {
            console.log(data);
        }
    }
  };
return AppLogger;
})();

Uso:

var debugMode=true;
var appLogger = new AppLogger(debugMode);
appLogger.conlog('test');
 2
Author: wchoward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-16 19:24:26

Sí, es una buena práctica usar console.log para fines de depuración de javascript, pero debe eliminarse del servidor de producción o, si es necesario, puede agregarse en el servidor de producción con algunos puntos clave a tener en cuenta:

**var isDebugEnabled="Get boolean value from Configuration file to check whether debug is enabled or not".**
if (window.console && isDebugEnabled) {
    console.log("Debug Message");
}

El bloque de código anterior debe usarse en todas partes para el registro con el fin de verificar primero si la consola es compatible con el navegador actual y si la depuración está habilitada o no.

isDebugEnabled tiene que ser establecido como verdadero o falso basado en nuestro ambiente.

 1
Author: shanky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-13 19:24:44

Básicamente sobrescribo la consola.función de registro con el que tiene conocimiento de dónde se está ejecutando el código. Así puedo seguir usando la consola.registro como siempre. Automáticamente sabe que estoy en modo dev / qa o en producción. También hay una manera de forzarlo. Aquí hay un violín que funciona. http://jsfiddle.net/bsurela/Zneek /

Aquí está el fragmento como desbordamiento de pila es intimado por las personas que publican jsfiddle

  log:function(obj)
{
    if(window.location.hostname === domainName)
    {
        if(window.myLogger.force === true)
        {
            window.myLogger.original.apply(this,arguments);
        }
    }else {
        window.myLogger.original.apply(this,arguments);
    }
},
 0
Author: Bhavin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-18 23:48:59

TL; DR

Idea: El registro de objetos impide que sean recolectados como Basura.

Detalles

  1. Si pasa objetos a console.log entonces estos objetos son accesibles por referencia desde la consola de DevTools. Puede comprobarlo registrando el objeto, mutándolo y encontrando que los mensajes antiguos reflejan cambios posteriores del objeto.
  2. Si los registros son demasiado largos, los mensajes antiguos se eliminan en Chrome.
  3. Si los registros son cortos, los mensajes antiguos no se eliminan, si estos mensajes hacen referencia a objetos, entonces estos objetos no son Basura Recolectada.

Es solo una idea: Revisé los puntos 1 y 2, pero no 3.

Solución

Si desea mantener registros para solucionar problemas del lado del cliente u otras necesidades, entonces:

['log', 'warn', 'error'].forEach( (meth) => {
  const _meth = window.console[meth].bind(console);
  window.console[meth] = function(...args) { _meth(...args.map((arg) => '' + arg)) }
});
 0
Author: ilyaigpetrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-04 11:48:12