As we all know MVC bundling and minification is a very powerful feature, but recently I faced a strange problem in one of the project as detailed below.
I was using Trent Richardson's Timepicker
control to avail time picker functionality in my MVC 4 application. I
had relevant JQuery file bundled using MVC bundling feature. I found
this working quite well in development environment (Visual Studio 2012).
But when I deployed the website on IIS, I started facing a strange issue, and there was a javascript error "function expected"
in that particular bundle. I could see the bundle got loaded because
developer tool was showing javascript code when that bundle was selected
in "scripts" tab.
Finally, when I referenced the JQuery file directly instead of
bundle, it started working fine on IIS. Though the problem got solved, I was than now curious to know what was wrong with that particular file if
bundled, and if MVC bundling was actually an issue, then why it was
working well in development environment, but not in IIS?
Posting this on various forums gave me following two detailed answers which helped me in identifying in which situations we should avoid using bundling -
Answer 1
Minification is a complex process by making
scripts/styles smaller using techniques such variable name shortening,
white space elimination, comments removal, etc... It uses ASP.NET Web
Optimization that depends on WebGrease for minification. Of course,
there can have issues but I personnaly never noticed that.
Here are some situations, where you should not use bundling
- There is only one file in your bundle. Why bundling ?
- You are using only famous frameworks such as JQuery or jQuery UI.
Do not redistribute scripts that are already served by someone else.
Google/Microsoft/Amazon/... already provide CDN for the most popular,
open-source JavaScript libraries.
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
- Your bundle takes only a few Bytes. Web
performance Optimization suggests to limit the number of web requests.
Everything has a cost. Not very optimal, but sometimes it's better to
put inline scripts in your page.
- In some architectures. Bundles requests contains a
unique identifier used for caching. If any file in the bundle changes,
the ASP.NET optimization framework will generate a new token,
guaranteeing that browser requests for the bundle will get the latest
bundle. When working with some architectures, JS updates can be frequent
and will invalidate all your bundles.
- On Dev Environment. It's is really really painful to debug a bundle.
Answer 2
What bundling suppose to do is to put together the script/stylesheet
files in a single bundle into a single request and send it to the
client so that the browser has to make less calls to get those required
script files.
In a development environment, when you do debugging in visual studio. It
doesn't do the above process unless you specify it to do so. But in a
production environment, when the debug is set to false in the web.config
file. it will start to do the above process.
There can be some other reasons as well. such as the script might have
two versions. one for debugging and one for production. I came across
such a situation with knockout. in my development environment I had
referenced the debug version of the script. But when I put it into the
production environment, everything came to a hault. There was a release
version for the
knockout script file and I had to reference that to make
everything work again
Hope this will help you