views:

221

answers:

4

Please note that this question is intended to be a bit more on the theory side of the subject, but besides stripping whitespace what other techniques are used for JavaScript Compression?

A: 

I can name a few that are found within Google Web Toolkit compiler:

  • Inline of method calls
  • Dead Code elimination
  • Variable renaming/source obfuscation
    • this means rewriting long variables to short ones and so on

Almost all of them require javscript parsing (ie they work beyond a pure lexical analysis).

Miguel Ping
That dead code part scares me, how does GWT know that code is dead when JS has a global scope? Or is GWT designed for compiling all your JS at once, and doesn't work if you execute it on only one of your multiple JS files?
Daniel Lew
GWT is a monolithic compiler, so by adding some restrictions to what you can do within java, it can accurately determine if a method is called or not (similar to what you can do with eclipse ide).
Miguel Ping
+1  A: 

Off the top of my head...

  • Tokenizes local variables and then renames them to a minimally-sized variable.
  • Removes tons of whitespace.
  • Removes unnecessary braces (for example, single line executions after if-statements can remove braces and add a single semi-colon).
  • Removes unnecessary semi-colons (for example, right before an ending brace '}').

My most commonly used minifier is the YUI Compressor, and as they state, it's open source so you can take a look for yourself on exactly what they do. (I'm not sure what they mean by "micro-optimizations", probably a bunch of rare cases that gain you a character or two.)

Daniel Lew
+1  A: 

Most of the compressors use a combination of different techniques:

  • stripping whitespaces
  • compress file by compression algorythm (gzip, deflate)
  • most of the space is saved renaming interall variables and function to shorter names, eg:

This function:

function func (variable) {
  var temp = 2 * variable;
  return temp;
}

will become:

function func (a) {
  var b = 2 * a;
  return b;
}
  • Dean Edwards packer uses some internal compression. The script is decompressed whhen loaded on the page.
  • All the usual stuff to make a programmcode shorter:
    • delete unused code
    • function inlining
Hippo
Will become: function f(a){return 2*a;} ;) from 72 chars down to 27
Pop Catalin
if you want to use func on global javascript scope i would leave the name as it is... ;-)
Hippo
A: 

Code renaming and reordering so that gzip compressor will have better result.

for example (not so clever)

original code:

function mul(mul1, mul2)
{
 return mul1 * mul2;
}

function print(str)
{
  // do something 
}

function add(add1, add2)
{
 return add1 + add2;
}

modify code:

function mul(a,b)
{
 return a * b;
}

function add(a, b)
{
 return a + b;
}

function print(str)
{
  // do something 
}
Shay Erlichmen
I'm down voting this answer as you didn't really answer the question, namely what *techniques* are being used.
Rob
sorry Rob, I didn't read the entire question. New answer, hope I do better this time :)
Shay Erlichmen
@Shay - Yes that's better.
Rob
It's just a sample to the idea, of course that you can preform only operation that won't affect the result.
Shay Erlichmen