2016-03-30 129 views
0

我想使用Google Closure編譯器編譯jQuery 2.0.0。當我這樣做使用this extern其狀態Externs for jQuery 1.9 - 1.11 & 2.0 - 2.1使用Google Closure編譯器編譯jQuery提供了Uncaught TypeError

我得到以下錯誤:Uncaught TypeError: Cannot read property 'source' of undefined。這標誌了下面的一段編譯代碼:

d.each(d.i.match.ja.source.match(/\w+/g), function(a, b) { 
    var c = ra[b] || d.find.attr; 
    ra[b] = function(a, b, d) { 
    var h, k; 
    d || (k = ra[b], 
     ra[b] = h, 
     h = null != c(a, b, d) ? b.toLowerCase() : null, 
     ra[b] = 
     k); 
    return h 
    } 
}); 

該代碼對應於在這裏的非編譯代碼:

jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(i, name) { 
    var getter = jQuery.expr.attrHandle[name] || jQuery.find.attr; 

    jQuery.expr.attrHandle[name] = getSetInput && getSetAttribute || !ruseDefault.test(name) ? 
    function(elem, name, isXML) { 
     var fn = jQuery.expr.attrHandle[name], 
     ret = isXML ? 
     undefined : 
     /* jshint eqeqeq: false */ 
     (jQuery.expr.attrHandle[name] = undefined) != 
     getter(elem, name, isXML) ? 

     name.toLowerCase() : 
     null; 
     jQuery.expr.attrHandle[name] = fn; 
     return ret; 
    } : 
    function(elem, name, isXML) { 
     return isXML ? 
     undefined : 
     elem[jQuery.camelCase("default-" + name)] ? 
     name.toLowerCase() : 
     null; 
    }; 
}); 

下面就是我進入在線閉合編譯:

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @output_file_name default.js 
// @code_url https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.js 
// @externs_url https://raw.githubusercontent.com/google/closure-compiler/master/contrib/externs/jquery-1.9.js 
// ==/ClosureCompiler== 
// ADD YOUR CODE HERE 

$("#foo").html("Example Text"); 

我想知道是否有人知道如何修復extern,以便它可以與更高版本的jQuery一起工作,或者如果有一個extern可用於任何地方的更高版本?

+0

可能的重複[如何使jQuery與谷歌封閉編譯器](http://stackoverflow.com/questions/16461915/how-to-make-jquery-work-with-google-closure-compiler) –

回答

0

您使用的外部沒有在任何地方定義expr。 (我沒有找到jQuery.expr的在線文檔,你確定這是jQuery的一部分嗎?)。

我建議你的代碼開始加入一些「完整性檢查」,像這樣:

goog.require('goog.asserts'); 
goog.asserts.assert(goog.isFunction(jQuery.each)); 
goog.asserts.assert(goog.isObject(jQuery.expr)); 
goog.asserts.assert(goog.isObject(jQuery.expr.match)); 
goog.asserts.assert(goog.isObject(jQuery.expr.match.bool)); 
goog.asserts.assert(goog.isObject(jQuery.expr.match.bool.source)); 
goog.asserts.assert(goog.isFunction(jQuery.expr.match.bool.source.match)); 

這將有助於顯示,如果你的實習醫生與關閉編譯工作。

也用於調試使用簡單編譯,甚至更好的運行未編譯。

extern可能不完整,您可以製作自己的副本並對其進行編輯。但是我認爲你需要重新編譯編譯器(我相信extern會成爲compiler.jar文件的一部分)。

+0

Externs是用於外部代碼的 - 提問者正在編譯jQuery的源代碼。 jQuery源與編譯器的ADVANCED_OPTIMIZATIONS模式不兼容。 –

+0

好的,這解釋了爲什麼我沒有找到'jQuery.expr'。同意,jQuery源代碼不會用Closure Compiler進行編譯。我相信你可以使用jQuery作爲未編譯的外部代碼以及用Closure Compiler編譯的代碼(可能不是OP需要的)。 – owler

相關問題