Должен ли я удалить console.log из производственного кода? - PullRequest
73 голосов
/ 04 ноября 2011

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

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

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

AmЯ могу оставить вход на стороне клиента, или он должен идти?

РЕДАКТИРОВАТЬ: В конце я полагаю, что лучший аргумент, который я (и кто-либо еще?) Может придумать, что есть, возможно, не- незначительное количество дополнительных данных, передаваемых между сервером и клиентом, оставляя сообщения регистрации оставленными. Если производственный код должен быть полностью оптимизирован, то необходимо будет удалить протоколирование, чтобы уменьшить размер javascript, отправляемого клиенту.

Ответы [ 10 ]

47 голосов
/ 04 ноября 2011

Другой способ справиться с этим - «заглушить» консольный объект, когда он не определен, чтобы не возникало ошибок в контекстах, в которых отсутствует консоль, т. Е.

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

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

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

см. Также: Не рекомендуется ли оставлять вызовы console.log () в вашем продукте в коде JavaScript?

35 голосов
/ 04 ноября 2011

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

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

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

UglifyJS2

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

Передать true для отклонения вызовов на консоль. * Functions

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

16 голосов
/ 04 ноября 2011

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

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

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

5 голосов
/ 04 ноября 2011

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

4 голосов
/ 02 апреля 2013

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

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

Вот небольшой фрагмент кода, который я использовал в последнее время для решения этой дилеммы. Он исправляет ошибки, вызванные неопределенным 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

2 голосов
/ 16 декабря 2014
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');
1 голос
/ 04 января 2017

TL; DR

Идея: Регистрация объектов исключает их сборку мусора.

Детали

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

Это просто идея: Я проверил пункты 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)) }
});
1 голос
/ 24 мая 2012

Да, рекомендуется использовать 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 должен быть установлен как true или false в зависимости от нашей среды.

0 голосов
/ 19 марта 2014

Я в основном перезаписываю функцию 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);
    }
},
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...