JavaScript的压缩和混淆

我们都知道JavaScript是一种在客户端浏览器中执行的解释型语言。浏览器以纯文本的形式下载JavaScript,然后在需要的时候执行JavaScript代码。

通过使用浏览器的查看源代码功能,用户总是能够阅读JavaScript的源代码,该功能会显示页面的完整HTML代码,包括任何JavaScript代码块。即使JavaScript源代码被放在一个外部文件中并通过script标签的src属性引用到页面中,它仍然可以被用户下载并阅读。对于任何查看页面的人来说,JavaScript代码永远是可见的。正因为这一点,不应该在JavaScript中编写私有的或敏感的逻辑。这种逻辑最好放在服务器端,那里更安全。

随着在基于Ajax的应用中越来越多地使用JavaScript,JavaScript源文件的大小也会成为一个问题。因为是解释型语言,所以JavaScript永远不会被编译成机器级的二进制码,而后者是一种更高效的可执行代码存储格式。大量的JavaScript文件会降低应用的速度,因为在执行这些JavaScript之前,浏览器必须先从服务器下载这些源代码。此外,如果代码中的注释很多的话,庞大的JavaScript代码只会变得更庞大。

我们可以看出,JavaScript缺少二进制可执行代码的特性有两个问题:糟糕的安全性以及需要下载大量源代码。有什么办法可以解决这两个问题吗?

随着JavaScript变得越来越流行,已经有了一些工具可以帮助我们解决这两个问题。最简单的压缩工具只是去掉JavaScript源代码中的所有注释和换行符,这就可以减少需要下载的源代码量。删除注释和换行符可以减少30%或更多的JavaScript源代码量,这要视情况而定。需要注意的是,在被这种工具压缩之前,JavaScript源代码必须使用分号正确地结束所有的声明,不然就会产生错误或非预期的行为。

记住,虽然JavaScript语句总是应该以分号结束,但大多数浏览器还是很宽容的,它们允许不写这种分号,只要在本应是分号的地方有一个换行符。很多压缩器都会除去换行符,当声明没有使用分号结束时,这就会对JavaScript源文件产生非预期的结果。JavaScript并没有一个编译器来捕捉这种问题,因此,应该代之以使用JavaScript验证器来保证所有行都以分号结束,所有声明块都使用了大括号。一个很不错的JavaScript验证器是JSLint,可以从www.jslint.com下载它。总是在压缩JavaScript之前使用像JSLint这样的JavaScript验证器会帮助我们防止压缩及混淆非常规JavaScript所造成的错误。

另外一些工具更强大一些,它们提供混淆功能。混淆是一种扫描源代码的过程,这个过程会把字段和函数本来的名字修改为经过编码的、毫无意义的名字,以此来防止他人了解源代码的目的和内部结构。通常,像C++这样的语言是不需要混淆的,因为它会被编译成机器级的二进制指令。为了达到很高的安全性,即便是像Java或C#这样被编译成中间字节码而不是二进制指令的现代语言也需要使用混淆工具。

由于JavaScript解释型的本质,编写JavaScript混淆工具是极具挑战性的。在确定函数名的作用域和可见性、函数变量以及全局变量方面,JavaScript混淆工具可能是有困难的,结果是,压缩后的源代码往往不能正确运行。单凭经验来讲,最佳方法就是避免把敏感的或私密的逻辑暴露在JavaScript中,尽量把它们放在服务器端,它们在那里是安全的。如果你坚持要使用JavaScript混淆器,那么一定要彻底地测试混淆后的JavaScript,确保它仍然能够正常工作。

Dojo工具包的JavaScript压缩器

目前,广大开发人员普遍使用的JavaScript压缩器和混淆器是由Dojo工具包提供的,其下载网址是www.dojotoolkit.org/docs/compressor_system.html。与很多JavaScript压缩器一样,Dojo的压缩器也是通过除去注释和运算符两边的空格、用更短的名字替换变量名这样的手段来压缩JavaScript源文件的。稍等——替换函数名和变量名听起来很费解。我们不是刚刚说过由于混淆所带来的问题,应该尽量避免使用它吗?

Dojo压缩器与其同类工具的不同之处在于其压缩并混淆JavaScript源代码的方式。很多JavaScript混淆器使用正则表达式来除去空格和注释。正则表达式很容易失效,而且也不具备上下文信息,而上下文正是决定变量名作用域的关键。Dojo压缩器使用Mozilla基金会提供的JavaScript引擎Rhino。

Rhino使得Dojo压缩器具有了确定变量名上下文和作用域的能力。因为Rhino是一款实时JavaScript解释器,所以Dojo压缩器能够确定变量名的作用域并安全地缩短变量名,而不会造成任何问题。

Dojo压缩器的主要目的是维护公共API的兼容性,并确保压缩后的脚本功能与压缩前完全一致。即使Dojo压缩器缩短了变量名,那也是为了缩小文件,而不是为了混淆。Dojo压缩器的创建者们认为混淆JavaScript是没有意义的,但是缩小文件无疑非常有意义。为此,Dojo压缩器试图在缩小文件与可读性和可调试性之间达成良好的平衡。

使用Dojo压缩器

Dojo压缩器被打包成一个单独的JAR文件custom_rhino.jar,可以从Dojo网站上下载它。可以简单地通过命令行调用Dojo压缩器,只需指明将要被压缩的JavaScript文件的名字和目标文件的名字即可:

该命令中,uncompressed.js是将要被压缩的JavaScript文件的名字,compressed.js是目标文件的名字。

作为Java开发人员,你可能会使用Ant自动执行构建过程,并且可能不太希望每次执行构建的时候都要手动压缩JavaScript文件。幸运的是,Dojo压缩器也可以在一个Ant任务中使用,如代码清单2-2所示。

代码清单2-2  在Ant任务中使用的Dojo JavaScript压缩器

在Ant任务中使用该JavaScript压缩器时,一定要提供custom_rhino.jar的正确路径。此外,还要确保Rhino的.jar文件包含在Ant的classpath中。

那么Dojo压缩器会把JavaScript源文件的大小减小到什么程度呢?我们使用Dojo压缩器对一个领先的Ajax框架中一个JavaScript源文件进行了压缩。图2-7展示了压缩前(左)和压缩后(右)的文件大小。

图2-7  压缩前(左)和压缩后(右)的脚本大小

html混淆压缩,JavaScript的压缩和混淆相关推荐

  1. 在线压缩html,JS代码压缩 - javascript代码压缩 - jsmin在线js压缩工具

    输入代码: // is.js // (c) 2001 Douglas Crockford // 2001 June 3 // The -is- object is used to identify t ...

  2. apk反编译(6)用ProGuard 混淆、压缩代码,压缩资源。

    1.android官方文档 https://developer.android.com/studio/build/shrink-code  主要内容如下: 1.1 压缩代码 混淆生成的文件:<m ...

  3. 用uglifyjs压缩JS js压缩 混淆

    原文 小tip:我是如何初体验uglifyjs压缩JS的 这篇对之前那边进行稍微一点修改  js的压缩 并不是网上那种混淆   网上那种压缩混淆没什么卵用.分分钟给弄回来 也是逗死我了 只是一些简单的 ...

  4. 前端实用技巧,JS压缩、美化、JS混淆加密

    作为一名前端开发者,关注JavaScript代码的安全性和隐私性,或者需要对JavaScript代码进行美化.格式化.压缩等操作,帮助你提高开发效率和代码质量,利用一个好的工具非常重要. 如果不想让自 ...

  5. javascript编译压缩

    javascript编译 js是JavaScript 源码文件, .min.js是压缩版的js文件. .min.js文件经过压缩,相对编译前的js文件体积较小,传输效率快.经过编码将变量和函数原命名改 ...

  6. JavaScript 网站加密和混淆技术

    1.网站加密和混淆技术简介 随着大数据时代的发展,各个公司的数据保护意识越来越强,大家都在想尽办法保护自家产品的数据不轻易被爬虫爬走.由于网页是提供信息和服务的重要载体,所以对网页上的信息进行保护就成 ...

  7. java 代码压缩javascript_利用Java来压缩 JavaScript 代码详解

    通过移除空行和注释来压缩 JavaScript 代码 /** * This file is part of the Echo Web Application Framework (hereinafte ...

  8. java 代码压缩javascript_通过Java压缩JavaScript代码实例分享

    通过移除空行和注释来压缩 javascript 代码 /** * this file is part of the echo web application framework (hereinafte ...

  9. JavaScript的压缩

    简述 如果非常着急,这块可以跳过直接从约束条件开始也行. JavaScript压缩这块需要权衡一下,压缩的成本会影响咱们自己的调试进度增加了编码.测试的负担,而的确给产品或用户带来了多一些的安全.性能 ...

  10. 文件压缩 - JavaScript/CSS/HTML/图片

    1.应用场景 主要用于前端静态文件压缩, 最小化,减少内容传输耗时,优化前端性能. 2.学习/操作 文档阅读: http://www.webkaka.com/blog/archives/html-co ...

最新文章

  1. Silverlight项目构成
  2. 对联想乐Pad的十大期待
  3. fastText中常见问题汇总
  4. 如何使用Node.js,Express和MongoDB设置GraphQL服务器
  5. matlab如果不想立即在,科学计算与MATLAB 1.5
  6. hdu5652:India and China Origins(并查集)
  7. 寻找春天nbsp;九宫格日记-2011.11.29
  8. 计算机now函数,玩转NOW函数 日期时间随心变
  9. 在layer弹出层中使用ueditor,所有的下拉选项事件都显示不了,或被遮挡
  10. L1-087 机工士姆斯塔迪奥 和 L1-048 矩阵A乘以B
  11. Arduino嵌入式开发
  12. 浅谈防火墙对 FTP 的影响及故障排除
  13. 青海行--(7月28日)凯旋归程
  14. Linux 命令总结和感悟
  15. adams功能区不显示_2019新版PPT,不知道这7个新功能,怎么做好幻灯片?
  16. HTTPS请求方式工具类
  17. 4.7 matlab交互式绘图工具(绘图工具栏)
  18. 分离 Alpha 通道
  19. 随机点名系统——html初学实战
  20. 微信小程序之数据处理

热门文章

  1. Java编程思想学习(五)----第5章:初始化与清理
  2. 【英语美文】权利的游戏——守夜人誓词
  3. 在家搭建 Minecraft 服务器,和远程小伙伴一起联机
  4. 卡1有信号 卡2无服务器,为什么卡1无服务卡2有
  5. 2020年12月编程语言排行榜
  6. 修改数据库安装的服务器 系统时间,修改数据库服务器的操作系统时间
  7. 网易之后再现暴力裁员,996、小黑屋、摄像头监控,你想象不到的残酷!
  8. dist文件夹、src文件夹、dest文件夹是什么意思?
  9. c 语言输出省份面积和高度,中国省份面积
  10. nodejs进程守护神forever