`
yvonxiao
  • 浏览: 77842 次
  • 性别: 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);
        }
    }
}

 

分享到:
评论

相关推荐

    YUI compressor右键压缩脚本

    这个“YUI compressor右键压缩脚本”提供了一种便捷的方式,使得用户无需通过命令行或图形用户界面(GUI)就能快速对JS(JavaScript)和CSS文件进行压缩,大大简化了工作流程。 首先,我们来深入了解YUI Compressor...

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

    java -jar yuicompressor.jar --type js -o script.min.js script.js ``` 这两个命令分别将原始的CSS和JavaScript文件压缩成更小的`style.min.css`和`script.min.js`。`-o`参数指定输出文件名,`--type js`指定了...

    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...

    yuicompressor-2.4.8.jar

    对于Idea用户,可以通过安装第三方插件实现yuicompressor的集成,这样在编译项目时,可以直接对JavaScript和CSS文件进行自动压缩,简化了工作流程,提高了开发效率。 在Idea中配置yuicompressor,通常需要以下步骤...

    YUI Compressor js css压缩工具

    在提供的文件中,`compressor.bat`是一个批处理脚本,用于调用`yuicompressor.jar`执行压缩任务。使用步骤如下: 1. **环境准备**:确保安装了Java运行环境(JRE)。 2. **运行脚本**:双击`compressor.bat`,或者...

    用yuicompressor-2.4.7压缩你的JS和CSS

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

    ant和yuicompressor 压缩css、js方案

    标题 "ant和yuicompressor 压缩css、js方案" 涉及到的是在软件开发中如何使用构建工具Ant以及JavaScript压缩工具YUI Compressor来优化前端资源,特别是CSS和JavaScript文件。这两个工具在Web开发中起着至关重要的...

    yuicompressor安装文件

    **JavaScript压缩工具——YUICompressor** YUICompressor是一款由Yahoo开发的高效JavaScript和CSS压缩工具。它通过删除空格、换行符以及不必要的字符,有效地减小了JavaScript和CSS文件的大小,从而提高了网页的...

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

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

    YUI Compressor(JS压缩工具)

    **YUI Compressor** 是一个由Yahoo开发的开源JavaScript和CSS压缩工具,旨在减少Web页面加载时间,提高网站性能。它的主要功能是去除代码中的空白、注释,并进行变量名混淆,从而减小文件大小,加快网页加载速度。在...

    yui compressor 2.4.2 javascript/css压缩程序

    java -jar yuicompressor-2.4.2.jar -o compressed.js input.js ``` 对于CSS文件,命令类似,只是扩展名不同。此外,`YUI Compressor` 还支持通过参数配置压缩级别、是否保留注释等选项。 5. **与其他工具的比较...

    yuicompressor js压缩工具

    这里`yuicompressor-x.x.x.jar`是YUI Compressor的jar文件,`input.js`是要压缩的源文件,`output.js`是压缩后的目标文件,`--type js`指定压缩类型为JavaScript。 3. 集成到构建流程:YUI Compressor可以与构建...

    YUI compressor源码jar包

    2. **延迟加载**:对于非首屏内容,可以使用YUI Compressor压缩后,再配合延迟加载技术,提高页面初始化速度。 3. **版本控制**:每次更新后,给压缩后的文件加上不同的哈希值,避免客户端缓存旧版本,确保用户始终...

    基于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压缩JS和Css工具(包含详细配置)

    1. **命令行工具**:通过安装Java Development Kit (JDK),然后下载YUI Compressor的jar文件,可以在命令行中使用`java -jar yuicompressor.jar`命令进行压缩操作。 2. **集成开发环境插件**:许多IDE如Eclipse、...

    yuicompressor.zip

    《yuicompressor:高效能的JS与CSS压缩工具》 在Web开发中,为了提高页面加载速度和优化用户体验,对JavaScript(JS)和Cascading Style Sheets(CSS)进行压缩是一项必不可少的工作。yuicompressor,由雅虎(Yahoo...

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

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

    yuicompressor-maven-plugin

    要在Maven项目中使用`yuicompressor-maven-plugin`,首先需要在项目的`pom.xml`文件中添加插件配置。以下是一个基本配置示例: ```xml ... ... &lt;groupId&gt;net.alchim31.maven&lt;/groupId&gt; &lt;artifactId&gt;yui...

Global site tag (gtag.js) - Google Analytics