Можно ли сделать компилятор Google Closure * не * встроенным в определенные функции? - PullRequest
6 голосов
/ 28 ноября 2010

Компилятор Closure вставляет функцию, но размер кода меньше, если эта функция не встроена (меня интересует только размер кода - это для JS1k ).Могу я сказать компилятору, что я не хочу, чтобы эта функция была встроенной?

Редактировать: Просто, чтобы объяснить немного лучше, вот моя функция:

function lineTo(x,y) {
  a.lineTo(x,y);
}

гдеa в контексте холста.Поскольку в коде так много a.lineTo s, использование этой функции того стоит.Таким образом, мой код составляет 1019 байт (и все lineTo заменены на a.lineTo).Если я изменю функцию на:

function lineTo(x,y) {
  a.lineTo(x,y);
  console.log();
}

, новая строка каким-то образом заставит компилятор не включать эту функцию, что дает мне 993 байта.Поэтому, если бы я мог избавиться от console.log();, я бы сохранил еще 14 байтов.

1 Ответ

4 голосов
/ 28 ноября 2010

С учебник :

Если ... вы обнаружите, что Closure Compiler удаляет функции, которые вы хотите сохранить, есть два способа предотвратить это:
* Переместите ваши вызовы функций в код, обработанный компилятором Closure.
* Экспорт символов, которые вы хотите сохранить.

Возможно, вам нужен второй, который обсуждается здесь , но в основном сводится к явной установке его как window свойство:

function foo() {
}
window['foo'] = foo;

Для отправки в JS1k вы просто оставляете последнюю строку отключенной, поскольку она не нужна.обратите внимание, что Closure по-прежнему переименовывает функцию, но, поскольку она начинает переименовывать ваши символы с именем a и продолжается оттуда, вряд ли ваши имена будут на длиннее в целом.Попробуйте это с онлайн-сервисом компилятора .Если вы вставите это в:

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// ==/ClosureCompiler==

// ADD YOUR CODE HERE
function hello(name) {
  alert('Hello, ' + name);
}
hello('New user');

... скомпилированный результат будет

alert("Hello, New user");

Но если вы добавите

window['hello'] = hello;

... до конца, скомпилированный результат:

function a(b){alert("Hello, "+b)}a("New user");window.hello=a;
...