1

Я компилирую свой код с помощью компилятора Google Closure.Ошибка при компиляции кода с компилятором Google Closure

Код, который я компилирую, - это соответствующие части из библиотеки закрытия, Hammer, Hammer-Time и некоторые из моих собственных кодов.

Компиляция работает, пока я не добавить Молоток для компиляции, в какой момент, когда я запускаю мой JavaScript Я получаю следующее сообщение об ошибке:

Uncaught TypeError: n.add is not a function 

, которая относится к:

function mb(a, c, e, l, f, k) { 
    if (!c) 
     throw Error("Invalid event type"); 
    var h = !!f 
     , n = nb(a); 
    n || (a[ib] = n = new V(a)); 
    e = n.add(c, e, l, f, k); 
    if (!e.b) { 
     l = Jb(); 
     e.b = l; 
     l.src = a; 
     l.listener = e; 
     if (a.addEventListener) 
      a.addEventListener(c.toString(), l, h); 
     else if (a.attachEvent) 
      a.attachEvent(Kb(c.toString()), l); 
     else 
      throw Error("addEventListener and attachEvent are unavailable."); 
     kb++ 
    } 
} 

Если я переименовывать функция add в Hammer Я не понимаю эту проблему, но мне было интересно, есть ли альтернатива этому?

Команда полного закрытия Компилятор:

ответ

1

Hammer.js написана с JSDoc комментариями, которые близки, но не полностью совместимы с комментариями, используемых Google Closure Compiler. Я предполагаю, что это источник вашей ошибки, но для этого потребуется больше отладки. См. Эту страницу о Debugging Compiled Code, если вы все еще хотите попытаться скомпилировать Hammer.js вместе с вашим кодом. Я подозреваю, что вам нужно будет немного изменить код Hammer.js, чтобы заставить его работать с Closure Compiler.

Другой вариант - создать «внешний файл», который сообщает Closure Compiler API for Hammer. После компиляции вашего кода с помощью Closure Compiler вызовы Hammer останутся неопределенными, и вы загрузите Hammer (уже измененную версию, найденную на веб-сайте Hammer) на целевой HTML-странице перед загрузкой кода. См. How do I write an externs file?.

Один из примеров того, как комментарии Doc различаются между JSDoc и закрытием Компилятором: JSDoc использует @param {Number} тогда Закрытие Компилятор считает, что в качестве ссылки на тип обертки и использует @param {number} для примитивного типа номера.