性能优化之YUICompressor压缩JS、CSS

性能优化之YUICompressor压缩JS、CSS性能一直是项目中比较重要的一点,尤其门户网站,对页面的响应要求是很高的,从性能角度上来讲,对于Web端的优化其中重要的一点无疑是JS、CSS文件压缩,图片的融合,尽量减小文件的大小,必免占加载时占用过多的带宽。yuicompressor无疑是一个比较好的压缩工具,是yahoo的一个开源组件,下面介绍yuicompressor压缩JS、CSS文件,及在项目中的使用yuicmpressor的使用1、首先

大家好,又见面了,我是你们的朋友全栈君。

性能一直是项目中比较重要的一点,尤其门户网站,对页面的响应要求是很高的,从性能角度上来讲,对于Web端的优化其中重要的一点无疑是JS、CSS文件压缩,图片的融合,尽量减小文件的大小,必免占加载时占用过多的带宽。yuicompressor无疑是一个比较好的压缩工具,是yahoo的一个开源组件,下面介绍yuicompressor压缩JS、CSS文件,及在项目中的使用

yuicompressor介绍

1、首先需要从https://github.com/yui/yuicompressor/downloads下载yuicompressor,我用的是目前最新的2.4.7版本,下载完成后得到一个源码包,解压后在build文件中有一个yuicompressor-2.4.7.jar,一会就用这个Jar来压缩文件

2、yuicompressor需要有Java运行环境的支持,先通过Java -jar命令运行yuicmpressor-2.4.7.jar看下效果

longwentaodeMacBook-Pro:Downloads longwentao$ java -jar /Users/longwentao/Downloads/yuicompressor-2.4.7.jar 

Usage: java -jar yuicompressor-x.y.z.jar [options] [input file]

Global Options
  -h, --help Displays this information   --type <js|css> Specifies the type of the input file   --charset <charset> Read the input file using <charset>   --line-break <column> Insert a line break after the specified column number   -v, --verbose Display informational messages and warnings   -o <file> Place the output into <file>. Defaults to stdout.                             Multiple files can be processed using the following syntax:
                            java -jar yuicompressor.jar -o '.css$:-min.css' *.css
                            java -jar yuicompressor.jar -o '.js$:-min.js' *.js
JavaScript Options
  --nomunge Minify only, do not obfuscate   --preserve-semi Preserve all semicolons   --disable-optimizations Disable all micro optimizations

—type:文件类型(js|css)
—charset:字符串编码
—line-break:在指定的列后面插入一个line-break符号
-v,—verbose: 显示info和warn级别的信息
-o:指定输出的文件位置及文件名
—nomunge:只压缩, 不对局部变量进行混淆
—preserve-semi:保留所有的分号
—disable-optimizations:禁止优化

3、新建一个index.js文件,然后使用yuicompressor压缩,指定压缩后的文件名为index-min.js。index.js文件内容如下

function validate(userName,password){ 
   
    if(!userName){
        alert("userName is error:"+userName);
    }
    if(!password){
        alert("password is error:"+password);
    }
}

执行如下命令进行压缩

java -jar /Users/longwentao/Downloads/yuicompressor-2.4.7.jar --type js --charset utf-8 -v --verbose /Users/longwentao/Downloads/index.js -o /Users/longwentao/Downloads/index-min.js

压缩后在/Users/longwentao/Downloads/目录下多出一个index-min.js文件
这里写图片描述

yuicompressor在项目中的应用

上面的压缩只是单个文件,对于批量文件是不适合的,因此需要写一个工具类,递归压缩指定文件夹中所的有js、css文件
在pom.xml文件中增加对yuicompressor的引入

<!-- JS,CSS压缩 -->
<dependency>
    <groupId>net.alchim31.maven</groupId>
    <artifactId>yuicompressor-maven-plugin</artifactId>
    <version>1.5.1</version>
</dependency>

工具类代码如下

package com.bug.common;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/** * 通过yuicompressor压缩JS|CSS文件工具类 * * @author longwentao * @date 2016-12-17 */
public class CompressorUtil { 
   
    private static final String encoding = "utf-8";
    private static final String[] suffixArray = { ".js", ".css" };

    public static void main(String[] args) {
        String yuiPath = "/Users/longwentao/Downloads/yuicompressor-2.4.7.jar";
        String filePath = "/Users/longwentao/java/all_workspace/workspace_bug/bug.root/bug.web/src/main/webapp/js";

        compressFile(yuiPath, filePath);
    }

    /** * 压缩指定文件夹下所有的js/css * * @param yuiPath * yuicompressor-2.4.7.jar文件路径 * @param filePath * 要压缩的文件夹路径 */
    public static void compressFile(String yuiPath, String filePath) {
        File file = new File(filePath);
        List<String> commondList = new ArrayList<String>();
        initCommondList(yuiPath, commondList, file);
        excuteCompress(commondList);
    }

