web-dev-qa-db-fra.com

Réduire la sortie HTML d'une application ASP.Net MVC

Ceci est probablement une copie de la question ci-dessous mais la seule réponse est un lien mort:
Minify sortie HTML d'application ASP.NET

Lorsque je travaille avec ASP.Net, l’un des aspects les plus ennuyeux pour moi est le fait que Visual Studio place des espaces à la place d’onglets pour l’espacement des blancs, ce qui augmente la taille du code HTML final. Au départ, je pensais simplement changer les paramètres de Visual Studio pour utiliser des onglets, mais les autres membres de mon équipe finiront quand même par se superposer à des espaces.

Ma question est double: premièrement, existe-t-il un moyen de modifier un paramètre par projet si des espaces ou des tabulations sont utilisés (et vaut-il même la peine si tel est le cas)? ?

36
mynameiscoffey

Activer GZIP aura beaucoup plus d’effet que de minimiser votre code HTML, de toute façon.

Effectuer une minification au moment de l'exécution pourrait endommager vos serveurs (si vous n'utilisez pas la mise en cache). Ce peut être une bonne idée de minfier votre balisage Asp.Net pendant le déploiement. De cette manière, vous avez toujours une version non minifiée du code dans votre référentiel de code et une version minifiée sur le serveur. Pensez à un processus de déploiement dans lequel vous appelez un minifier HTML (par exemple, cet outil de Dean Hume semble prometteur) sur tous les fichiers .aspx.

37
naivists

Je vous recommande d'essayer WebMarkupMin.Mvc . La documentation est disponible sur - http://webmarkupmin.codeplex.com/documentation

10
Andrey Taritsyn

Ce lien fonctionne (à partir du lien que vous avez fourni). Il a une solution qui vous permet de remplacer la WebRazorHostFactory par une qui minimise votre code HTML.

Pour que cela fonctionne, vous devez ajouter ce qui suit dans votre fichier Web.config:

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

Cette section est généralement placée dans Views\Web.config.

6
lante

Google Pagespeed va adorer ceci:

Je me suis battu pendant un moment avec ceci et la meilleure façon que j'ai trouvée était une combinaison de quelques choses:

Vous pouvez utiliser ma classe Helper MinifyHtmlAttribute sur GitHub Gist . Il utilise le Zeta Producer Html Compressor pour minimiser le code HTML et avec System.Web.Optimization 's Bundling, pour réduire le javascript et les CSS en ligne (pour vos fichiers critiques 0.0)

Paquet NuGet de compresseur Html Zeta Producer

Un port .NET de la bibliothèque HtmlCompressor de Google pour minimiser les sources HTML code.

Vous pouvez maintenant compresser et réduire votre code html avec les fichiers CSS et javascript intégrés, ainsi que le fichier minified Impressionnant!;)

J'espère que quelqu'un trouvera cela utile.

5
Aldracor

C'est une vieille question, mais je vais ajouter ma solution au cas où cela profiterait à quelqu'un d'autre.

J'ai eu un filtre "minification" en utilisant des expressions régulières qui a fonctionné pour la plupart. Il a échoué lorsqu'il a fallu préserver les espaces blancs dans les balises pre et textarea. J'ai fini par heurter un mur il y a quelques jours à cause de cela, alors j'ai passé environ trois jours à lire ce que d'autres ont essayé et à tester mes idées. En fin de compte, j'ai décidé d'analyser le code HTML à l'aide de HtmlAgilityPack, puis de supprimer les nœuds d'espaces. Parce que les espaces dans les éléments pre et textarea n'étaient pas considérés par HAP comme des espaces, cela a fonctionné en ma faveur et a fait exactement ce que je voulais. J'ai eu des problèmes au début parce que le HTML était envoyé en gros morceaux, mais je l'ai résolu en le tamponnant jusqu'à la fin. Voici mon code au cas où il serait bénéfique pour quelqu'un d'autre.

Notez que ce filtre fonctionne pour moi dans mon application (ASP.NET MVC 5). Idéalement, la minification devrait être effectuée lors de la publication pour éviter le recours à de tels filtres. Enfin, dans sa réponse, @naivists indique que la compression de la réponse par GZIP aura un meilleur effet que la minification, mais je suis légèrement en désaccord avec lui. Oui, ce sera le cas, mais la minification réduit considérablement la réponse. Le style avec CSS est vraiment génial car maintenant, vous n'avez plus à vous soucier des espaces et des éléments mal placés, ni à utiliser des ruses de marge/remplissage/positionnement pour les corriger.

[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);
    }
}
0
Gup3rSuR4c