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

c# asp.net asp.net-optimization

4159 просмотра

3 ответа

13722 Репутация автора

Я пытаюсь объединить множество файлов .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 из комплекта и напрямую сослаться на него, но затем всплыли другие ошибки - так что мне нужен этот файл внутри комплекта в определенной позиции.

Мне просто нужно иметь возможность сказать - не минимизируйте и не уменьшайте 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);
Автор: nikib3ro Источник Размещён: 11.04.2014 09:06

Ответы (3)


2 плюса

1910 Репутация автора

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

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

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

Приведенный выше код создает новый пакет JavaScript с именем ~ / bundles / jquery, который включает в себя все соответствующие (отладочные или минифицированные, но не .vsdoc) файлы в папке Scripts, соответствующие строке с подстановочными знаками "~ / 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.
Автор: Yoeri Размещён: 17.04.2014 04:08

26 плюса

15310 Репутация автора

Решение

Пакеты преобразуют каждый файл, используя коллекцию 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<BundleFile> 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файл, он будет использован вместо минимизации.

Автор: meziantou Размещён: 17.04.2014 07:45

1 плюс

3434 Репутация автора

если вы связываете файлы .js в ScriptManager, вы заметите, что скрипты загружаются в <form>, а если вы извлекаете <head>его из пакета, он загружает этот файл раньше других, что не хорошо, если он зависит от других вещей в комплекте

Вот пример библиотеки, которую нужно добавить в комплект в определенном порядке.
Это добавлено в 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

  • Отладка: нет "углификации"
  • Релиз: Тотальное "углификация"

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

<asp:ScriptManager runat="server" >
    <Scripts>
        <asp:ScriptReference Name="jquery" />
        <asp:ScriptReference Name="jquery.ui.combined" />
        <asp:ScriptReference Name="ColorBox" />          
        <asp:ScriptReference Name="Infragistics" /> 
        <asp:ScriptReference Name="MsAjaxBundle" />
        <asp:ScriptReference Name="WebForms.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebForms.js" />
        <asp:ScriptReference Name="WebUIValidation.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebUIValidation.js" />
        <asp:ScriptReference Name="MenuStandards.js" Assembly="System.Web" Path="~/Scripts/WebForms/MenuStandards.js" />
        <asp:ScriptReference Name="GridView.js" Assembly="System.Web" Path="~/Scripts/WebForms/GridView.js" />
        <asp:ScriptReference Name="DetailsView.js" Assembly="System.Web" Path="~/Scripts/WebForms/DetailsView.js" />
        <asp:ScriptReference Name="TreeView.js" Assembly="System.Web" Path="~/Scripts/WebForms/TreeView.js" />
        <asp:ScriptReference Name="WebParts.js" Assembly="System.Web" Path="~/Scripts/WebForms/WebParts.js" />
        <asp:ScriptReference Name="Focus.js" Assembly="System.Web" Path="~/Scripts/WebForms/Focus.js" />
        <asp:ScriptReference Name="WebFormsBundle" />
    </Scripts>
</asp:ScriptManager>
Автор: fnostro Размещён: 17.04.2014 08:31
Вопросы из категории :
32x32