Javascript 使用Google闭包编译器编译jQuery会产生未捕获的TypeError
我想使用Google闭包编译器编译Javascript 使用Google闭包编译器编译jQuery会产生未捕获的TypeError,javascript,jquery,google-closure-compiler,Javascript,Jquery,Google Closure Compiler,我想使用Google闭包编译器编译jQuery 2.0.0。当我使用extern时,它声明jquery1.9-1.11和2.0-2.1的extern 我得到以下错误:未捕获类型错误:无法读取未定义的属性“source”。标记以下已编译代码: 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
jQuery 2.0.0
。当我使用extern时,它声明jquery1.9-1.11和2.0-2.1的extern
我得到以下错误:未捕获类型错误:无法读取未定义的属性“source”
。标记以下已编译代码:
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;
};
});
该代码对应于此处的非编译代码:
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可用于更高版本?您使用的extern没有在任何地方定义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));
这将有助于显示外部程序是否正在使用闭包编译器
对于调试,也可以使用简单编译,或者更好地使用未编译运行
外部可能不完整,您可以自己复制并编辑它。但是我认为您需要重新构建编译器(我相信externs将成为compiler.jar文件的一部分)。可能的externs副本用于外部代码-询问者正在编译jQuery的源代码。jQuery源代码与编译器的高级优化模式不兼容。好的,这解释了为什么我没有找到jQuery.expr
。同意,jQuery源代码不会使用闭包编译器编译。我相信您可以将jQuery作为未编译的外部代码,与使用闭包编译器编译的自己的代码一起使用(可能不是OP想要的)。