39

这可能是以下问题的重复,但唯一的答案是死链接:
Minify Html output of ASP.NET Application

在使用 ASP.Net 时,对我来说比较烦人的方面之一是 Visual Studio 将空格而不是制表符用于空白间距,这会增加最终 HTML 的大小。我最初想简单地将 Visual Studio 设置更改为使用选项卡,但我团队中的其他人最终仍然会用空格覆盖。

我的问题有两个:首先,如果使用空格或制表符,是否有办法在每个项目设置上进行更改(如果这样,是否值得);其次,有没有办法在生成时简单地缩小所有视图?

4

5 回答 5

45

无论如何,启用 GZIP比缩小 HTML 的效果要好得多。

在运行时进行缩小可能会损害您的服务器(假设您不使用缓存)。在部署期间缩小 Asp.Net 标记可能是个好主意。这样,您的代码存储库中仍然有一个非缩小版本的代码,并且在服务器上还有一个缩小版本。考虑一个部署过程,您在所有文件上调用 HTML 压缩器(例如,Dean Hume 的这个工具看起来很有前途) 。.aspx

于 2010-01-20T20:10:52.513 回答
13

我建议您尝试WebMarkupMin.Mvc。文档位于 - http://webmarkupmin.codeplex.com/documentation

于 2014-09-16T11:39:26.187 回答
6

此链接有效(来自您提供的相关链接)。它有一个解决方案,可以让您替换WebRazorHostFactory缩小 HTML 的那个。

要使其工作,您必须在Web.config文件中添加以下内容:

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

这部分通常放在Views\Web.config.

于 2013-04-01T00:29:28.907 回答
6

Google Pagespeed 会喜欢这个:

我为此挣扎了一段时间,我发现最好的方法是结合几件事:

MinifyHtmlAttribute你可以在GitHub Gist上使用我的 Helper Class 。它使用Zeta Producer Html Compressor来最小化 HTML,并使用System.Web.Optimization's Bundling 来最小化内联 javascript 和 CSS(对于您的关键 css 0.0)

Zeta Producer Html Compressor NuGet 包

Google 的 HtmlCompressor 库的 .NET 端口,用于缩小 HTML 源代码。

现在您可以使用内联 css 和 javascript 来压缩和缩小您的 html 了!!惊人的!;)

希望有人觉得这很有用。

于 2016-01-08T13:09:46.547 回答
0

这是一个老问题,但我会抛出我的解决方案,以防它对其他人有益。

我有一个使用大部分工作的正则表达式的“缩小”过滤器。pre在保留和textarea标记中的空白方面失败了。几天前我最终因为它碰壁了,所以我花了大约三天时间阅读其他人的尝试并尝试我的想法。最后,我决定使用 HtmlAgilityPack 解析 HTML 并从那里删除空白节点。因为pretextarea元素中的空白不被 HAP 视为空白,所以它对我有利,并且完全符合我的要求。一开始我确实遇到了麻烦,因为 HTML 是分块发送的,但我通过缓冲它直到它完成来解决它。这是我的代码,以防它对其他人有益。

请注意,此过滤器适用于我的应用程序(ASP.NET MVC 5)。理想情况下,应该在发布期间进行缩小以避免需要像这样的过滤器。最后,@naivists 在他的回答中指出,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);
    }
}
于 2017-03-25T00:59:16.237 回答