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

ASP.NET MVC Bundle не отображает файлы script на промежуточном сервере. Он работает на сервере разработки

В нашем веб-приложении ASP.NET MVC 4 наш BundleConfig.cs включает в себя следующее:

bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                        "~/Scripts/jquery-{version}.js"));

            bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include(
                        "~/Scripts/jquery-ui-{version}.js"));

            bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                        "~/Scripts/jquery.unobtrusive*",
                        "~/Scripts/jquery.validate*"));
            bundles.Add(new ScriptBundle("~/bundles/modernizr").Include(
                        "~/Scripts/modernizr-*"));

Когда мы смотрим на html домашней страницы на сервере разработки, мы можем видеть теги script, даже если режим debug в web.config установлен в true как <compilation debug="true" targetFramework="4.0" />:

<script src="/AFR/Scripts/jquery-ui-1.8.20.min.js"></script>
<script src="/AFR/Scripts/modernizr-2.5.3.js"></script>
<script src="/AFR/Scripts/jquery-1.7.1.js"></script>
<script src="/AFR/Scripts/jquery-ui-1.8.20.js"></script>
<script src="/AFR/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/AFR/Scripts/jquery.validate.js"></script>
<script src="/AFR/Scripts/jquery.validate.unobtrusive.js"></script>

Но когда мы развертываем приложение на промежуточном сервере и смотрим на html (View Source) на домашней странице, все теги script, за исключением <script src="/AFR/Scripts/jquery-ui-1.8.20.min.js"></script>, отсутствуют. Мы проверили, что все файлы, упомянутые в этих тегах, находятся в папке script. Структура папок точно такая же, как на машине разработки. На промежуточном сервере web.config fie имеет <compilation targetFramework="4.0" />, что означает, по умолчанию, debug = "false".

В результате некоторые из функций JavaScript не работают на промежуточном сервере. Обе машины для разработки и разработки - Windows 2012.

Пожалуйста, помогите. Спасибо.

4b9b3361

Ответ 1

Основываясь на ваших комментариях, нам нужно обсудить, как механизм Bundling работает в MVC.

Изменить. На основе приведенного ниже комментария VSDev вам необходимо WebGrease устанавливается в ваш проект. NuGet было бы проще всего установить этот пакет.

Когда вы устанавливаете конфигурацию пучка (пример не сверху для иллюстрации)

bundles.Add(new ScriptBundle("~/bundles/mainJs")
      .Include("~/Scripts/mainSite.js")
      .Include("~/Scripts/helperStuff.js");

Затем вы в своих представлениях вызываете что-то вроде @Scripts.Render("~/bundles/mainJs"). Когда ваш web.config установлен в компиляцию отладки ИЛИ, вы явно отключите связывание, используя следующую строку в файле BundleConfig.cs

BundleTable.EnableOptimizations = false;

Затем, на ваш взгляд, вы увидите следующие отображаемые

<script src="/Scripts/mainSite.js" type="text/javascript"></script>
<script src="/Scripts/helperStuff.js" type="text/javascript"></script>

Это отдельные элементы, которые составляли наш пакет, несжатые и перечисляемые отдельно. Причина, по которой они перечислены отдельно в режиме отладки, заключается в том, что вы можете отлаживать свои сценарии и просматривать их по мере их написания (имена фактических переменных и т.д.).

Теперь, когда мы не находимся в компиляции отладки и не отключили функцию EnableOptimizations, MVC объединит эти файлы в наших пакетах, сжимает (уменьшает) их и выводит только один тег script.

<script src="/bundles/mainJs?v=someBigLongNumber" type="text/javascript"></script>

Обратите внимание, что источник совпадает с именем пакета из конфигураций пучка. Кроме того, число после ?v= изменится при изменении файла в этом пакете. Это поможет предотвратить кэширование старых js и css файлов клиентскими браузерами.

Ваши сценарии все еще существуют и выводятся, но они сжимаются и объединяются в один файл с именем /bundles/mainJs. Эта функция присутствует

A) сжимать файлы и уменьшать передаваемую информацию и

