如何对Javascript代码进行二次压缩(混淆)
如何对Javascript代码进行二次压缩(混淆)
对Javascript代码进行压缩(混淆),可以有效减少传输和加载时间。但是,不是所有的变量(方法)都能被混淆的,一般来说,只有非属性的变量(方法)可以被混淆,而属性的变量(方法)就不行了。我们自己是知道这些属性(方法)是不会被外部访问和修改的,所以可以很放心地对其进行二次混淆。那么,如何自己定义混淆规则并进行二次混淆呢?
首先,页面上至少要用一个输入框和一个按钮。我这里设置有2个输入框,分别加上“uncompress”和“compress”两个类,表示为压缩和已压缩的。点击按钮,就开始压缩。
然后,自定义混淆规则,把压缩前和压缩后的字符串分别存在两个数组里面,然后,使用replace方法进行替换就可以了。代码如下:
var beforeArr = ['addUniqueClass', 'longValue', 'IDontKnowWhatIsIt'],
afterArr = ['au', 'lv', 'idk'];
$("button").on('click', function() {
var value = $(".uncompressed").val();
var length = beforeArr.length;
for(var i = 0; i< length; i ++) {
value = value.replace(beforeArr[i], afterArr[i]);
}
$(".compressed").val(value);
});
好了,当我们用这个方法去压缩代码后,觉得不放心,看看是不是确实都替换了。在代码里面搜一搜有没有压缩前的字符串,发现还真有,这是怎么回事?原来,当我们只是用字符串替换字符串时,是只能替换一次的,如果后面还有就无法继续替换了。不过正则表达式里面有全局替换的功能,所以把字符串转换成全局的正则表达式就可以了。
$("button").on('click', function() {
var value = $(".uncompressed").val();
var length = beforeArr.length;
for(var i = 0; i< length; i ++) {
var exg = new RegExp(beforeArr[i], 'g');
value = value.replace(exg, afterArr[i]);
}
$(".compressed").val(value);
});
这下,代码里面就搜不到压缩前的字符串了。
但还有一点不满意,就是维护性差了些,如果添加新的规则还好办,如果要修改或删除原有规则,那就没那么容易一一对应了。所以要做成映射关系比较直观的数组,像这样:
var Arr = [ 'addUniqueClass → au', 'longValue → lv', 'IDontKnowWhatIsIt → idk' ];
这样,看起来就直观多了,剩下的只是把箭头两侧的字符串分别存在两个数组里面就可以了。
另外,为了避免像$这样的符号无法被识别出来,可以在正则表达式前面加上'\\'。
完整代码如下:
var Arr = [
'addUniqueClass → au',
'longValue → lv',
'IDontKnowWhatIsIt → idk'
],
beforeArr = [],
afterArr = [],
arrLength = Arr.length;
for(var i = 0; i < ArrLength; i ++){
var value = arr[i].split('→')[0].trim();
beforeArr.push(value);
value = arr[i].split('→')[1].trim();
afterArr.push(value);
}
$("button").on('click', function() {
var value = $(".uncompressed").val();
var length = beforeArr.length;
for(var i = 0; i< length; i ++) {
var exg = new RegExp('\\' + beforeArr[i], 'g');
value = value.replace(exg, afterArr[i]);
}
$(".compressed").val(value);
});
如何对Javascript代码进行二次压缩(混淆)的更多相关文章
- 【JavaScript代码实现二】通用的事件侦听器函数
// event(事件)工具集,来源:github.com/markyun markyun.Event = { // 页面加载完成后 readyEvent : function(fn) { if (f ...
- Google Closure Compiler高级压缩混淆Javascript代码
一.背景 前端开发中,特别是移动端,Javascript代码压缩已经成为上线必备条件. 如今主流的Js代码压缩工具主要有: 1)Uglify http://lisperator.net/uglifyj ...
- 使用Google Closure Compiler高级压缩Javascript代码
背景 前端开发中,特别是移动端,Javascript代码压缩已经成为上线必备条件. 如今主流的Js代码压缩工具主要有: 1)Uglify http://lisperator.net/uglifyjs/ ...
- JavaScript代码段整理笔记系列(二)
上篇介绍了15个常用代码段,本篇将把剩余的15个补齐,希望对大家有所帮助!!! 16.检测Shift.Alt.Ctrl键: event.shiftKey; //检测Shift event.altKey ...
- How Javascript works (Javascript工作原理) (二) 引擎,运行时,如何在 V8 引擎中书写最优代码的 5 条小技巧
个人总结: 一个Javascript引擎由一个标准解释程序,或者即时编译器来实现. 解释器(Interpreter): 解释一行,执行一行. 编译器(Compiler): 全部编译成机器码,统一执行. ...
- 林大妈的JavaScript基础知识(二):编写JavaScript代码前的一些简单工作
在介绍JavaScript语法前,我们需要知道,学习语法必须要多利用手敲代码来巩固记忆.因此,由于JavaScript的特性,它不能像C++和Java一样独立地编译及运行,我们需要在调试运行JavaS ...
- JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
网上搜索了,目前主流的Js代码压缩工具主要有Uglify.YUI Compressor.Google Closure Compiler,简单试用了UglifyJS 和Google Closure Co ...
随机推荐
- 在GridView的中有一个DropDownList,并且DropDownList有回传事件
在GridView的中有一个DropDownList,并且DropDownList有回传事件 最近做一个项目,需要在GridView中的ItemTemplate中添加一个DropDownList,并且 ...
- HBase MVCC 代码阅读(一)
MultiVersionConcurrencyControl.java,版本 0.94.1 MultiVersionConsistencyControl 管理 memstore 中的读写一致性.该类实 ...
- 于快速创建 IEqualityComparer<T> 实例的类 Equality<T>
于快速创建 IEqualityComparer<T> 实例的类 Equality<T> 原文中的 Equality<T> 实现如下: 1 2 3 4 5 6 7 8 ...
- C++ multimap容器访问同一键值元素的不同方法
multimap是一种多元map容器,允许一个键对应多个值. 本文介绍了 multimap访问同一键值元素的三种不同方法,详细看下面代码: typedef multimap<string,int ...
- iOS推送服务细节回顾
iOS推送服务细节回顾 之前在做推送功能时候,就总结过一系列证书的制作,OC代码实现和服务器搭建等经验.又过了一段时间了,前前后后对推送服务做了多次的完善和优化,有iOS客户端的,还有本地服务器端的. ...
- Windbg找出死锁
使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题 前言 本文介绍本人的一次使用Windbg分析dump文件找出死锁的过程,并重点介绍如何确定线程所等待的锁及判断是否出现了死锁. 对于 ...
- C/C++基础知识总结——C++简单程序设计
1. sizeof 1.1 sizeof(类型名) 1.2 sizeof 表达式 1.3 返回所占字节大小 2. I/O流的输出格式 2.1 常用I/O流库操纵符 dec 十进制 he ...
- 【编程范式】C语言1
最近在网易公开课上看斯坦福大学的<编程范式>,外国人讲课思路就是清晰,上了几节课,感觉难度确实比我们普通大学大很多,但是却很有趣,让人能边学边想. 范式编程,交换两个数,利用 void * ...
- java的几种对象解释
一.PO:persistent object 持久对象,可以看成是与数据库中的表相映射的Java对象.最简单的PO就是对象数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何数据 ...
- HttpStack及其实现类
HttpStack及其实现类 前两篇已经对网络请求流程已经梳理了个大概,这次我们着重看一下HttpStack和它的其实现类.我们之前在Network篇讲过它仅有一个实现类,而今天我们讲的HttpSta ...