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'))
);
*/
Ответы
Ответ 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 со своего сайта и переделал файл, и он загрузился без проблем.