B) уменьшить количество вызовов на веб-сайт, чтобы получить необходимый контент для отображения страницы.

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

Что касается того, что пользовательский интерфейс jQuery по-прежнему является единственным JS файлом, убедитесь, что кто-то не сделал его жесткого кода в вашем представлении макета. Что касается ошибок JS, это могут быть ошибки, которые присутствуют в вашем окне разработки или, возможно, что-то не сжималось правильно (однако во всей моей MVC-разработке я не видел ошибку JS из-за плохой оценки).

Ответ 2

Я столкнулся с той же проблемой, и я не уверен, почему, но оказалось, что ссылка script, сгенерированная Scripts.Render, не имела расширения .js. Поскольку он также не имеет атрибута Type, браузер просто не мог его использовать (chrome и firefox).

Чтобы решить эту проблему, я изменил конфигурацию своего пакета, чтобы сгенерировать скомпилированные файлы с расширением js, например.

            var coreScripts = new ScriptBundle("~/bundles/coreAssets.js")
            .Include("~/scripts/jquery.js");

        var coreStyles = new StyleBundle("~/bundles/coreStyles.css")
            .Include("~/css/bootstrap.css");

Обратите внимание на new StyleBundle(... вместо того, чтобы говорить ~/bundles/someBundle, я говорю ~/bundlers/someBundle.js или ~/bundles/someStyles.css..

Это приводит к тому, что ссылка, сгенерированная в атрибуте src, имеет .js или .css на ней при включении оптимизаций, так как браузеры знают, основываясь на расширении файла, что mime/type использовать в запросе на получение, и все работает.

Если я сниму расширение, все сломается. Это потому, что @Scripts и @Styles не отображает все необходимые атрибуты для понимания src для файла без расширения.

Ответ 4

Для меня было исправлено обновление версии System.Web.Optimization до версии 1.1.0.0. Когда я был в версии 1.0.0.0, он никогда не разрешил файл .map в подкаталоге (то есть правильно минимизировать и связывать скрипты в подкаталог)

Ответ 5

Всякий раз, когда я устанавливаю debug = "off" в моем web.config и запускаю приложение mvc4, я получаю...

<script src="/bundles/jquery?v=<some long string>"></script>

в моем html-коде и ошибке JavaScript

Expected ';'

Было 2 способа избавиться от ошибки javascript

  • установить BundleTable.EnableOptimizations = false в BundleConfig.cs

ИЛИ

  1. Я закончил использование диспетчера пакетов NuGet для обновления WebGrease.dll. Он отлично работает, если debug = "true" или debug = "false".

Ответ 6

Я использовал Identity2, затем скрипты не загружались для анонимного пользователя, тогда я добавляю этот код в webconfig и в словах.

<location path="bundles">
<system.web>
  <authorization>
    <allow users="*" />
  </authorization>  
</system.web>
 </location>

Ответ 7

добавьте в ваш глобальный файл это действие.

protected void Application_Start() {
   BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Ответ 8

Что нужно проверить при включении оптимизации комплекта;

BundleTable.EnableOptimizations = true;

а также

webconfig debug = "false"
  1. the bundles.IgnoreList.Clear();

это будет игнорировать минимизированные ресурсы ваших пакетов, такие как *.min.css или *.min.js которые могут вызвать неопределенную ошибку вашего скрипта. Чтобы исправить это заменить .min актив на оригинальный. если вы сделаете это, вам может не понадобиться bundles.IgnoreList.Clear(); например

bundles.Add(new ScriptBundle("~/bundles/datatablesjs")
      .Include("~/Scripts/datatables.min.js") <---- change this to non minified ver.
  1. Убедитесь, что имена пакетов ваших css и js уникальны.

    bundles.Add(new StyleBundle("~/bundles/datatablescss").Include(...) );

    bundles.Add(new ScriptBundle("~/bundles/datatablesjs").Include(...) );

  2. Убедитесь, что вы используете одинаковые имена Render @Script.Render и Style.Render в конфигурации вашего пакета. например

    @Styles.Render("~/bundles/datatablescss")

    @Scripts.Render("~/bundles/datatablesjs")