At the start of the year, I finished a 5 part series on ASP.NET performance – focusing on largely generic ways to improve website performance rather than specific ASP.NET performance tricks. The series focused on a number of topics, including merging and shrinking files, using modules to remove unecessary headers and setting caching headers, enabling cache busting and automatically generating cache busted referneces in css, as well as an introduction to nginx.
Yesterday I managed to put a number of those things together into a framework which I hope will make it easier for developer to leverage these best practices. The project is called Metsys.WebOp, and you can download it from github. It comes with a sample application, which not only shows how to use the framework, but also has all the documentation you’ll hopefully need.
The first part of the framework is a console application which is meant to be run as part of your build process. This is driven by a text file which supports 4 commands – merging files together, shrinking them, generating cache busting hashes and pre-zipping files. Here’s what the sample app’s command file looks like:
#combine JS files
combine: js\all.js: js\jquery.js, js\jquery.rollover.js, js\web.js
#combine css files
combine: css\merged.css: css\reset.css, css\main.css
#shrink the generated files
shrink: js\all.js, css\merged.css
#generate cache-busting resource hashes
#pre-zip our files
zip: js\all.js, css\merged.css
The next part is meant to be used from within a MVC application (it wouldn’t take too much effort for someone to make it work with WebForms) – first by allowing you to configure the runtime component, and then by providing extension methods to HtmlHelper. Essentially this gives you 4 methods,
Html.ImageOver. You can also toggle debug mode, which’ll make all of this transparent during development (nothing worse than dealing with merged and shrank files in development).
The last part are a couple HttpModule which make everthing possible. The Zip module will returned the pre-zipped files (generated by the build process) should the browser accept zip files. The WebOp module will remove unecessary headers and add caching headers to js, css and images – only really practical if you are also using the cache busting featuers.
You can download the project from http://github.com/karlseguin/Metsys.WebOp.
You might also be interested in checking out the mscd project, which does a lot of the same stuff, but is probably more mature.