[英]How can I make console.log(sum(1)) // 1 and console.log(sum(1,2)(3)) //6 work?
[英]How to make console.log configurable
在我的web-app中(在客戶端很重,在服務器端輕松),在開發中,我需要做很多調試, console.log
非常有用,但理想情況下在生產中,一定不能顯示任何調試消息,所以我打算添加以下代碼:
window.production = false; // set to true when in production mode.
if(window.production){
window.log = function(){};
}else{
window.log = function(){
console.log.apply(console, arguments);
};
}
//then replace all console.log(a, b, c, ...) into window.log(a, b, c, ...) in my code.
這是一個使調試可配置的好方法,或者我是否只需要刪除所有用於生產的console.log
行的grunt
?
因此,如果你唯一的目標是不在生產中顯示調試消息,那么你有大量的選擇可供選擇! 您還應該決定以下內容對您是否重要:
在一個非常基本的層面上簡單地呼叫
if (window.console && window.console.log)
{
window.log = console.log.bind(console); // function devnull() { };
}
else
{
window.log = function() { };
}
log('This is a log!');
足以讓你打開/關閉登錄。 這將滿足上面列表中的目標(5)並且運行良好。
一個替代解決方案適用於像uglify這樣可以刪除死代碼的縮小器,可以用你喜歡的東西包圍你的日志記錄語句(你可能不想污染全局命名空間):
window.LogLevels =
{
Off: 0x00000000,
Error: 0x00000001,
Warning: 0x00000002,
Timing: 0x00000004,
Data: 0x00000008,
Status: 0x00000010,
...
Verbose: 0x04000000,
};
window.LogLevel = LogLevels.Error | LogLevels.Warning;
window.ShouldLog = function(mask)
{
return ((window.LogLevel & mask) === mask);
};
if (ShouldLog(LogLEvels.Error)) { log('This is an error!'); }
這將滿足條件(1),(3)和(4),並以(5)為代價設置解決(2)。
結合預定義的DEBUG常量(或類似),在構建步驟中,您可以使用正則表達式替換日志語句:
productionCode = debugCode.replace(/ShouldLog\(((?!LogLevels\.Error|LogLevels\.Warning)[^)]*)\)/g, 'DEBUG');
這將完全刪除代碼中的非錯誤和非警告級別日志記錄並滿足(2)。 你真的不希望有人偷看你的日志..加上更好的性能! :)
獎勵如果您想獲得額外的時髦,可以使用以下內容(至少在Chrome中)為控制台中的每個日志記錄語句獲取堆棧跟蹤。 沒有更多'為什么這個日志被擊中'!
window.log = function ()
{
console.groupCollapsed.apply(console, arguments);
var stack = new Error().stack.split('\n');
for(var i = 2; i < stack.length; i ++)
{
// Trim and remove 'at ';
console.log('%c' + stack[i].trim().substring(3), 'padding-left: 10px; color: #777');
}
console.groupEnd();
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.