YUI Compressor使用

一般来说,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年了,今天才注意!


Total views.

© 2013 - 2024. All rights reserved.

Powered by Hydejack v6.6.1