سؤال

من المحتمل أن يكون هذا تكرارًا للسؤال أدناه ولكن الإجابة الوحيدة هي رابط ميت:
تصغير مخرجات HTML لتطبيق ASP.NET

عند العمل مع ASP.Net، أحد الجوانب الأكثر إزعاجًا بالنسبة لي هو حقيقة أن Visual Studio يضع مسافات بدلاً من علامات التبويب للمسافات البيضاء مما يزيد من حجم HTML النهائي.لقد فكرت في الأصل في تغيير إعدادات Visual Studio ببساطة لاستخدام علامات التبويب بدلاً من ذلك، ولكن بعد ذلك سيستمر الآخرون في فريقي في تراكب المسافات على أي حال.

سؤالي عبارة عن قسمين:أولاً، هل هناك طريقة لتغيير إعداد كل مشروع في حالة استخدام المسافات أو علامات التبويب (وهل الأمر يستحق العناء إذا كان الأمر كذلك) وثانيًا، هل هناك طريقة لتصغير جميع طرق العرض عند إنشائها؟

هل كانت مفيدة؟

المحلول

تمكين GZIP سيكون لها تأثير أكبر بكثير من تعريض HTML الخاص بك ، على أي حال.

قد يؤدي إجراء التصوير في وقت التشغيل إلى إيذاء خوادمك (على افتراض أنك لا تستخدم التخزين المؤقت). قد تكون فكرة جيدة أن تضع علامة ASP.NET أثناء النشر. وبهذه الطريقة ، لا يزال لديك إصدار غير محدد من التعليمات البرمجية في مستودع التعليمات البرمجية ، وإصدار مصغر على الخادم. فكر في عملية نشر حيث تستدعي Minifier HTML (على سبيل المثال ، هذه الأداة من قبل دين هيوم تبدو واعدة) على الجميع .aspx الملفات.

نصائح أخرى

أوصيك أن تحاول WebMarkUpmin.mvc. الوثائق متوفرة في - http://webmarkupmin.codeplex.com/documentation

هذا الرابط يعمل (من الرابط ذي الصلة التي تقدمها). يحتوي على حل يتيح لك استبدال WebRazorHostFactory من قبل واحد الذي يرفع HTML الخاص بك.

لجعلها تعمل ، عليك إضافة ما يلي في Web.config ملف:

<system.web.webPages.razor>
  <host factoryType="Omari.Web.Mvc.WhiteSpaceCleaningMvcWebRazorHostFactory, WhiteSpaceCleanerForWebFormsAndMVC3" />
</system.web.webPages.razor>

عادة ما يتم وضع هذا القسم في Views\Web.config.

سيحب Google Pagespeed هذا:

لقد كافحت لفترة من الوقت مع هذا وأفضل طريقة وجدتها كانت مزيجًا من بعض الأشياء:

يمكنك استخدام فئة المساعد الخاصة بي MinifyHtmlAttribute على جيثبجوهر.يستخدم زيتا منتج أتش تي أم أل ضاغط لتقليل HTML ومع System.Web.Optimizationتجميع، لتقليل جافا سكريبت وCSS المضمنة (لإصدار CSS 0.0 المهم الخاص بك)

زيتا منتج أتش تي أم أل ضاغط حزمة NuGet

منفذ .NET من مكتبة HTMLCompressor من Google لتصليح رمز مصدر HTML.

يمكنك الآن ضغط وتصغير HTML الخاص بك من خلال تصغير CSS وجافا سكريبت المضمنين أيضًا!!مذهل! ;)

أملي أن يجد هذا نفعا.

هذا سؤال قديم ، لكنني سأرمي في حلي في حال يفيد شخص آخر.

كان لدي مرشح "الإعدام" باستخدام تعبيرات منتظمة عملت في معظمها. فشلت عندما يتعلق الأمر بالمسافة البيضاء pre و textarea العلامات. انتهى بي الأمر إلى ضرب الحائط قبل أيام قليلة بسبب ذلك ، لذلك قضيت حوالي ثلاثة أيام في قراءة ما جربه الآخرون ويحاولون الخروج من أفكاري. في النهاية ، استقرت على تحليل HTML باستخدام htmlagilitypack وإزالة العقد البيضاء من هناك. لأن المساحة البيضاء في pre و textarea لم يتم اعتبار العناصر بيضاء من قِبل HAP ، فقد نجحت في مصلحي وفعلت ما أردت بالضبط. لقد واجهت مشكلة في البداية لأنه تم إرسال HTML في قطع ، لكنني حلتها عن طريق التخزين المؤقت حتى اكتمل. إليك الكود الخاص بي في حالة أنه مفيد لشخص آخر.

لاحظ أن هذا المرشح يعمل بالنسبة لي في طلبي (ASP.NET MVC 5). من الناحية المثالية ، يجب إجراء التصوير أثناء النشر لتجنب الحاجة إلى مرشحات مثل هذا. أخيرًا ، ينص @ @ناويون في إجابته على أن GZIP يضغط الاستجابة سيكون له تأثير أفضل من التصوير ، لكنني لا أوافق قليلاً معه. نعم ، سيفعل ذلك ، لكن الإرهاب يقلل من الاستجابة على رأس ذلك قليلاً. حيث يضيء حقًا هو عندما يكون التصميم مع CSS لأنه الآن لا داعي للقلق بشأن تصادم المساحة البيضاء وإخفاء العناصر والاضطرار إلى استخدام خداع الهامش/الوضع لتصحيحها.

[AttributeUsage(AttributeTargets.Class, Inherited = false)]
internal sealed class MinifyHtmlAttribute :
    ActionFilterAttribute {
    public override void OnActionExecuted(
        ActionExecutedContext filterContext) {
        if (filterContext == null
            || filterContext.IsChildAction) {
            return;
        }

        filterContext.HttpContext.Response.Filter = new MinifyHtmlStream(filterContext.HttpContext);
    }
}

internal sealed class MinifyHtmlStream :
    MemoryStream {
    private readonly MemoryStream BufferStream;
    private readonly HttpContextBase Context;
    private readonly Stream FilterStream;

    public MinifyHtmlStream(
        HttpContextBase httpContextBase) {
        BufferStream = new MemoryStream();
        Context = httpContextBase;
        FilterStream = httpContextBase.Response.Filter;
    }

    public override void Flush() {
        BufferStream.Seek(0, SeekOrigin.Begin);

        if (Context.Response.ContentType != "text/html") {
            BufferStream.CopyTo(FilterStream);

            return;
        }

        var document = new HtmlDocument();

        document.Load(BufferStream);

        var spans = document.DocumentNode.Descendants().Where(
            d =>
                d.NodeType == HtmlNodeType.Element
                && d.Name == "span").SelectMany(
            d => d.ChildNodes.Where(
                cn => cn.NodeType == HtmlNodeType.Text)).ToList();

        //  Some spans have content that needs to be trimmed.
        foreach (var span in spans) {
            span.InnerHtml = span.InnerHtml.Trim();
        }

        var nodes = document.DocumentNode.Descendants().Where(
            d =>
                (d.NodeType == HtmlNodeType.Text
                && d.InnerText.Trim().Length == 0)
                || (d.NodeType == HtmlNodeType.Comment
                && d.InnerText.Trim() != "<!DOCTYPE html>")).Select(
            d => d).ToList();

        foreach (var node in nodes) {
            node.Remove();
        }

        document.Save(FilterStream);
    }

    public override void Write(
        byte[] buffer,
        int offset,
        int count) {
        BufferStream.Write(buffer, offset, count);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top