    /** * 执行压缩命令 * @param commondList */
    private static void excuteCompress(List<String> commondList) {
        Runtime runTime = Runtime.getRuntime();
        Date startTime = new Date();
        Long count = 0L;
        for (String cmd : commondList) {
            try {
                System.out.println(cmd);
                runTime.exec(cmd);
                count++;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        Date endTime = new Date();
        Long cost = endTime.getTime() - startTime.getTime();
        System.out.println("压缩完成,耗时:" + cost + "ms,共压缩文件个数:" + count);
    }

    /** * 初始化压缩命令 * @param yuiPath * @param commondList * @param file */
    private static void initCommondList(String yuiPath,
            List<String> commondList, File file) {
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            // 如果某个文件夹是空文件夹,则跳过
            if (files == null) {
                return;
            }
            for (File f : files) {
                initCommondList(yuiPath, commondList, f);
            }
        } else {
            String fileName = file.getName();
            String suffix = fileName.substring(fileName.lastIndexOf("."),
                    fileName.length());

            List<String> suffixList = Arrays.asList(suffixArray);
            if (suffixList.contains(suffix)
                    && !fileName.endsWith("-min" + suffix)) {
                StringBuffer sb = new StringBuffer();
                sb.append("java -jar ");
                sb.append(yuiPath);
                sb.append(" --type ");
                sb.append(suffix.substring(suffix.indexOf(".") + 1));
                sb.append(" --charset ");
                sb.append(encoding).append(" ");
                sb.append(file.getPath()).append(" ");
                sb.append("-o").append(" ");
                sb.append(file.getPath().replace(suffix, "-min" + suffix));

                commondList.add(sb.toString());
            }

        }
    }
}

执行上面工具类中的main方法后,已经生成index-min.css,index-min.js文件,效果如下
这里写图片描述

Shell脚本压缩

如果是在CI环境上打包,不在本地,这时候就不能用上面提供的Java工具了,这种情况下,如果CI环境是Windows,可以提供批处理脚本压缩,如果是Linux,可以使用Shell脚本批量压缩,我的环境是Linux,Shell脚本文件名yuicompressor.sh ,内容如下

#!/bin/sh
#clear file content
#echo > /Users/longwentao/java/shell/rcm.js
echo > /Users/longwentao/java/shell/rcm.min.js
for file in $(cat /Users/longwentao/java/shell/data.txt)
do
    cat $file >> /Users/longwentao/java/shell/rcm.js
done
java -jar /Users/longwentao/Downloads/yuicompressor-2.4.7/build/yuicompressor-2.4.7.jar --type js --charset utf-8 /Users/longwentao/java/shell/rcm.js -o /Users/longwentao/java/shell/rcm.min.js

rm /Users/longwentao/java/shell/rcm.js
echo "compression complete!!!"
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161225.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea 2021 3 激活码【在线破解激活】

    idea 2021 3 激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    88
  • 安卓手机当电脑摄像头(DroidCam网盘及使用方法)

    安卓手机当电脑摄像头(DroidCam网盘及使用方法)网盘密码:7fp3最近校招笔试,没有摄像头,所以打起了手机摄像头的主意,搜了一下,网上的安装包很旧,有的用不了,使用讲的也不全,所以我从官网和Google商店重新下了一遍。安装环境:笔记本win10专业版手机小米mix2s,安卓8.0。从网盘下载文件,分别安装在电脑和手机上。打开手机端和电脑端,把手机界面DroidcamPort后的数字填在电脑上。如…

    2022年6月24日
    50
  • 食物链3_食物链条数计算公式

    食物链3_食物链条数计算公式动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。现有 N 个动物,以 1∼N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这 N 个动物所构成的食物链关系进行描述:第一种说法是 1 X Y,表示 X 和 Y 是同类。第二种说法是 2 X Y,表示 X 吃 Y。此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句

    2022年8月9日
    7
  • SQL语句 之 数据查询(二)多表查询—————–数据查询的重点 难点「建议收藏」

    SQL语句 之 数据查询(二)多表查询—————–数据查询的重点 难点「建议收藏」1.0多表查询就是同时对多张表进行查询的技术

    2022年5月24日
    27
  • 单片机——SG90舵机工作原理

    单片机——SG90舵机工作原理前言:控制舵机的另一个专业名字叫伺服控制。经过百度,伺服”—词源于希腊语“奴隶”的意思。人们想把“伺服机构”当个得心应手的驯服工具,服从控制信号的要求而动作。在讯号来到之前,转子静止不动;讯号来到之后,转子立即转动;当讯号消失,转子能即时自行停转。由于它的“伺服”性能,因此而得名——伺服系统。我们这次就是要控制舵机转动任意角度。舵机一、外观接线方法:红————————-VCC棕色———————-GND橙色————

    2022年6月18日
    56
  • 计算机二级公共基础知识笔记

    计算机二级公共基础知识笔记计算机二级公共基础知识计算机系统考点一:计算机概述1.计算机的发展历程目前公认的第一台电子数字计算机是ENIAC,它于1946年在美国宾夕法尼亚大学研制成功。根据计算机本身采用的物理器件不同,将其发展分为4个阶段第一阶段是电子管计算机时代,时间为1946年到20世纪50年代第二阶段是晶体管计算机时代,时间为20世纪50年代后期到50世纪60年代中期第三阶段是中小规模集成电路计算机时代,时间是20世纪60年代中期到20世纪70年代初期第四阶段是大规模和超大规模集成电路计算机时代,时间是20

    2022年6月9日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号