使用Google Closure Compiler编译jQuery会产生Uncaught TypeError

时间:2016-03-30 11:23:47

标签: javascript jquery google-closure-compiler

我想使用Google Closure Compiler编译jQuery 2.0.0。当我使用this extern表示Externs for jQuery 1.9 - 1.11 & 2.0 - 2.1

我收到以下错误: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?

1 个答案:

答案 0 :(得分:0)

您使用的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));

这应该有助于显示您的外部人员是否正在使用Closure Compiler。

另外,对于调试使用simple-compile,甚至更好地运行uncompiled。

extern可能不完整,您可以自己制作副本并进行编辑。但我想你需要重建编译器(我相信externs会成为compiler.jar文件的一部分)。