Погана ідея залишити дзвінки “console.log ()” у своєму робочому коді JavaScript?


77

У мене є багато console.log()дзвінків у моєму JavaScript.

Чи варто їх коментувати перед тим, як перейти на виробництво?

Я хотів би просто залишити їх там, тому мені не доведеться піти на проблему повторного додавання коментарів пізніше, якщо мені потрібно буде робити якісь додаткові налагодження. Це погана ідея?


1
Для тих , хто шукає кутові версії цього питання: stackoverflow.com/questions/42307317 / ...
rmcsharry

Відповіді:


119

Це спричинить помилки Javascript, припиняючи виконання блоку Javascript, що містить помилку.

Однак ви можете визначити фіктивну функцію, яка не діє, коли Firebug не активний:

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

Якщо ви використовуєте будь-які інші методи, окрім того log, вам також потрібно буде їх заглушити.


Дякую. Це виглядає як хороший обхідний шлях. Дозвольте подивитися, чи я це розумію. Ви кажете, якщо консоль невизначена, тоді встановіть для консолі порожню функцію. Я не розумію синтаксис двокрапки після 'log'. Що це робить і чому все в дужках після "console ="?
Чарлі Коттер,

2
Фігурні дужки визначають літерал об’єкта: developer.mozilla.org/en/Core_JavaScript_1.5_Guide/… та біт "function () {}" визначає анонімну функцію, яка не приймає аргументів і нічого не робить. (Досі працює виклик "console.log (foo)" з аргументом, оскільки JS байдуже, чи викликаєте ви функцію із занадто великою кількістю аргументів.)
Джейсон Крейтон,

Зрозуміло. Дякую і за посилання.
Чарлі Коттер

1
Відмінне рішення людина !! :-) У мене щойно була ця проблема днями. Моя сторінка працювала у FF лише тоді, коли був включений FireBug, і вона випадково зупинялася на певних діях в IE. Я був як WTF!?! І тоді я зрозумів, що у мене все ще є дзвінки console.log, і мені довелося пройти їх і видалити. Я, швидше за все, зараз додам ваше рішення до мого головного файлу JS і ніколи більше не буду турбуватися про цей невдалий сценарій.
KyleFarris

6
У мене є невеликий (модульно протестований) проект, який допоможе вам зробити саме це за допомогою різних методів консолі з мінімальною кількістю коду. Він знаходиться тут: github.com/andyet/ConsoleDummy.js
Хенрік Йоретег

38

Як інші вже вказували на це, залишення його буде спричиняти помилки в деяких браузерах, але ці помилки можна усунути, додавши деякі заглушки.

Однак я б не лише коментував їх, а й відверто видалив ці рядки. Здається, це недбало робити інакше. Можливо, я налаштований педантично, але я не думаю, що "виробничий" код повинен взагалі містити код "налагодження", навіть у коментованій формі. Якщо ви взагалі залишаєте коментарі, ці коментарі повинні описувати, що робить код, або міркування за цим, а не блоки відключеного коду. (Хоча, більшість коментарів слід автоматично видаляти в процесі зменшення. Ви мінімізуєте, так?)

Крім того, за кілька років роботи з JavaScript я не пам’ятаю, щоб коли-небудь повертався до функції і говорив: "Боже, я хотів би залишити ці console.logs тут!" Загалом, коли я закінчую роботу з функцією, а пізніше мені до неї повертається, я повертаюся, щоб вирішити якусь іншу проблему. Якою б не була нова проблема, якщо б console.logs попереднього циклу роботи могли бути корисними, тоді б я помітив проблему вперше. Іншими словами, якщо я до чогось повернусь, мені, швидше за все, не знадобиться точно та сама інформація про налагодження, яка потрібна мені раніше.

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


1
проблема часто під час виробничого циклу, оскільки щось налагоджується або тестується, люди розглядають це поза командою розробників, яка не має консолі розробника. мої особисті уподобання полягають у тому, щоб програма не померла на них, тому ми не отримуємо дзвінків на кшталт "ваш новий код для мене нічого не робить".
Dimitar Christoff

10
Постійні рядки налагодження є фантастичними. Вони означають, що вам часто не доводиться шукати навколо джерела помилки, але ви можете відразу бачити, що відбувається. Є багато розділів коду, де оператор журналу не призведе до значної різниці в продуктивності.
Casebash

