Должен ли я удалить 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)) }
});