目前项目中CMS管理系统会将静态资源比如CSS、JS或者Image推送到静态Web服务器(DFS文件系统),而把动态模板或者静态html片段推送到动态Web服务器。这个CMS是基于PHP的,对JS和CSS要做一层过滤,即合并、替换、压缩。合并和替换都没问题,压缩的时候在选择工具的时候考虑了Google Closure Compiler和YUI Compressor,目前还在测试中,先决定使用YUI Compressor(现在JQuery 1.4使用了Google Closure Compiler来压缩),可是CMS在使用的时候如果基于命令行,那么针对不同的平台就要执行不同的脚本,而且方式也不对,CMS在读取文件对内容执行了合并和替换后获得的就是内容,难道再输出到一个临时文件执行命令行?这样做不是很好的方式,上网搜了下资料,基本都是用命令行直接压缩的。我就看了下源码,参照com.yahoo.platform.yui.compressor.YUICompressor写了个工具类,以基于Hessian的Web程序的方式发布了一个服务(考虑到以后可能还会添加服务,就没有直接简单的用输出流的方式输出字符串),然后CMS调用这个服务获得压缩后的文本。代码如下:
接口
public interface ICompressorService {
/**
* JS或CSS压缩服务
* 为了和CMS系统相一致,这里在压缩后的文本内容加的第一个标识字符为0时表示是返回正常的压缩后的文本信息,为1则是返回异常信息
*
* @param type 压缩的类型(js/css) 类型:String
* @param content js/css的文本内容 类型:String
* @return 压缩后的结果(返回类型+压缩后的文本内容 0 压缩后的文本信息;1 异常信息) 类型:String
*/
public String compress(String type, String content);
实现类
public class CompressorServiceImpl implements ICompressorService {
//记录JS校验错误
private StringBuffer errs = null;
@Override
public String compress(String type, String content) {
Reader in = null;
Writer out = null;
ByteArrayOutputStream byteOut = null;
ByteArrayInputStream byteIn = null;
String dcontent = null;
try {
String charset = "UTF-8";
if (type == null) {
return "1"+"type can not be null";
}
if (!type.equalsIgnoreCase("js") && !type.equalsIgnoreCase("css")) {
return "1"+"type can only be 'js' or 'css'";
}
byteIn = new ByteArrayInputStream(URLDecoder.decode(content,"UTF-8").getBytes("UTF-8"));
in = new InputStreamReader(byteIn,"UTF-8");
int linebreakpos = -1;
byteOut = new ByteArrayOutputStream(1024000);
if (type.equalsIgnoreCase("js")) {
//只在压缩JS的时候才实例化
errs = new StringBuffer();
try {
JavaScriptCompressor compressor = new JavaScriptCompressor(in, new ErrorReporter() {
public void warning(String message, String sourceName, int line, String lineSource,
int lineOffset) {
if (line < 0) {
logErr("\n[WARNING] " + message);
} else {
logErr("\n[WARNING] " + line + ':' + lineOffset + ':' + message);
}
}
public void error(String message, String sourceName, int line, String lineSource, int lineOffset) {
if (line < 0) {
logErr("\n[ERROR] " + message);
} else {
logErr("\n[ERROR] " + line + ':' + lineOffset + ':' + message);
}
}
public EvaluatorException runtimeError(String message, String sourceName, int line,
String lineSource, int lineOffset) {
error(message, sourceName, line, lineSource, lineOffset);
return new EvaluatorException(message);
}
});
out = new OutputStreamWriter(byteOut, charset);
boolean munge = true;
boolean preserveAllSemiColons = false;
boolean disableOptimizations = false;
compressor.compress(out, linebreakpos, munge, false, preserveAllSemiColons, disableOptimizations);
out.flush();
dcontent = URLEncoder.encode(byteOut.toString("UTF-8"),"UTF-8");
} catch (EvaluatorException e) {
e.printStackTrace();
return "1"+(errs==null?"":errs.toString())+e.getMessage();
}
} else if (type.equalsIgnoreCase("css")) {
CssCompressor compressor = new CssCompressor(in);
out = new OutputStreamWriter(byteOut, charset);
compressor.compress(out, linebreakpos);
out.flush();
dcontent = URLEncoder.encode(byteOut.toString("UTF-8"),"UTF-8");
}
} catch (IOException e) {
e.printStackTrace();
return "1"+e.getMessage();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
return "1"+e.getMessage();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
return "1"+e.getMessage();
}
}
if(byteIn != null){
try {
byteIn.close();
} catch (IOException e) {
e.printStackTrace();
return "1"+e.getMessage();
}
}
if(byteOut != null){
try {
byteOut.close();
} catch (IOException e) {
e.printStackTrace();
return "1"+e.getMessage();
}
}
}
return "0"+dcontent;
}
private void logErr(String msg){
System.err.println(msg);
if(errs != null){
errs.append(msg);
}
}
}
分享到:
相关推荐
yuicompressor-2.4.2.jar yuicompressor-2.4.7.jar jsZip.exe yuicompressor yui compressor js压缩工具 javascript压缩工具 css压缩工具 ------------------------------------ //压缩JS java -jar yui...
YUI compressor右键压缩脚本,快捷压缩,不需要命令行,和图形界面,选择文件右键可以进行压缩处理。 解压后执行install.cmd,即可绑定右键菜单。
用yuicompressor-2.4.7压缩你的JS和CSS 最近做了一个项目,使用了Ext框架,项目做好了,结果客户一试用,打开一个页面要6秒,这个页面是用户经常要用的,要频繁打开的,这样用户就受不了了,怎么办?怎么办?怎么...
YUICompressor在压缩的过程中无法合并文件,如处理10个文件只能生成10个文件,于是写了一个自动化脚本,只需修改一下criptList.txt文件,及可将里边的文件合并压缩成一个文件。 注:jar包是在win7 32位环境下编译
yuicompressor压缩html、js、css、scss、jsp 方法:Monitoring.init 初始化基本参数: suffix : 压缩的后缀,如min,common.js压缩后为common.min.js,html与jsp不参与 filterDir:过滤目录,正则表达式,如(./...
YUI Compressor是控制台的,本人基于JAVA写了个GUI版, * 可添加多个目录文件,批量压缩JavaScript,CSS文件; * 可设置发布目录,将压缩后的文件集中保存到该处; * 可将调试信息保存到文件中; * 可保置当前压缩文件...
yuicompressor-2.4.2.jar yuicompressor-2.4.7.jar jsZip.exe yuicompressor yui compressor js压缩工具 javascript压缩工具 css压缩工具 ------------------------------------ //压缩JS java -jar yuicompressor-...
IDEA(pycharm,phpstorm)添加外部插件-yuicompressor压缩js/css
javascript压缩工具YUI compressor,可以提供更好的压缩效率;该工具由著名的Yahoo Exceptional Performance项目组出品;YUI compressor的压缩效果比较...也可以去这里下:http://yuilibrary.com/download/yuicompressor/
yuicompressor-maven-plugin, 用于压缩 (Minify/Ofuscate/Aggregate) Javascript文件和使用 YUI 压缩器的CSS文件的Maven 插件 [[Flattr this git repo] ( http://api.flattr.com/button/flattr-badge-large.png)]...
基于java的开发源码-JSCSS压缩工具 YUI Compressor.zip 基于java的开发源码-JSCSS压缩工具 YUI Compressor.zip 基于java的开发源码-JSCSS压缩工具 YUI Compressor.zip 基于java的开发源码-JSCSS压缩工具 YUI ...
NULL 博文链接:https://gogo1217.iteye.com/blog/1164848
yuicompressor压缩js,css
YUI Compressor压缩JS和Css工具,可对js以及css进行压缩、合并、打包,并包含详细工具使用配置说明,如果你一个web前端开发工程师你值得拥有!
YUI Compressor 是一个用来压缩 JS 和 CSS 文件的工具,采用Java开发。 使用方法: //压缩JS java -jar yuicompressor-...java -jar yuicompressor-2.4.2.jar --type css --charset utf-8 -v src.css > packed.css
yuicompressor,玉伯,yui,js压缩,cs压缩
js、css 压缩工具jar
可惜官网提供的版本都不具备右键功能,每次压缩都要cmd输入一些命令实在是繁琐,本文就介绍如何给YUI Compressor添加右键命令,方便使用。 网上已有一些网友写好的安装包,但对应的版本太低,目前最新最多人使用的...
yui compressor, js压缩工具, 可以有效减少js体积