Должен ли я удалить console.log из производственного кода?

В настоящее время я использую этот оператор JS в моем коде:

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

Мне интересно, дорого ли это вообще или какие-либо негативные побочные эффекты в производстве.

Могу ли я оставить вход на стороне клиента, или он должен идти?

EDIT: В конце концов, я полагаю, что лучший аргумент я (и кто-то еще?) может придумать, что существует, возможно, нематериальное количество дополнительных данных, передаваемых между сервером и клиентом, оставляя оставленные сообщения протоколирования in. Если производственный код должен быть полностью оптимизирован, необходимо будет выполнить регистрацию, чтобы уменьшить размер отправки javascript клиенту.

Ответ 1

Вы должны не добавлять инструменты разработки на производственную страницу.

Чтобы ответить на другой вопрос: Код не может иметь отрицательный побочный эффект:

  • window.console будет оцениваться как false, если console не определен
  • console.log("Foo") будет выводить сообщение на консоль, если оно определено (при условии, что страница не перезаписывает console.log нефункционалом).

Ответ 2

Другой способ справиться с этим - "заглушить" консольный объект, когда он не определен, поэтому ошибки не возникают в контекстах, у которых нет консоли i.e.

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

вы получаете идею... существует множество функций, определенных для различных реализаций консоли, поэтому вы можете их заглушить или только те, которые вы используете (например, если вы когда-либо использовали console.log и никогда не использовали console.profile, console.time и т.д.)

Это для меня лучшая альтернатива в развитии, чем добавление условностей перед каждым вызовом или их не использование.

см. также: Неплохая идея оставить "console.log()" звонки в код продукта productone?

Ответ 3

UglifyJS2

Если вы используете этот minifier, вы можете установить drop_console option:

Передача истины для отбрасывания вызовов на консоль. * functions

Поэтому я предлагаю оставить вызовы console.log, поскольку они предназначены для самой сложной части кода.

Ответ 4

Если минимизация является частью процесса сборки, вы можете использовать ее для удаления кода отладки, как описано здесь с компилятором Google закрытия: Исключить код отладки JavaScript во время минимизации

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

Если вы скомпилируете с расширенными оптимизациями, этот код будет даже идентифицирован как мертвый и полностью удален

Ответ 5

Да. console.log выдаст исключение в браузерах, у которых нет поддержки (консольный объект не будет найден).

Ответ 6

Как правило, да, это не отличная идея, чтобы разоблачать сообщения журнала в вашем производственном коде.

В идеале перед развертыванием следует удалить такие сообщения журнала с помощью сборки script; но многие (большинство) людей не используют процесс сборки (включая меня).

Вот короткий фрагмент кода, который я использовал в последнее время для решения этой дилеммы. Он исправляет ошибки, вызванные undefined console в старом IE, а также отключает ведение журнала, если в "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);
}

Я уверен, что взял много из вышеперечисленного addConsoleNoOp f'n из другого ответа на SO, но не могу найти его прямо сейчас. Я добавлю ссылку позже, если найду ее.

edit: не сообщение, о котором я думал, но здесь аналогичный подход: https://github.com/paulmillr/console-polyfill/blob/master/index.js

Ответ 7

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;
})();

Применение:

var debugMode=true;
var appLogger = new AppLogger(debugMode);
appLogger.conlog('test');

Ответ 8

Да, его хорошая практика использования console.log для цели отладки javascript, но ее необходимо удалить с производственного сервера или, если необходимо, можно добавить на рабочий сервер с некоторыми ключевыми моментами, которые необходимо учитывать:

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

Над блоком кода должен использоваться везде для ведения журнала, чтобы сначала проверить, поддерживается ли консоль для текущего браузера и включена ли отладка или нет.

isDebugEnabled должен быть установлен как истинный или ложный, основанный на нашем окружающая среда.

Ответ 9

Я в основном перезаписываю функцию console.log с тем, что знает, где выполняется код. Таким образом, я могу продолжать использовать console.log, как всегда. Он автоматически знает, что я нахожусь в режиме dev/qa или в процессе производства. Существует также способ заставить его. Вот рабочая скрипка. http://jsfiddle.net/bsurela/Zneek/

Вот фрагмент, поскольку переполнение стека задается людьми, отправляющими 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);
    }
},

Ответ 10

TL; DR

Идея: Объекты ведения журнала исключают их из сбора мусора.

Подробнее

  • Если вы передаете объекты в console.log, то эти объекты доступны по ссылке с консоли DevTools. Вы можете проверить его, зарегистрировав объект, изменив его и обнаружив, что старые сообщения отражают последующие изменения объекта.
  • Если журналы слишком длинны, старые сообщения удаляются в Chrome.
  • Если журналы коротки, тогда старые сообщения не удаляются, если эти сообщения ссылаются на объекты, то эти объекты не собираются с мусором.

Это просто идея: Я проверил точки 1 и 2, но не 3.

Решение

Если вы хотите вести журналы для устранения неполадок на стороне клиента или других потребностей, выполните следующие действия:

['log', 'warn', 'error'].forEach( (meth) => {
  const _meth = window.console[meth].bind(console);
  window.console[meth] = function(...args) { _meth(...args.map((arg) => '' + arg)) }
});