Intereting Posts
Метка оси выравнивания C # Для обновления требуется действительная InsertCommand при передаче коллекции DataRow с новыми строками Как получить количество элементов в combobox? Получите восточное время в c # без преобразования местного времени Каков наилучший способ обновить ObservableCollection из другого streamа? как объяснить, что если (xyz == null) проверки не являются «защитными», Использование async ожидает при реализации библиотеки с синхронным и асинхронным API для одной и той же функциональности Перезаписать изображение в C # Параметр действия веб-API периодически прерывается Странность группы методов C # Предотвратите class WNetAddConnection2, который позволяет запрещенному пользователю получить доступ к общей папке Удаление динамических элементов управления с панели Определение доступа к файлу в общей папке на сервере Windows 2008 R2 / Windows 7 C # ListView Метод события DragDrop Выполнение дважды за раз matrix для массива c #

Не очищайте определенный файл при использовании Microsoft Web Optimization Framework

Я пытаюсь объединить множество .js-файлов в один, используя среду Microsoft Web Optimization . Все работает, но внутри этих файлов у меня есть несколько, которые уже заминированы и угашены, и нет необходимости обрабатывать их снова.

Например, у меня есть файл recaptcha_ajax.js и он вызывает следующие ошибки, когда он добавлен:

/* Minification failed. Returning unminified contents. (715,29-36): run-time error JS1019: Can't have 'break' outside of loop: break t (714,293-300): run-time error JS1019: Can't have 'break' outside of loop: break t (678,210-217): run-time error JS1019: Can't have 'break' outside of loop: break t (671,1367-1374): run-time error JS1019: Can't have 'break' outside of loop: break t (665,280-287): run-time error JS1019: Can't have 'break' outside of loop: break t */ 

Я попытался взять recaptcha_ajax.js из пакета и ссылаться на него напрямую, но затем другие всплывающие windows – так что мне нужен этот файл внутри пакета в определенном месте.

Я просто должен быть в состоянии сказать – не minify & uglify recaptcha_ajax.js – просто добавьте его в комплект.

Есть ли способ сделать это? Вот как я это вижу:

 var b = new ScriptBundle("~/bundles/myjsbundle"); b.IncludeDirectory("~/ScriptsMine/", "*.js", true); // some command like: // b.DoNotMinifyOrUglify("~/ScriptsMine/recaptcha_ajax.js"); bundles.Add(b); 

    Связки преобразуют каждый файл, используя коллекцию результатов IItemTransform и конкатенации. Затем он преобразует результат, используя коллекцию IBundleTransform .

    Набор скриптов по умолчанию уменьшает содержимое полного пакета, используя JsMinify (который реализует IBundleTransform ).

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

     public class CustomScriptBundle : Bundle { public CustomScriptBundle(string virtualPath) : this(virtualPath, null) { } public CustomScriptBundle(string virtualPath, string cdnPath) : base(virtualPath, cdnPath, null) { this.ConcatenationToken = ";" + Environment.NewLine; this.Builder = new CustomBundleBuilder(); } } public class CustomBundleBuilder : IBundleBuilder { internal static string ConvertToAppRelativePath(string appPath, string fullName) { return (string.IsNullOrEmpty(appPath) || !fullName.StartsWith(appPath, StringComparison.OrdinalIgnoreCase) ? fullName : fullName.Replace(appPath, "~/")).Replace('\\', '/'); } public string BuildBundleContent(Bundle bundle, BundleContext context, IEnumerable files) { if (files == null) return string.Empty; if (context == null) throw new ArgumentNullException("context"); if (bundle == null) throw new ArgumentNullException("bundle"); StringBuilder stringBuilder = new StringBuilder(); foreach (BundleFile bundleFile in files) { bundleFile.Transforms.Add(new CustomJsMinify()); stringBuilder.Append(bundleFile.ApplyTransforms()); stringBuilder.Append(bundle.ConcatenationToken); } return stringBuilder.ToString(); } } public class CustomJsMinify : IItemTransform { public string Process(string includedVirtualPath, string input) { if (includedVirtualPath.EndsWith("min.js", StringComparison.OrdinalIgnoreCase)) { return input; } Minifier minifier = new Minifier(); var codeSettings = new CodeSettings(); codeSettings.EvalTreatment = EvalTreatment.MakeImmediateSafe; codeSettings.PreserveImportantComments = false; string str = minifier.MinifyJavaScript(input, codeSettings); if (minifier.ErrorList.Count > 0) return "/* " + string.Concat(minifier.Errors) + " */"; return str; } } 

    Затем используйте CustomScriptBundle вместо ScriptBundle

     public static void RegisterBundles(BundleCollection bundles) { bundles.Add(new CustomScriptBundle("~/bundles/Sample").Include( "~/Scripts/a.js", "~/Scripts/b.js", "~/Scripts/c.js")); } 

    Если вы предоставите файл min.js он будет использоваться вместо его извлечения.

    Рамка оптимизации учитывает имена файлов.

    Попробуйте переименовать ваш * .js файл в recaptcha_ajax.min.js. Если я прав, тогда он должен пропустить процесс uglify / minify.

    Справочные данные: http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification (прокрутите немного вниз, чтобы найти эту цитату 🙂

    В предыдущем коде создается новый набор JavaScript с именем ~ / bundles / jquery, который включает все соответствующие файлы (отладочные или мини-, но не .vsdoc) в папке Scripts, соответствующие строке wild card “~ / Scripts / jquery- {version } .js». Для ASP.NET MVC 4 это означает, что с конфигурацией отладки файл jquery-1.7.1.js будет добавлен в комплект. В конфигурации релиза будет добавлен jquery-1.7.1.min.js. Структура связки соответствует нескольким общим соглашениям, таким как:

    • Выбор файла «.min» для выпуска, когда существуют «FileX.min.js» и «FileX.js».
    • Выбор версии «.min» для отладки.
    • Игнорирование файлов -vsdoc (таких как jquery-1.7.1-vsdoc.js), которые используются только IntelliSense.

    если вы связываете .js-файлы в ScriptManager, вы заметите, что скрипты загружаются в

    , а не в поэтому вытаскивание из пакета будет загружать этот файл перед другими, что не очень хорошо, если оно зависит другие вещи в комплекте

    Ниже приведен пример библиотеки, которая должна быть добавлена ​​в пакет в определенном порядке.
    Это добавлено в App_Start / BundleConfig.vb

     '############################################################ ' This is a ScriptManager Resource Definition ' for use in a ScriptManager mapping '############################################################ Dim ResourceDef as ScriptResourceDefinition = New ScriptResourceDefinition() Dim ResourceName as String = "ColorBox" 'add the Resource Definition details ResourceDef.Path = "~/Scripts/colorbox/jquery.colorbox-min.js" ResourceDef.DebugPath = "~/Scripts/colorbox/jquery.colorbox.js" ScriptManager.ScriptResourceMapping.AddDefinition(ResourceName, ResourceDef) '############################################################ 

    Обратите внимание на использование ResourceDef.Path и ResourceDef.DebugPath . Какой файл будет включен, будет зависеть от того, что вы делаете публикацию Debug или Release

    • Отладка: нет «углификации»
    • Выпуск: Total “углификация”

    Это мой комплект ScriptManager, обратите внимание на размещение ColorBox, позиция означает много: