2015-11-04 41 views
0

我正在使用gulp爲我的項目構建資產管道。我目前使用gulp-uglify來縮小javascript。Minifying javascript使函數不可調用

當Uglify處理我的JS時,它會更改函數名稱,使其不可調用。有誰知道如何防止這種情況發生?

(function() { "use strict"; 

    function Ajax(params, url, callbackFunction) { 
    this.params = params, 
    this.url = url, 
    this.callback = callbackFunction 
    } 

    Ajax.prototype.call = function() { 
    $.ajax({ 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     type: "post", 
     data: this.params, 
     success: this.callback, 
     error: this.callback 
    }); 
    } 
})(); 

成爲

!function(){"use strict";function t(t,a,s){this.params=t,this.url=a,this.callback=s}t.prototype.call=function(){$.ajax({contentType:"application/json; charset=utf-8",dataType:"json",type:"post",data:this.params,success:this.callback,error:this.callback})}}(); 

這改變了Ajax的功能,被稱爲「T」而當我想以實例化一個新的Ajax對象,我得到一個Uncaught ReferenceError: Ajax is not defined

我的調用代碼是

$(document).ready(function() { 
    var ajaxTest = new Ajax("google.com", {}, printTest); 
    console.log(ajaxTest); 
    Ajax.call(); 

    function printTest() { 
    console.log("Hello"); 
    } 
}); 

它被縮小到

$(document).ready(function(){function o(){console.log("Hello")}var l=new Ajax("google.com",{},o);console.log(l),Ajax.call()}); 
+1

您的代碼在縮小前後都會失敗。在這兩種情況下,「Ajax」都不是全球性的,所以它不應該在準備好的文檔中被訪問。 –

回答

1

縮小過程沒有任何問題。 Ajax標識符對於作用域是本地的,所以無論如何它都無法到達作用域之外。該範圍內將使用Ajax標識符的任何代碼將被縮小爲使用t標識符。

如果您想使用的範圍之外Ajax標識符,可以從功能包裝退回它

var Ajax = (function() { "use strict"; 

    function Ajax(params, url, callbackFunction) { 
    this.params = params, 
    this.url = url, 
    this.callback = callbackFunction 
    } 

    Ajax.prototype.call = function() { 
    $.ajax({ 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     type: "post", 
     data: this.params, 
     success: this.callback, 
     error: this.callback 
    }); 
    }; 

    return Ajax; 
})(); 

現在你可以在你的其他代碼中使用Ajax標識符。如果範圍外的Ajax標識符通過縮小代碼而發生更改,則使用該代碼的代碼也將使用該新標識符。

+0

謝謝。這是根本問題。另外,uglifyjs有一個參數「mangle」,可以設置爲false來保留變量名,我剛剛發現了這個變量名。 – Patrick