More 5K App preparations. After using Java to write a 5K Twitter Client it's time to change languages and dive into some Javascript. So the next 5K app is a TODO list app (a bit like 37Signals Ta-da List). The app runs locally in a browser that support the local storage APIs (which I think is only Safari at the moment, but Firefox and others should support it soon).
Check out the video below, or try out 5K TODO for yourself.
The TODO list app has the following features:
- Add, edit, delete and re-order TODO items
- All TODO items stored in client-side database
So, pretty simple really, but all less than 5K in size. In fact that's actually the un-compressed side. If that was served up with a gzip filter it would shrink down even further!
Here are the vital statistics:
- 13414 bytes of Javascript, 401 bytes of CSS and 425 bytes of HTML before packing
- 5101 bytes of combined Javascript, CSS and HTML (single file) after packing and running through YUICompressor
- 361 lines of Javascript
So, most of the credit for the final file size should probably be given to YUICompressor. Without much effort it easily knocked off half the size of the Javascript - without much work. However there were a few tricks used to get even more out of the compression.
Apart from removing unnecessary whitespace YUICompressor also renames all local variables and local functions to be as short as possible (typically a single letter). This only happens with local symbols, so the following code:
function myFunc() { alert("here"); } window.onload = function() { myFunc(); }
Run through YUICompressor yields:
function myFunc(){alert("here")}window.onload=function(){myFunc()};
Whereas if myFunc() is instead declared inside of the onload handler:
window.onload = function() { function myFunc() { alert("here"); } myFunc(); }
...it becomes a local function and YUICompressor can do it's work:
window.onload=function(){function a(){alert("here")}a()};
See how myFunc() has been renamed a() when the function is local.
So most of the strategies for reducing the javascript file size revolve around making more variables and functions local and hiding often used global functions (e.g. document.getElementById()) behind local functions.
Apart from that the only other thing I did was to write a script to take the separate html, css and javascript files and generate one html file containing everything. This didn't really save any space (maybe a few bytes), but it meant that the app was only in one file and hence easier to distribute. Plus it also means that on YSlow 5KTODO gets a perfect score - which is always a bonus.