YUI Compressor使用
in Web on javascript, 压缩, 混淆 - Hits()
一般来说,js脚本混淆是吃力不讨好的事。没有真正的混淆,做得再好的工具混淆后,仍然可以被反推理。
花在混淆上面的功夫相对于脚本本来的价值很可能是不划算的。
但是,混淆一下起码还是有些作用的。
使用混淆最担心的是造成脚本错误。
我尝试用了YUI Compressor http://developer.yahoo.com/yui/compressor/,觉得还不错。
首先,它的混淆还是比较安全的:
The YUI Compressor is JavaScript minifier designed to be 100% safe and yield a higher compression ratio than most other tools.
in the face of evil features such as eval
or with
, the YUI Compressor takes a defensive approach by not obfuscating any of the scopes containing the evil statemen。对于eval和with采取保护措施。
在yui-yuicompressor-6e2bc23中的reademe中,我发现:
+ Supports wildcards for specifying multiple input files.
但是实际使用确是不支持通配符和多文件的,一次只能处理一个文件。
这样导致要处理多个文件要么写bat脚本,要么写ant文件。但是仍不能多个合并到一个。
这两个方法真丑!ant支持文档也找不到!
它不是java写的吗?我还是自己写代码来条用它得了!
下面是对源码中Bootstrap类的使用,添加功能不难吧!
public static void main(String args[]) throws Exception { ClassLoader loader = new JarClassLoader(); Thread.currentThread().setContextClassLoader(loader); Class c = loader.loadClass(YUICompressor.class.getName()); Method main = c.getMethod("main", new Class[] { String[].class }); String srcpath = "E/html"; String despath = "E:/dest/all.js"; // main.invoke(null, new Object[]{new String[]{"-v","-o",path + "\all.js","--type","js",path + "\xxx.js"}}); String[] jss = { "a.js", "b.js" }; //note the order File[] dess = new File[jss.length]; for (int i = 0; i < jss.length; i++) { File tmpFile = File.createTempFile("yuicp", null); tmpFile.deleteOnExit(); main.invoke(null, new Object[] { new String[] { "-v", "-o", tmpFile.getAbsolutePath(), "--type", "js", srcpath + "/" + jss[i] } }); dess[i] = tmpFile; } FileOutputStream out = new FileOutputStream(despath); for (int i = 0; i < dess.length; i++) { FileInputStream in = null; try { in = new FileInputStream(dess[i]); copyLarge(in, out); } finally{ if (in != null){ in.close(); } } } out.close(); // main.invoke(null, new Object[]{args}); } public static long copyLarge(InputStream input, OutputStream output) throws IOException { byte[] buffer = new byte[1024*4]; long count = 0; int n = 0; while (-1 != (n = input.read(buffer))) { output.write(buffer, 0, n); count += n; } return count; }
尝试了一下,还不错,压缩了50%以上。而且没有错误!
注意,合并的所有文件最好都是未压缩的,否则合并后可能出现错误。
后来发现了eclipse插件http://marketplace.eclipse.org/content/yuicompressor
其实这个插件在我的myeclipse里面存在n年了,今天才注意!