`
yvonxiao
  • 浏览: 77374 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

用YUI Compressor直接压缩内容

阅读更多

  目前项目中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-yui compressor

    yuicompressor-2.4.2.jar yuicompressor-2.4.7.jar jsZip.exe yuicompressor yui compressor js压缩工具 javascript压缩工具 css压缩工具 ------------------------------------ //压缩JS java -jar yui...

    YUI compressor右键压缩脚本

    YUI compressor右键压缩脚本,快捷压缩,不需要命令行,和图形界面,选择文件右键可以进行压缩处理。 解压后执行install.cmd,即可绑定右键菜单。

    用yuicompressor-2.4.7压缩你的JS和CSS

    用yuicompressor-2.4.7压缩你的JS和CSS 最近做了一个项目,使用了Ext框架,项目做好了,结果客户一试用,打开一个页面要6秒,这个页面是用户经常要用的,要频繁打开的,这样用户就受不了了,怎么办?怎么办?怎么...

    yuicompressor-2.4.8压缩并合并多个文件

    YUICompressor在压缩的过程中无法合并文件,如处理10个文件只能生成10个文件,于是写了一个自动化脚本,只需修改一下criptList.txt文件,及可将里边的文件合并压缩成一个文件。 注:jar包是在win7 32位环境下编译

    基于yuicompressor压缩js、css、scss、html、jsp

    yuicompressor压缩html、js、css、scss、jsp 方法:Monitoring.init 初始化基本参数: suffix : 压缩的后缀,如min,common.js压缩后为common.min.js,html与jsp不参与 filterDir:过滤目录,正则表达式,如(./...

    YUI Compressor JavaScript压缩,CSS压缩工具GUI界面版

    YUI Compressor是控制台的,本人基于JAVA写了个GUI版, * 可添加多个目录文件,批量压缩JavaScript,CSS文件; * 可设置发布目录,将压缩后的文件集中保存到该处; * 可将调试信息保存到文件中; * 可保置当前压缩文件...

    yuicompressor-2.4.8.jar

    yuicompressor-2.4.2.jar yuicompressor-2.4.7.jar jsZip.exe yuicompressor yui compressor js压缩工具 javascript压缩工具 css压缩工具 ------------------------------------ //压缩JS java -jar yuicompressor-...

    yuicompressor.jar

    IDEA(pycharm,phpstorm)添加外部插件-yuicompressor压缩js/css

    YUI compressor(2.4.7)

    javascript压缩工具YUI compressor,可以提供更好的压缩效率;该工具由著名的Yahoo Exceptional Performance项目组出品;YUI compressor的压缩效果比较...也可以去这里下:http://yuilibrary.com/download/yuicompressor/

    yuicompressor-maven-plugin, 用于压缩 (Minify/Ofuscate/Aggregate) Javascript文件和使用 YUI 压缩器的CSS文件的Maven 插件.zip

    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 Compressor.zip 基于java的开发源码-JSCSS压缩工具 YUI ...

    使用yuicompressor压缩及合并js,css静态资源

    NULL 博文链接:https://gogo1217.iteye.com/blog/1164848

    yuicompressor-2.4.8

    yuicompressor压缩js,css

    YUI Compressor压缩JS和Css工具(包含详细配置)

    YUI Compressor压缩JS和Css工具,可对js以及css进行压缩、合并、打包,并包含详细工具使用配置说明,如果你一个web前端开发工程师你值得拥有!

    YUI Compressor

    YUI Compressor 是一个用来压缩 JS 和 CSS 文件的工具,采用Java开发。 使用方法: //压缩JS java -jar yuicompressor-...java -jar yuicompressor-2.4.2.jar --type css --charset utf-8 -v src.css &gt; packed.css

    yuicompressor.zip

    yuicompressor,玉伯,yui,js压缩,cs压缩

    YUIcompressor

    js、css 压缩工具jar

    yuicompressor,给YUI Compressor添加右键命令

    可惜官网提供的版本都不具备右键功能,每次压缩都要cmd输入一些命令实在是繁琐,本文就介绍如何给YUI Compressor添加右键命令,方便使用。 网上已有一些网友写好的安装包,但对应的版本太低,目前最新最多人使用的...

    yui compressor

    yui compressor, js压缩工具, 可以有效减少js体积

Global site tag (gtag.js) - Google Analytics