JavaScript перестает работать, когда я сжимаю свой скрипт - PullRequest
5 голосов
/ 17 ноября 2009

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

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

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

Ответы [ 3 ]

6 голосов
/ 17 ноября 2009

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

Возможно, что-то вроде этого в одном файле:

function someFunc() {
   ...
}

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

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

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

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

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

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

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

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

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

3 голосов
/ 17 ноября 2009

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

0 голосов
/ 16 сентября 2010

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

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

я упростил до

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