Как я могу сказать Closure Compiler не переименовывать внутреннюю функцию с помощью SIMPLE_OPTIMIZATIONS? - PullRequest
3 голосов
/ 28 февраля 2012

Как я могу сказать Closure Compiler не переименовывать внутреннюю функцию? Например, с учетом этого кода:

function aMeaninglessName() {
    function someMeaningfulName() {
    }

    return someMeaningfulName;
}

... Я в порядке с Closure, переименовывающим внешнюю функцию (я активно этого хочу, чтобы сэкономить место), но я хочу, чтобы имя функции someMeaningfulName оставалось в покое (чтобы имя, показанное в вызове, стекало для нее это "someMeaningfulName", а не "a" или что-либо еще). И это несмотря на то, что код, вызывающий его, будет делать это через ссылку, возвращаемую фабричной функцией, а не по имени в коде. Например, это только для поддержки отладки.

Обратите внимание, что я хочу, чтобы у функции было , имеющее фактическое имя , чтобы она не была анонимной и присваивалась какому-либо свойству, использующему это имя, поэтому, например, это не дубликат этот другой вопрос .

Этот несколько непонятный вариант использования, по-видимому, не охватывается ни внешними функциями, ни функциями экспорта. (Я надеялся, что там будет какая-то аннотация , которую я мог бы бросить на это.) Но я не гуру Closure Compiler, я надеюсь, что некоторые из вас. Естественно, если это просто невозможно, это приемлемый ответ.


(Вариант использования - это библиотека, которая создает функции в ответ на вызовы в нее. Я хочу предоставить версию библиотеки, которая была предварительно сжата с помощью Closure с SIMPLE_OPTIMIZATIONS, но если кто-то использует эту копию библиотеки с их собственный несжатый код и один шаг в функцию в отладчике [или других подобных операциях], я хочу, чтобы они увидели осмысленное имя. Я мог бы обойти его с помощью eval или вручную отредактировать сжатый результат [на самом деле, контекст достаточно уникален, я мог бы бросить в него сценарий sed, но это неловко и откровенно переносит нас на «не стоит беспокоиться» территорию, поэтому мы ищем простой, не требующий обслуживания способ.)

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Нет простого способа сделать это. Вам нужно будет создать собственный подкласс класса CodingConvention, чтобы указать, что ваши методы являются «локальными» внешними (была добавлена ​​поддержка этого для обработки библиотеки Prototype). Вполне возможно, что InlineVariables, InlineFunctions или RemoveUsedVariables по-прежнему будут пытаться удалить имя, и их также необходимо исправить.

Другой подход заключается в использовании исходных карт для переназначения трассировки стека в исходный источник.

0 голосов
/ 28 февраля 2012

прочитайте следующий раздел

https://developers.google.com/closure/compiler/docs/api-tutorial3#export

Два варианта в основном, используйте object ['functionName'] = obj.functionName или лучший способ используйте exportSymbol и exportProperty для объекта goog, вот ссылка на документацию для этого

http://closure -library.googlecode.com / SVN / Docs / closure_goog_base.js.html

- редактировать ах, теперь я вижу, мой первый ответ не очень хорош для вас. У компилятора есть несколько интересных флагов, один из которых может вас заинтересовать, это DEBUG, в котором вы можете передавать переменные в компилятор, который позволит вам добавить некоторые отладочные аннотации через логирование или просто строку, которая ничего не делает, поскольку вы используете простой режим.

поэтому, если вы используете замыкание, вы можете отлаживать его в версии для разработки, которая представляет собой просто страницу, построенную с разрешенными зависимостями. мы также добавляем следующее в наш код

if(DEBUG){
  logger.info('pack.age.info.prototype.func');
}
...