`
wolongshan
  • 浏览: 68067 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

javascript脚本压缩工具JSEncoder实现(转)

    博客分类:
  • Java
阅读更多

1、算法原理:
从javascript脚本文件中提取单词,存入字典表中,这里使用|分割的字符串,然后将单词对应的序号(仿base64编码值)写入原来代码的地方,形成压缩后的js代码

2、压缩效果:
jquery-1.2.3.js原始文件大小95kb->[其他工具处理,去掉回车、注释等]jquery-1.2.3.min.js,大小53kb
=>本文工具压缩后:32kb

3、可选其他工具:
JSA 2.0 pre-alpha
http://sourceforge.net/project/showfiles.php?group_id=175776
packer:http://dean.edwards.name/packer/

4、下载(包含源代码在jar文件中)
2008.4 Ver:0.5  下载

5、源代码
java代码如下,写完代码之后才发现这是JSA(http://sourceforge.net/project/showfiles.php?group_id=175776)的压缩算法的再实现,不过好像作者没有开源,
本文算作是一种技术上的研究了。
通过对jquery-1.2.3.min.js http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.3.min.js
进行压缩测试通过,压缩率>40%.

  1package com.cngd.jstool;
  2
  3import java.io.FileReader;
  4import java.io.BufferedReader;
  5import java.io.FileOutputStream;
  6import java.io.IOException;
  7import java.util.regex.Matcher;
  8import java.util.regex.Pattern;
  9import java.util.Vector;
 10import java.text.DecimalFormat;
 11
 12/** *//**
 13 * JSEncoder脚本压缩工具
 14 * <p/>
 15 * 写完代码之后才发现这是JSA(http://sourceforge.net/project/showfiles.php?group_id=175776)的压缩算法的再实现
 16 * 针对jquery-1.2.3.min.js这个文件的压缩比率结果比较如下
 17 * -------------------------------------------------------------------
 18 * 原始大小 | JSEncoder | JSA-20071021(2.0 pre-alpha) |  jquery packer算法
 19 * -------------------------------------------------------------------
 20 * 53kb   | 32kb       |  29kb                       |    29kb
 21 * -------------------------------------------------------------------
 22 * 因为JSA进一步将局部变量进行了压缩,因此相比较更小
 23 * <p/>
 24 * <p/>
 25 * <p/>
 26 * User: (在路上 http://www.cnblogs.com/midea0978)
 27 * Date: 2008-4-18
 28 * Version:0.5
 29 */

 30public class JSEncoder {
 31    public static final String ENCODE_BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$";
 32    public boolean isDebug = false;
 33
 34    /** *//**
 35     * @param filename js filename
 36     * @param offset   offset>=0指定偏移变量,不同的offset可以实现代码表位置的变换,较小的offset可以获得更大的压缩率
 37     * @return 压缩后的代码
 38     */

 39    public String encode(String filename, int offset) throws Exception {
 40        String jscript = readFileData(filename);
 41        int size = jscript.length();
 42        jscript = jscript.replaceAll("\n"" ");
 43        //替换\->\\
 44        jscript = jscript.replaceAll("\\\\""\\\\\\\\");
 45        //替换单引号'=>\'
 46        jscript = jscript.replaceAll("\\'""\\\\\\'");
 47
 48        Pattern p = Pattern.compile("([\\w\\$]+)");
 49        Matcher m = p.matcher(jscript);
 50        String element;
 51        Vector<String> dict = new Vector<String>();
 52        int index;
 53        StringBuffer encscript = new StringBuffer();
 54        StringBuffer dicttab = new StringBuffer();
 55
 56        debugInfo("=====编码字典对应表=====");
 57        while (m.find()) {
 58            element = m.group(1).trim();
 59            if (!dict.contains(element)) {
 60                dict.add(element);
 61                index = dict.size() - 1;
 62            }
 else {
 63                index = dict.indexOf(element);
 64            }

 65            debugInfo(index + "==>" + element);
 66            m.appendReplacement(encscript, Base64Encode(offset + index + 1));
 67        }

 68        for (String o : dict) dicttab.append(o + "|");
 69        m.appendTail(encscript);
 70        debugInfo("=====  编码字典结束  =====");
 71        debugInfo("Offset=" + offset + ",字典大小=" + dict.size());
 72        debugInfo("压缩后的代码:\n" + encscript.toString());
 73        String dictstr = dicttab.substring(0, dicttab.length() - 1).toString();
 74        debugInfo("字典字符串:\n" + dictstr);
 75        String res = formatCode(encscript.toString(), dictstr, dict.size(), offset);
 76        int packsize = res.length();
 77        DecimalFormat df = new DecimalFormat("######.0");
 78        System.out.println("\n原始文件大小:" + size + "\n压缩后文件大小:" + packsize);
 79        System.out.println("=================\n压缩比率:" + df.format((size - packsize) * 100.0 / size) + "%");
 80        return res;
 81    }

 82
 83    private String readFileData(String filename) throws IOException {
 84        BufferedReader in = new BufferedReader(new FileReader(filename));
 85        StringBuffer sb = new StringBuffer();
 86        while (in.ready()) {
 87            sb.append(in.readLine() + "\n");
 88        }

 89        in.close();
 90        return sb.toString();
 91    }

 92
 93    private void debugInfo(String txt) {
 94        if (isDebug) System.out.println(txt);
 95    }

 96
 97    public static void main(String[] args) {
 98        System.out.println("JSEncoder 0.5 by midea0978 2008.4");
 99        System.out.println("=====================================");
100        System.out.println("http://www.cnblogs.com/midea0978\n");
101        if (args.length < 2{
102            System.out.println("Usage:java JSEncoder.jar jsfile outputfile [offset].");
103            System.exit(0);
104        }

105        try {
106            System.out.println("输入文件: " + args[0]);
107            System.out.println("输出文件: " + args[1]);
108            JSEncoder util = new JSEncoder();
109            int offset = args.length >= 3 ? Integer.parseInt(args[2]) : 0;
110            String code = util.encode(args[0], offset);
111            FileOutputStream fs = new FileOutputStream(args[1]);
112            fs.write(code.getBytes());
113            fs.close();
114        }
 catch (Exception e) {
115            e.printStackTrace();
116        }

117    }

118
119    /** *//**
120     * 仿Base64解码
121     *
122     * @param c 待编码的数字
123     * @return 编码值
124     */

125    private String Base64Encode(int c) throws Exception {
126        String res;
127        if (c < 0throw new Exception("Error:Offset必须>=0.");
128        if (c > 63)
129            res = Base64Encode(c >> 6+ Base64Encode(c & 63);
130        else {
131            //为了配合appendReplacement方法的使用,将$替换为\$
132            res = c == 63 ? "\\$" : String.valueOf(ENCODE_BASE64.charAt(c));
133        }

134        return res;
135    }

136
137    private String formatCode(String enc, String dict, int size, int offset) {
138        StringBuffer str = new StringBuffer();
139        str.append("/* Compressed by JSEncoder */\neval(function(E,I,A,D,J,K,L,H){function C(A){return A<62?String.fromCharCode(A+=A<26?65:A<52?71:-4):A<63?'_':A<64?'$':C(A>>6)+C(A&63)}while(A>0)K[C(D--)]=I[--A];function N(A){return K[A]==L[A]?A:K[A]}if(''.replace(/^/,String)){var M=E.match(J),B=M[0],F=E.split(J),G=0;if(E.indexOf(F[0]))F=[''].concat(F);do{H[A++]=F[G++];H[A++]=N(B)}while(B=M[G]);H[A++]=F[G]||'';return H.join('')}return E.replace(J,N)}(");
140        str.append("'" + enc + "',");
141        str.append("'" + dict + "'.split('|'),");
142        str.append(size + "," + (size + offset) + ",/[\\w\\$]+/g, {}, {}, []))");
143        return str.toString();
144    }

145
146}

147
分享到:
评论

相关推荐

    javascript脚本压缩工具

    javascript脚本压缩工具 javascript脚本压缩工具,不加密,只是去除不必要的代码。支持批量。

    javascript 脚本压缩工具

    非常精巧的javascript脚本压缩工具,内附chm格式的说明书,由ECMAScript标准组织开发

    jsmin.exe 脚本压缩工具

    简易无损压缩脚本工具,将它和要压缩的脚本1.js放在同一目录下,在dos下转到该目录执行命令: jsmin &lt;1.js&gt; 2.js 回车后,在该目录下出现的2.js就是被压缩的脚本

    javascript代码压缩工具

    分享一个不错的javascript代码压缩工具,需要安装JAVA环境

    javascript脚本调试工具

    javascript脚本调试工具 此工具用了 MSScriptControl 微软的脚本控件 有BUG或者建议请留言...... 邮箱:ybhacker@qq.com 运行环境:.net4.0

    JsMinGUIjavascript脚本压缩工具

    JsMinGUI一款javascript脚本压缩工具,图形化界面操作方便。 功能介绍: 1、它可以向命令行版本一样,采用图形界面操作来完成压缩一个 JavaScript 脚本文件。 2、输入文件可以和输出文件相同。 3、可以选择...

    javascript脚本压缩、混淆、分析工具v20110412

    私家珍藏,脚本压缩、混淆、分析工具! 在正确安装jdk的前提下,解压js.zip后有个js.jar,双击打开这个文件即可拥有相关功能!

    javascript 加密压缩工具

    javascript 加密压缩工具,能对JS进行加密压缩,压缩率可达80%,且代码不容易给他看到

    javascript压缩工具

    软件简介:可以高效的压缩Javascript脚本文件缩短网页显示时间,可以混淆代码保护知识产权,还可以把多个文件合并压缩。产生的代码兼容IE,FireFox等常用浏览器。本软件可免费使用和转载,但严禁用于商业用途。 本...

    ESC-1.14 Javascript 代码压缩工具

    Javascript 代码压缩工具, DOS界面操作 Level 0 :: No compression 不对JS文件进行压缩 Level 1 :: Comment removal 移除JS文件中的注释 Level 2 :: Whitespace removal 移除JS文件中的注释及空行(一般选择此级别就...

    Javascript解压缩格式化工具

    这是一个用js编写的网页程序,通过该页面可以格式化JavaScript脚本和html代码,并且可以解压缩由JsPacker压缩过的脚本代码。 注意:虽然程序经过无数次的测试,但是建议您保存好源文档后再操作,方便维护的同时也...

    PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例

    应同学邀请,演示如何使用 PyQt5 内嵌浏览器浏览网页,并注入 Javascript 脚本实现自动化操作。 下面测试的是一个廉价机票预订网站(http://www.flyscoot.com/),关键点如下 使用 QWebEngineView 加载网页,并显示...

    javascript脚本调试工具Microsoft Script Debugger:

    javascript脚本调试工具 Script Debugger 集成在IE中的一款很原始的调试工具,具备基本的调试功能,除了可以用于调试客户端脚本,还能调试在Microsoft IIS上运行的服务器端脚本。该工具命令窗口是基于文本的,针对...

    JavaScript 代码压缩工具

    NULL 博文链接:https://holdbelief.iteye.com/blog/907911

    JSA脚本压缩工具

    分享一个我经常用的脚本压缩工具,个人觉得好用,暂时找不到其他工具的朋友可以试试这个。下载之后,直接运行run.bat就可以啦

    C# 动态解析 javascript 脚本引擎源码

    C# 动态解析 javascript 脚本引擎源码

    JavaScript压缩 Css压缩工具

    压缩,压缩工具,JavaScript压缩工具,Css压缩工具

    AI CC 2015 JavaScript脚本手册

    AI CC 2015 JavaScript脚本手册,用于学习编写JSX脚本,官方文档

    第4章_JavaScript脚本技术

    JavaScript脚本技术JavaScript脚本技术

Global site tag (gtag.js) - Google Analytics