Подтвердить что ты не робот

Jquery 1.9.0 и modernizr не могут быть минимизированы с помощью ASP.NET Web Optimization Framework

Мы используем ASP.NET Web Optimization Framework с пакетами и минимизацией. В одном комплекте есть jquery и modernizr. Все это отлично работало с jquery 1.8.3, но поскольку мы обновили до версии 1.9.0, пакет jquery/modernizer больше не работает.

bundles.Add(new ScriptBundle("~/st-scripts-load-first.js")
       .Include("~/Resources/JavaScript/jquery-1.9.0.js",
                "~/Resources/JavaScript/modernizr.form-placeholder.js"));

В каталоге есть как jquery-1.9.0.js, так и jquery-1.9.0.min.js. Если нет .min файла, инфраструктура оптимизации будет генерировать ее автоматически. Это не работает, если файл .min есть или нет.
Он работает, если компиляция debug = "true", и не существует никаких ограничений или связывания.

/* Minification failed. Returning unminified contents.
(5,2-3): run-time warning JS1195: Expected expression: *
(11,60-61): run-time warning JS1004: Expected ';': {
(395,2-3): run-time warning JS1195: Expected expression: )
(397,21-22): run-time warning JS1004: Expected ';': {
(397,4590-4591): run-time warning JS1195: Expected expression: )
(398,28-29): run-time warning JS1195: Expected expression: )
(398,84-85): run-time warning JS1002: Syntax error: }
(402,44-45): run-time warning JS1195: Expected expression: )
(408,1-2): run-time warning JS1002: Syntax error: }
(393,5-22): run-time warning JS1018: 'return' statement outside of function: return Modernizr;
(404,5,406,16): run-time warning JS1018: 'return' statement outside of function: return !!('placeholder' in (Modernizr.input || document.createElement('input')) &&
               'placeholder' in (Modernizr.textarea || document.createElement('textarea'))
             );
 */
4b9b3361

Ответ 1

Я уверен, что причиной вашей проблемы является последняя строка jquery-1.9.0.min.js:

//@ sourceMappingURL=jquery.min.map

Неопределенная версия jQuery 1.9 не содержит этого. Я объясню, почему через минуту.

Я заметил, что когда jquery-1.9.0.min.js связан с другим файлом - и этот другой файл следует за jquery-1.9.0.min.js - тогда следующий JS файл будет таким образом говорящих, испорченных.

Причина в том, что начало следующего файла добавляется к строке "//@" jQuery, а это значит, что он становится длинным расширенным комментарием. В вашем случае это означало, что

window.Modernizr=function(n,t,i){function...

script в начале Modernizr был выведен из процесса объединения как комментарий, например:

//@ sourceMappingURL=jquery.min.map window.Modernizr=function(n,t,i){function...

Здесь обсуждается обсуждение jQuery Bug Tracker.

Ваши варианты - либо удалить эту последнюю строку, либо обернуть ее в многострочные символы комментариев:

/*
//@ sourceMappingURL=jquery.min.map
*/

Кроме того, вы можете видеть, что Modernizr также содержит исходную карту в конце своей сокращенной версии. И не без оснований.

Обоснование этого заключается в том, чтобы помочь вам в отладке проблемы при использовании мини-версии кода. Эта строка сообщает браузеру, что этот миниатюрный файл сопоставляется с другим файлом, который может помочь в отладке. Чтобы воспользоваться этим, вы должны иметь этот файл (jquery.min.map), указанный на сервере, или загрузить его клиенту. Кроме того, я считаю, что Chrome - единственный браузер, поддерживающий это сейчас; он все еще находится в разработке в Firefox.

Эта страница имеет отличное объяснение исходных карт.

Таким образом, удаление этого файла не должно вызывать никаких проблем, если вы не захотите вернуться к исходной версии источника во время отладки в браузере. В вашем случае, из-за того, как работает ASP.NET Framework Optimization Framework, когда debug = "True", он все равно будет обслуживать неограниченные версии, поэтому вам, вероятно, не нужно использовать sourceMappingURL.

Ответ 2

Я не смог ответить на ответ awj выше, поэтому я просто проголосовал. Фантастическая часть детективной работы. Я хотел добавить к комментарию, что, хотя проблема действительно была исправлена ​​в jquery 1.9.1, она теперь отображается в jquery-migrate-1.1.0

Я заметил, что ссылка на файл карты представляет собой только однострочный комментарий в конце файла jquery-migrate-1.1.0.min.js. Поэтому, следуя предложению awj, я сделал многострочный комментарий.

Итак, строка 3:

//@ sourceMappingURL=dist/jquery-migrate.min.map

теперь становится линиями 3, 4 и 5 следующим образом:

/*
//@ sourceMappingURL=dist/jquery-migrate.min.map
*/

Как только я загрузился обратно к своему интернет-провайдеру, у меня снова появилась полная функциональность ajax.

Еще раз спасибо AWJ, это очень помогло!

Ответ 3

Считывая ответы, даже принятый ответ, рекомендуемое решение этой проблемы заключается в изменении ваших сценариев, поэтому у комплектатора нет никаких проблем с этим. Это не имеет для меня никакого смысла, это, очевидно, ошибка поставщика, который не конкатенирует разные сценарии должным образом, особенно у укладчика есть проблема, когда последняя строка n script является нормальным комментарием линии

// this is the last line of the n script

а затем ваш следующий script не запускается с комментариями одной строки

function(){ var ...

наборщик по умолчанию сконфигурирован с ; как ConcatenationToken, поэтому вложенный код заканчивается примерно следующим образом:

// this is the last line of the n script;function(){ var ...

Конечно, загрузка script не выполняется с синтаксической ошибкой где-то.

Было предложено изменить последнюю строку script, чтобы не быть встроенным комментарием, сделать его многострочным комментарием, поэтому, когда код заканчивается на */, парсер будет в порядке с объявлением функции или чем-то иначе сразу после него.

Мне не нравится изменять мои скрипты, многие из них создаются кем-то другим (jquery и т.д.), и я не хочу их изменять, что делать, если я должен их обновить и снова найду эту ошибку после обновления веб-сайт, и он не работает с debug="true" в конфигурации.

Я прихожу с этим решением, работающим лучше для меня

bundles.Add(new ScriptBundle("~/bundles/mobile") { 
                ConcatenationToken = ";\r\n" }
       .Include("~/Scripts/jquery-1.11.3*",
                "~/Scripts/jquery-timeago*",
                "~/Scripts/jquery.mobile-1.4.5*",

Таким образом мы вынуждаем связки всегда отделять скрипты с новым символом строки. Он должен делать это по умолчанию, когда последняя строка предыдущего script является комментарием одной строки.

Ответ 4

Возможно, что-то не так с вашей копией modernizr.form-placeholder.js.

Я просто столкнулся с такой же ошибкой, пытаясь загрузить jquery.peity.js.

Когда я удалил библиотеку, страница была загружена в порядке. Поэтому я просто пошел и схватил сырые js со своего сайта и переделал файл, и он загрузился без проблем.