本节书摘来自异步社区《JavaScript精粹(修订版)》一书中的第1章,第1.9节,作者:【英】Edwards, J. , 【澳】Adams, C.著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.9 隐藏JavaScript源代码
如果您曾经创造过让自己骄傲的东西,您就会明白自己的智力成果是需要保护的。但是JavaScript是一种自然的源码开放的语言,它以源代码的方式被浏览器接收,所以,只要浏览器可以运行它,任何人也就可以阅读它。
网上有些程序宣称提供对源代码的加密,但其实没有什么加密方法能够保证别人无法解密。实际上,这些程序往往会造成麻烦,它们会重新格式化代码,这让代码运行更慢、更低效,甚至会因为错误而不能运行。想知道我的建议吗?干脆碰都不要碰那些所谓的加密程序。
不过,为了保护代码成果,有件事情是很容易做到的,那就是混淆代码,混淆后的代码非常不易阅读和理解。
方 法
被去除了所有的注释和非必需的空格之后的代码非常难以阅读,正如您期望的那样,从这样的代码中分离出功能模块更加困难。这种简单的压缩代码的方法可以让大部分黑客放弃读下去的打算,除了少数非常有毅力的黑客。例如:
文件: obfuscate-code.js (excerpt)
var oldfn = window.onload;
if (typeof window.onload != 'function')
{
window.onload = fn;
}
else
{
window.onload = function()
{
oldfn();
fn();
};
}
可以通过去掉一些非必要的空格将代码压缩成两行:
文件:obfuscate-code.js (excerpt)
var oldfn=window.onload;if(typeof window.onload!='function'){
window.onload=fn;}else{window.onload=function(){oldfn();fn();};}
不过,还要注意,去除的是非必需的空格。一些空格是必需的,如var和typeof之后的空格。
讨 论
除了混淆本身带来的好处,这种去除了注释和非必要空格的代码通常会更加简短,因此载入速度会更快,执行速度也会更快。
但要注意,仍需要准确而严格地使用分号结束符和括号,就像在1.6节中讨论过的,否则,去除了换行符之后,代码被集中到一行会造成错误。
在压缩代码之前,要记住先做一个备份。我知道这其实是很显然的事情,不过我曾经犯过好多次未做备份的错误,您一定能想象我面对一团乱麻般的代码时的郁闷。我通常的做法是维护一个有注释和足够多空格的易读的版本,然后在发布之前,通过搜索/替换来处理一番。我会保留两个副本,一个叫做myscript.js,另一个叫做myscript-commented.js。
第20章将回到这个主题,讨论一些相关技术,以便提高脚本的速度和效率,同时降低开销。