JSMin: Javascript Compression
While at The Ajax Experience in October, I attended a presentation who spoke of the 3 C's (Combine, Compress, Cache) for Ajax development. In the Compress section I was introduced to the beauty of JSMin!
What is it? Well, shut up and I'll tell you.
Quoting Douglas Crockford (the creator of JSMin):
JSMin is a filter which removes comments and unnecessary whitespace from JavaScript files. It typically reduces filesize by half, resulting in faster downloads. It also encourages a more expressive programming style because it eliminates the download cost of clean, literate self-documentation.
As I've been creating more complex Javascript applications, the file size has been increasing (although the size is greatly reduced, thanks to jQuery). And, as a careful programmer should, I place comments all over my Javascript code so I don't draw too many blanks while updating/debugging...well, those comments tend to bloat the file size, as does the whitespace. The stripping of those elements alone has dropped the file-size of a number of my scripts by 40-50%! Thats huge. What previously was an 8K file goes down to 4K. Awesome.
If you're curious what JSMin does to your code, here's an example that Douglas gives:
Before
-
// is.js
-
-
// (c) 2001 Douglas Crockford
-
// 2001 June 3
-
-
-
// is
-
-
// The -is- object is used to identify the browser. Every browser edition
-
// identifies itself, but there is no standard way of doing it, and some of
-
// the identification is deceptive. This is because the authors of web
-
// browsers are liars. For example, Microsoft's IE browsers claim to be
-
// Mozilla 4. Netscape 6 claims to be version 5.
-
-
var is = {
-
ie: navigator.appName == 'Microsoft Internet Explorer',
-
java: navigator.javaEnabled(),
-
ns: navigator.appName == 'Netscape',
-
ua: navigator.userAgent.toLowerCase(),
-
version: parseFloat(navigator.appVersion.substr(21)) ||
-
parseFloat(navigator.appVersion),
-
win: navigator.platform == 'Win32'
-
}
-
is.mac = is.ua.indexOf('mac')>= 0;
-
if (is.ua.indexOf('opera')>= 0) {
-
is.ie = is.ns = false;
-
is.opera = true;
-
}
-
if (is.ua.indexOf('gecko')>= 0) {
-
is.ie = is.ns = false;
-
is.gecko = true;
-
}
After
-
var is={ie:navigator.appName=='Microsoft Internet Explorer',java:navigator.javaEnabled(),ns:navigator.appName=='Netscape',ua:navigator.userAgent.toLowerCase(),version:parseFloat(navigator.appVersion.substr(21))||parseFloat(navigator.appVersion),win:navigator.platform=='Win32'}
-
is.mac=is.ua.indexOf('mac')>=0;if(is.ua.indexOf('opera')>=0){is.ie=is.ns=false;is.opera=true;}
-
if(is.ua.indexOf('gecko')>=0){is.ie=is.ns=false;is.gecko=true;}
As you can see...the result is not easily read so you'll want to keep your original script around in the event that editing is needed. Super cool. So how do you get it? Well...there's a number of languages that JSMin logic has been ported to: zip file containing
an MS-DOS.exe file, or you can get the C source code and build it yourself. Now in C# and Java and JavaScript and Perl and PHP and Python and Ruby.
If you haven't thought about Javascript compression yet, you might want to start. Try it out...you'll be happy you did. Oh, and if you are curious: the Javascript implementation of JSMin is my favorite as it gives some excellent feedback and comment options on compression.
Discuss This Article
|
|
5 Responses to “JSMin: Javascript Compression”
-
Wandering Pig Effer
Posted: Jan 2nd, 2007 at 10:34 am1 -
Jeff
Posted: Jul 27th, 2007 at 10:12 amReply to this comment.So can any of these shrinkers be included in an ant build script?
3 -
Matt Haynes
Posted: Aug 8th, 2007 at 3:06 amReply to this comment.Apache Ant task that interfaces with Douglas Crockford’s JSMin program.
4 -
Filip
Posted: Apr 16th, 2008 at 7:39 amReply to this comment.This method is intended to produce minified js files and not compressed files like gz or zip, also possible and very useful for bandwidth reduction.
5



I use this tool for JS compression - strips comments and whitespace.
http://alex.dojotoolkit.org/shrinksafe/