Compressing and Combining all .js Files
February 24, 2011 Leave a comment
Most of the people are trying to: make their front-end in Web, port their applications from Desktop to Web, make Rich Internet Applications (RIA) … that’t why webification is a global process. Webifying has a lot of advantages but, of course, rises some problems. One of the problem is a huge amount of web content most of which are JavaScript files. If your application is big enough (>60 files or hundrends of files) then your bottleneck will be load of web site. So, let’s do the tool that minifies the size of JavaScript content. Since a developer is always limited in time and sometimes the time that is given is too small, let’s use existing tools to accomplish our goal.
I chose Closure Compiler. It removes comments, spaces, new lines; does obfuscation and finally size of compressed file is very small. It is very simple to install, the only thing is to run a single .jar file. Let’s download it, extract and get “compiler.jar”. Save this file in “/home/giorgi/jars/” directory (instead of “giorgi” use existing user):
mkdir /home/giorgi/jars cp compiler.jar /home/giorgi/jars
We will use it in command line and sample command is (make sure that you are in /home/giorgi/jars directory or where you have saved “compiler.jar”):
java -jar compiler.jar --js myJs.js --js_output_file myJs_min.js
As you guess myJs.js is original file and myJs_min.js will be compressed file. We can give multiple .js files to compress and combine in a single file:
java -jar compiler.jar --js myJs.js --js anotherMyJs.js --js_output_file myJs_min.js
If your application is multilanguage then you have to give –charset UTF-8 as parameter.
Writing commands by hand is wasting time, in this case. So, to make Closure Compiler much more useful let’s make a sample script that will generate and execute commands for us. Typically it is needed to compress files under some special directory where are .js files of web application. So, our script must compress files under one directory. Let’t do it by Python. The script must look for .js files under directory and subdirectories, collect their names and then generate a command line. It will look like this:
#!/usr/bin/python #The above line indicates that this file #must be run by python interpreter import os; import re; #regular expression that matches .js file a = re.compile('^.*\.js$') #initially command looks like this compress_command = 'java -jar /home/giorgi/jars/compiler.jar' #get full path of current working directory #(under which are .js file of our application) cwd_full = os.getcwd() #extract the name of current directory cwd = cwd_full[cwd_full.rindex('/') + 1:] #in all subdirectories check all #files if it is .js file then add to command for root, dirs, files in os.walk('../' + cwd): for name in files: if a.match(name): compress_command += ' --js ' + root + '/' + name #add output file and charset to command. #output file will be: nameOfCurrentDirectory + "_min.js" compress_command += ' --js_output_file ' + cwd + '_min.js --charset UTF-8' os.system(compress_command) #execute generated command.
- Let’s save this python script in file and name as “do_js_compression.py”
- Make it runnable: chmod +x do_js_compression.py
-
Make it global, so that we can execute it from every directory. So copy it to “/bin” directory:
cp do_js_compression.py /bin -
Now we are able to run this script for all applications. For this we have to move to application direcotry and run this script:
cd /home/giorgi/app
do_js_compression.py
And we will get the file “app_min.js” that is combined and compressed file of all .js files. And we solved our performance problem by one step…