I am using the new System.Web.Optimization and have created a bundle like this:
bundles.Add(New ScriptBundle("~/bundles/BaseJS").Include(
"~/Resources/Core/Javascripts/jquery-1.7.1.js",
"~/Resources/Core/Javascripts/jquery-ui-1.8.16.js",
"~/Resources/Core/Javascripts/jquery.validate.js",
"~/Resources/Core/Javascripts/jquery.validate.unobtrusive.js",
"~/Resources/Core/Javascripts/jquery.unobtrusive-ajax.js"))
and in my view I have added this
@System.Web.Optimization.Scripts.Render("~/bundles/BaseJS")
In fiddler the URL comes across with an expires header of 1 year in the future and a content type of text/javascript
In the web.config I have some code for gzip that is working on static JS files but it doesn't seem to on the minified bundles.
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00"/>
<remove fileExtension=".js"/>
<mimeMap fileExtension=".js" mimeType="text/javascript"/>
</staticContent>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
<dynamicTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="text/javascript" enabled="true"/>
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="text/javascript" enabled="true"/>
</staticTypes>
</httpCompression>
Is there a way to make the render bundle gzip the content?
Using gzip on the WebWhen a browser with gzip support sends a request, it adds “gzip” to its Accept-Encoding header. When the web server receives the request, it generates the response as normal, then checks the Accept-Encoding header to determine how to encode the response.
Both bundling and minification are the two separate techniques to reduce the load time. The bundling reduces the number of requests to the Server, while the minification reduces the size of the requested assets.
All modern browsers can handle a gzip encoded response. In fact, if you look at their requests, they'll have a header that says something along the lines of Accept-Encoding: gzip which is their way of saying to the server that they can handle gzipped responses.
With the latest ASP.NET Optimization (v1.1.2)
, the GZipTransform
class does not work well.
I found a new way with a custom Bundle
class that will always compress bundle content (that was transformed and cached) before response:
public class GZipBundle : Bundle
{
public GZipBundle(string virtualPath, params IBundleTransform[] transforms)
: base(virtualPath, null, transforms) { }
public override BundleResponse CacheLookup(BundleContext context)
{
if (null != context) GZipEncodePage(context.HttpContext);
return base.CacheLookup(context);
}
// Sets up the current page or handler to use GZip through a Response.Filter.
public static void GZipEncodePage(HttpContextBase httpContext)
{
if (null != httpContext && null != httpContext.Request && null != httpContext.Response
&& (null == httpContext.Response.Filter
|| !(httpContext.Response.Filter is GZipStream || httpContext.Response.Filter is DeflateStream)))
{
// Is GZip supported?
string acceptEncoding = httpContext.Request.Headers["Accept-Encoding"];
if (null != acceptEncoding
&& acceptEncoding.IndexOf(DecompressionMethods.GZip.ToString(), StringComparison.OrdinalIgnoreCase) >= 0)
{
httpContext.Response.Filter = new GZipStream(httpContext.Response.Filter, CompressionMode.Compress);
httpContext.Response.AddHeader("Content-Encoding", DecompressionMethods.GZip.ToString().ToLowerInvariant());
}
else if (null != acceptEncoding
&& acceptEncoding.IndexOf(DecompressionMethods.Deflate.ToString(), StringComparison.OrdinalIgnoreCase) >= 0)
{
httpContext.Response.Filter = new DeflateStream(httpContext.Response.Filter, CompressionMode.Compress);
httpContext.Response.AddHeader("Content-Encoding", DecompressionMethods.Deflate.ToString().ToLowerInvariant());
}
// Allow proxy servers to cache encoded and unencoded versions separately
httpContext.Response.AppendHeader("Vary", "Content-Encoding");
}
}
}
// Represents a bundle that does CSS minification and GZip compression.
public sealed class GZipStyleBundle : GZipBundle
{
public GZipStyleBundle(string virtualPath, params IBundleTransform[] transforms) : base(virtualPath, transforms) { }
}
// Represents a bundle that does JS minification and GZip compression.
public sealed class GZipScriptBundle : GZipBundle
{
public GZipScriptBundle(string virtualPath, params IBundleTransform[] transforms)
: base(virtualPath, transforms)
{
base.ConcatenationToken = ";" + Environment.NewLine;
}
}
Then you can use GZipStyleBundle
and GZipScriptBundle
to replace the original Bundle
classes: StyleBundle
, ScriptBundle
. Ex:
public static class BundleConfig
{
// For more information on Bundling, visit http://go.microsoft.com/fwlink/?LinkId=254725
public static void RegisterBundles(BundleCollection bundles)
{
bundles.Add(new GZipScriptBundle("~/bundles/jquery.js").Include(...));
bundles.Add(new GZipScriptBundle("~/bundles/jquery-ui.js", new JsMinify()).Include(...));
bundles.Add(new GZipStyleBundle("~/bundles/all.css", new CssMinify()).Include(...));
}
}
Regards
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With