4
Хороші рубки повинні бути корисними для різних цілей. Сказання про те, що оператори log () були корисними лише для налагодження однієї проблеми, нагадує мені ведення журналу Java людьми, які не знають, як правильно писати журнали.
Thomas W,

7
Коротше кажучи: реєструйте основні (високорівневі) рішення та обробку подій, щоб можна було стежити за бізнесом, інтерфейсом високого рівня та основними процесами обробки подій. Вони цінні безперервно для розробки додатків. Протоколювання "введення методу A", "виходу з методу A", "param1 77" - це OTOH погане ведення журналу.
Thomas W,

10

Якщо у вас є сценарій розгортання, ви можете використовувати його, щоб видалити виклики до console.log (і зменшити файл).

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

Це чудовий приклад того, чому ви хочете автоматизувати своє розгортання. Якщо ваш процес дозволяє опублікувати js-файл із консоллю.logs, ви в якийсь момент це зробите.


9

Наскільки мені відомо, не існує коротшого методу затухання, console.logніж наступні 45 символів:

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

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

Інші дві версії охоплюють різні інші методи консолі. Один охоплює чотири основи, а інший - усі відомі консольні методи для firebug та webkit. Знову ж таки, у найменших можливих розмірах файлів.

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

Якщо ви можете придумати будь-який спосіб мінімізації коду, внески вітаються.

- EDIT - 16 травня 2012 р

З тих пір я вдосконалив цей код. Він все ще крихітний, але додає можливість увімкнення та вимкнення виводу консолі: https://github.com/HenrikJoreteg/andlog

Це було представлено на The Changelog Show


5

Слід хоча б створити манекен console.log якщо об'єкт не існує, щоб ваш код не видавав помилок на машинах користувачів без встановленої firebug.

Іншою можливістю було б запускати журналювання лише у "режимі налагодження", тобто якщо встановлено певний прапор:

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

Погодьтеся з Крістофом, для Safari це не буде проблемою, але в інших браузерах він видаватиме помилки і може зупинити JavaScript, щоб продовжити. Взагалі не гарна ідея ...
Сінан

5

Сподіваюся, це комусь допоможе - я вже деякий час тому писав обгортку, дещо гнучкішу, ніж прийняте рішення.

Очевидно, що якщо ви використовуєте інші методи, такі як 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");

4

здається, це працює для мене ...

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

3

Зрозумів, я поділюсь іншою перспективою. Залишення цього типу вихідних даних видимим для зовнішнього світу у програмі PCI робить вас невідповідними.


Ніколи б мені не спало на думку. Дякую.
Чарлі Коттер,

Можливо, він посилається на en.wikipedia.org/wiki/… ...
Саймон Іст

2
Отже, коли хтось клацає правою кнопкою миші на вашому сайті, щоб переглянути джерело, це робить вас невідповідним?
Dan Loewenherz

2

Я згоден, що заглушка консолі - це хороший підхід. Я пробував різні консольні плагіни, фрагменти коду, включаючи деякі досить складні. Всі вони мали певні проблеми принаймні в одному браузері, тому в підсумку я отримав щось просте, як показано нижче, що є об’єднанням інших фрагментів, які я бачив, та кількох пропозицій від команди 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 на основі порогу журналу (наприклад, усі оператори рівня помилок передаються на сервер для зберігання там тощо).

Багато з цих потоків / питань навколо ведення журналу, здається, вважають оператори журналу кодом налагодження, а не інструментарієм коду . Звідси бажання видалити оператори журналу. Контрольно-вимірювальні прилади надзвичайно корисні, коли програма перебуває в дикій природі, і приєднати налагоджувач вже не так просто, або інформація надходить до вас від користувача або через підтримку. Ви ніколи не повинні реєструвати щось конфіденційне, незалежно від того, де це було зареєстровано, тому конфіденційність / безпека не повинна бути порушена. Як тільки ви вважаєте ведення журналу як контрольно-вимірювальних приладів, воно тепер стає виробничим кодом і повинно бути записано за тим самим стандартом.

З додатками, що використовують все більш складний javascript, я думаю, що інструментарій є критичним.


1

Як вже згадували інші, це спричинить помилку у більшості браузерів. У Firefox 4 помилка не з’являється, повідомлення реєструється на консолі веб-розробника (нове у Firefox 4).

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

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

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

0

Гарний однокласник:

(!console) ? console.log=function(){} : console.log('Logging is supported.');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.