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) { ...