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

Как минимизировать JavaScript внутри блока script на страницах просмотра

Как минимизировать JavaScript внутри страницы просмотра script с минимальными усилиями?

У меня есть сценарии, специфичные для страницы, которые хотели бы использовать определенные страницы просмотра. Но компоновка и минимизация ASP.NET MVC4 работает только с файлами script, а не script на странице просмотра.

UPDATE

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

на странице макета, я создал необязательный раздел для конкретного блока javascript:

    @RenderSection("js", required: false)
</body>

то на странице просмотра, скажем, Index.cshtml, я представляю раздел script следующим образом:

@section js{    
    @Scripts.Render("~/bundles/js/" + Path.GetFileNameWithoutExtension(this.VirtualPath))
}

как вы можете видеть, предполагается, что имя файла javascript (index.js) совпадает с именем страницы просмотра (Index.cshtml). то в конфигурации пучка i:

var jsFiles = Directory.GetFiles(HttpContext.Current.Server.MapPath("Scripts/Pages"), "*.js");
foreach (var jsFile in jsFiles)
{
    var bundleName = Path.GetFileNameWithoutExtension(jsFile);
    bundles.Add(new ScriptBundle("~/bundles/js/" + bundleName).Include(
    "~/Scripts/pages/" + Path.GetFileName(jsFile)));
}

тогда, если вы находитесь на странице index, вывод html будет:

    <script src="/bundles/js/Index?v=ydlmxiUb9gTRm508o0SaIcc8LJwGpVk-V9iUQwxZGCg1"></script>
</body>

и если вы находитесь на странице proejcts, выход html будет выглядеть следующим образом:

    <script src="/bundles/js/Products?v=ydlmxiUb9gTRm508o0SaIcc8LJwGpVk-V9iUQwxZGCg1"></script>
</body>
4b9b3361

Ответ 1

Способ сделать это с минимальными усилиями - извлечь его в файл script. Затем вы можете использовать связывание и минимизацию, как хотите.

Если вы хотите уменьшить его в строке, это будет гораздо больше, чем просто перемещение script вне страницы.

Ответ 2

Вы можете минимизировать встроенные скрипты с помощью этого HTML-помощника

using Microsoft.Ajax.Utilities;
using System;

namespace System.Web.Mvc
{
    public class HtmlHelperExtensions
    {
        public static MvcHtmlString JsMinify(
            this HtmlHelper helper, Func<object, object> markup)
        {
           string notMinifiedJs =
            markup.Invoke(helper.ViewContext)?.ToString() ?? "";

            var minifier = new Minifier();
            var minifiedJs = minifier.MinifyJavaScript(notMinifiedJs, new CodeSettings
            {
                EvalTreatment = EvalTreatment.MakeImmediateSafe,
                PreserveImportantComments = false
            });
            return new MvcHtmlString(minifiedJs);
        }
    }
}

И внутри вашего Razor View используйте его вот так

 <script type="text/javascript">
           @Html.JsMinify(@<text>
        window.Yk = window.Yk || {};
        Yk.__load = [];
        window.$ = function (f) {
            Yk.__load.push(f);
        }
         </text>)
</script>

Если вы используете System.Web.Optimization, чем все необходимые DLL файлы уже ссылаются, вы можете установить пакет WebGrease NuGet.

Некоторые дополнительные сведения доступны здесь: http://www.cleansoft.lv/minify-inline-javascript-in-asp-net-mvc-with-webgrease/

EDIT: Заменено DynamicInvoke() с помощью Invoke(). Нет необходимости проверять время выполнения, Invoke намного быстрее, чем DynamicInvoke. Добавлено.? для проверки возможного нулевого значения.

Ответ 3

На основе ответа @samfromlv я создал расширение для обработки CSS. Он также учитывает BundleTable.EnableOptimizations.

OptimizationExtensions.cs

Ответ 4

Добавление ответа в ASP.NET MVC Core. Решение, которое я использовал для минимизации встроенных JS и бритв, сгенерированных html, было WebMarkupMin.

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

public void Configure(IApplicationBuilder app)  
{
    app.UseStaticFiles();

    //added
    app.UseWebMarkupMin();

    app.UseMvc(.....
}

public void ConfigureServices(IServiceCollection services)  
{
    services.AddMvc();

    //added    
    services.AddWebMarkupMin(
        options =>
        {
            //i comment these two lines out after testing locally
            options.AllowMinificationInDevelopmentEnvironment = true;
            options.AllowCompressionInDevelopmentEnvironment = true;
        })
        .AddHttpCompression();
}

Там большое сообщение блога Andrew Lock (автор ASP.NET Core in Action) об использовании WebMarkupMin https://andrewlock.net/html-minification-using-webmarkupmin-in-asp-net-core/ WebMarkupMin очень настраивается, и сообщение Andrew идет намного глубже, настоятельно рекомендуется внимательно его прочитать, прежде чем просто копировать и вставлять.