JavaScript перестает работать, когда я сжимаю свой скрипт

Я хочу сжать свои 2000+ строк JavaScript, и я протестировал и http://dean.edwards.name/packer/ и http://closure-compiler.appspot.com/home.

Но в обоих случаях сжатый скрипт выдает мне ошибки. Пример ошибки jQuery(document).Da is not a function,

Почему мой сценарий не работает после оптимизации? И что я могу сделать, чтобы оптимизировать / сжать мой скрипт?

3 ответа

Решение

Вы можете попробовать онлайн YUI Compressor. Это первый результат в Google: http://www.refresh-sf.com/yui/

Убедитесь, что у вас есть точка с запятой в начале каждого файла JavaScript. Странно, я знаю, но вот почему:

У вас может быть что-то вроде этого в одном файле:

function someFunc() {
   ...
}

в следующем файле что-то вроде этого (вот как выглядят плагины jQuery):

(function($) {
   ...
})(jQuery);

Это сжимается в это:

function someFunc(){ }( function($){...} )(jQuery);

Который по сути называет someFunc с function($){...} как аргумент Затем он возьмет все, что возвращается, и предположит, что это функция, и вызовет ее с помощью jQuery в качестве аргумента.

Вот почему большинство плагинов jQuery начинаются с ;(function($){,

Если поставить точку с запятой в начале каждого файла (или в конце, но сделать его согласованным), ваши скрипты будут выглядеть так:

;function someFunc(){ }; (function($){...})(jQuery);

Таким образом, ваши сценарии будут интерпретироваться как задумано.

У меня были такие же проблемы. каждый раз, когда я хотел минимизировать свои javascript-файлы, включая несколько jquery-плагинов, я получал ошибку. Сначала я попытался решить проблемы с дополнительными точками с запятой, как объяснил nicholaides в своем последнем посте. даже с его советом я не смог минимизировать мой js-файл без ошибок. после этого я изменил следующую строку в каждом плагине jquery и работал на меня; например:

(function($) {
$.fn.defaultInputs = function(settings) { ...

я упростил до

jQuery.fn.defaultInputs = function(settings) { ...
Другие вопросы по тегам