JavaScript - как minfy / обфусцировать имена глобальных функций? - PullRequest
2 голосов
/ 18 апреля 2011

У меня есть некоторый код, который имеет следующий формат:

function myfunc1 () { ... jquery.bind('click', myfunc2) ... }
function myfunc2 () { ... }
...

Да, функции глобальные, но это нормально, так как я пишу в скрипте содержимого расширения Google Chrome, поэтому он помещен в "песочницу".

Теперь я пытаюсь минимизировать и запутать код.Я пробовал YUI Compressor и компилятор Google Closure.Проблема в том, что я не могу понять, как минимизировать / запутать глобальные имена функций.С YUI это не минимизирует глобальные переменные в случае, если они вызываются извне.В закрытом режиме в расширенном режиме кажется, что он может переименовывать глобальные переменные, однако у меня проблемы с удалением мертвого кода.Кажется, что большинство функций мертвы, поскольку они зависят от взаимодействия DOM и обработки событий и не вызываются напрямую.

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

Ответы [ 4 ]

10 голосов
/ 18 апреля 2011

Минификаторы не будут взламывать публичные / глобальные имена, так как для многих скриптов это разрушит доступность и предсказуемость публичного API.

Поскольку вам не нужно поддерживать публичный API, делая их«private», заключив их в функцию замыкания, может быть достаточно:

(function () {

    function myfunc1 () { ... jquery.bind('click', myfunc2) ... }
    function myfunc2 () { ... 
    ...

})();

Но даже в этом случае никаких гарантий нет, так как это очень на усмотрение авторов минификатора.

1 голос
/ 18 апреля 2011

Пожалуйста, смотрите онлайн-документы для компилятора Closure.

Другими словами:

  1. «Экспорт» функций, которые вы хотите сохранить
  2. Создайте файл "externs" с функциями, которые вы не хотите переименовывать
  3. Запустить компилятор закрытия в расширенном режиме
1 голос
/ 18 апреля 2011

См. Семантические конструкции JavaScript Obfuscator . Дает вам полный контроль над тем, какие символы скрыты, а какие нет, именно так вы можете управлять такими ситуациями. Не нужно менять свой рабочий код.

Я работаю на них.

0 голосов
/ 10 января 2013

Вы можете сделать локальные ссылки на часто используемые функции jQuery в вашем коде, которые затем будут минимизированы?

Например:

$(function() {
   var jQueryAnimate = $.animate,
       jQueryAddClass = $.addClass;

   $('.foo').jQueryAddClass('.bar');
});
...