Плохая идея оставить вызовы “console.log()” в вашем производственном коде JavaScript?

StackOverflow https://stackoverflow.com/questions/1114187

Вопрос

У меня есть куча console.log() вызывает в моем JavaScript.

Должен ли я прокомментировать их перед развертыванием в производство?

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

Это было полезно?

Решение

Это вызовет ошибки Javascript, завершая выполнение блока Javascript, содержащего ошибку.

Однако вы могли бы определить фиктивную функцию, которая не работает, когда Firebug не активен:

if(typeof console === "undefined") {
    console = { log: function() { } };
}

Если вы используете какие-либо методы, отличные от log, вам также нужно было бы их заглушить.

Другие советы

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

Однако я бы не только прокомментировал их, но и полностью удалил эти строки.Просто кажется небрежным поступать иначе.Возможно, я педантичен, но я не думаю, что "производственный" код вообще должен включать в себя "отладочный" код, даже в прокомментированной форме.Если вы вообще оставляете комментарии, эти комментарии должны описывать, что делает код, или стоящие за этим рассуждения, а не блоки отключенного кода.(Хотя большинство комментариев должны быть удалены автоматически в ходе вашего процесса минимизации.Вы сводите к минимуму, не так ли?)

Кроме того, за несколько лет работы с JavaScript я не могу припомнить, чтобы когда-нибудь возвращался к функции и говорил: "Боже, жаль, что я не оставил эту консоль.логи здесь на месте!" В общем, когда я "заканчиваю" работу над функцией, а позже должен вернуться к ней, я возвращаюсь, чтобы исправить какую-нибудь другую проблему.В чем бы ни заключалась эта новая проблема, если консоль.журналы предыдущего раунда работы могли бы оказаться полезными, тогда я бы обнаружил проблему с первого раза.Другими словами, если я вернусь к чему-то, мне вряд ли понадобится точно такая же отладочная информация, какая мне была нужна в предыдущих случаях.

Только мои два цента...Удачи вам!

Если у вас есть сценарий развертывания, вы можете использовать его для удаления вызовов console.log (и уменьшения размера файла).

Пока вы этим занимаетесь, вы можете запустить свой JS через JSLint и зарегистрировать нарушения для проверки (или предотвратить развертывание).

Это отличный пример того, почему вы хотите автоматизировать свое развертывание.Если ваш процесс позволяет вам опубликовать файл js с помощью консоли.войдите в него, в какой-то момент вы будет сделай это.

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

window.console||(console={log:function(){}});

Это первая из 3-х различных версий, в зависимости от того, какие консольные методы вы хотите отключить, все они крошечные и все были протестированы в IE6+ и современных браузерах.

Две другие версии охватывают различные другие консольные методы.Один из них охватывает четыре основы, а другой - все известные консольные методы для firebug и webkit.Опять же, в файлах минимально возможного размера.

Этот проект находится на github: https://github.com/andyet/ConsoleDummy.js

Если вы можете придумать какой-либо способ еще больше минимизировать код, мы приветствуем ваш вклад.

-- РЕДАКТИРОВАТЬ - 16 мая 2012

С тех пор я усовершенствовал этот код.Он по-прежнему крошечный, но добавляет возможность включать и выключать консольный вывод: https://github.com/HenrikJoreteg/andlog

Это было показанный на шоу Список изменений

Вы должны, по крайней мере, создать манекен console.log если объект не существует, чтобы ваш код не выдавал ошибок на компьютерах пользователей без установленного firebug.

Другой возможностью было бы запустить ведение журнала только в "режиме отладки", т. Е. если установлен определенный флаг:

if(_debug) console.log('foo');
_debug && console.log('foo');

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

Очевидно, что если вы используете другие методы, такие как console.info и т.д., вы можете воспроизвести эффект.когда закончите с вашей промежуточной средой, просто измените значение C.debug по умолчанию на false для рабочей среды, и вам не придется изменять какой-либо другой код / удалять строки и т.д.Очень легко вернуться к нему и отладить позже.

var C = {
    // console wrapper
    debug: true, // global debug on|off
    quietDismiss: false, // may want to just drop, or alert instead
    log: function() {
        if (!C.debug) return false;

        if (typeof console == 'object' && typeof console.log != "undefined") {
            console.log.apply(this, arguments); 
        }
        else {
            if (!C.quietDismiss) {
                var result = "";
                for (var i = 0, l = arguments.length; i < l; i++)
                    result += arguments[i] + " ("+typeof arguments[i]+") ";

                alert(result);
            }
        }
    }
}; // end console wrapper.

// example data and object
var foo = "foo", bar = document.getElementById("divImage");
C.log(foo, bar);

// to surpress alerts on IE w/o a console:
C.quietDismiss = true;
C.log("this won't show if no console");

// to disable console completely everywhere:
C.debug = false;
C.log("this won't show ever");

кажется, у меня это работает...

if (!window.console) {
    window.console = {
        log: function () {},
        group: function () {},
        error: function () {},
        warn: function () {},
        groupEnd: function () {}
    };
}

Решил, что разделю другую точку зрения.Оставляя этот тип вывода видимым для внешнего мира в приложении PCI, вы не соответствуете требованиям.

Я согласен, что заглушка консоли - это хороший подход.Я пробовал различные консольные плагины, фрагменты кода, в том числе некоторые довольно сложные.У всех них были какие-то проблемы по крайней мере в одном браузере, поэтому в итоге я выбрал что-то простое, как показано ниже, представляющее собой объединение других фрагментов, которые я видел, и некоторых предложений команды YUI.Похоже, он функционирует в IE8 +, Firefox, Chrome и Safari (для Windows).

// To disable logging when posting a production release, just change this to false.
var debugMode = false;

// Support logging to console in all browsers even if the console is disabled. 
var log = function (msg) {
    debugMode && window.console && console.log ? console.log(msg) : null;
};

Примечание: Он поддерживает отключение входа в консоль с помощью флага.Возможно, вы могли бы автоматизировать это и с помощью сценариев сборки.В качестве альтернативы, вы могли бы предоставить пользовательский интерфейс или какой-либо другой механизм для переключения этого флага во время выполнения.Конечно, вы можете стать намного более изощренным, используя уровни ведения журнала, отправку журналов ajax на основе порога регистрации (напримервсе инструкции уровня ошибок передаются на сервер для хранения там и т.д.).

Многие из этих потоков / вопросов, связанных с протоколированием, похоже, рассматривают операторы log как отладочный код, а не код приборостроение.Отсюда и желание удалить лог-инструкции.Инструментарий чрезвычайно полезен, когда приложение находится в стадии разработки и подключить отладчик уже не так просто или информация поступает к вам от пользователя или через службу поддержки.Вы никогда не должны регистрировать что-либо конфиденциальное, независимо от того, где оно было зарегистрировано, поэтому конфиденциальность / безопасность не должны быть скомпрометированы.Как только вы начинаете думать о протоколировании как об инструментировании, оно становится производственным кодом и должно быть написано в соответствии с тем же стандартом.

С приложениями, использующими все более сложный javascript, я думаю, что инструментирование имеет решающее значение.

Как упоминают другие, это выдаст ошибку в большинстве браузеров.В Firefox 4 это не выдаст ошибку, сообщение регистрируется в консоли веб-разработчика (новое в Firefox 4).

Одним из способов устранения таких ошибок , который мне действительно понравился , было де&&ошибка:

var de = true;
var bug = function() { console.log.apply(this, arguments); }

// within code
de&&bug(someObject);

Хороший однострочник:

(!console) ? console.log=function(){} : console.log('Logging is supported.');
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top