×
文章路径: WEB前端 > JS

由YUI Compressor压缩引出的关键字问题

发表于3年前(Dec 24, 2014 1:03:52 PM)  阅读 1226  评论 1

分类: Java WEB前端 JS

标签: 关键字 YUI Compressor

js、css文件在互联网应用中进行压缩部署是很常见的事,一来他可以一定程度上减小你文件大小,减小网络数据传输量,从而加快页面加载渲染速度,二来他也可以在一定程度上防止用户研究你的代码进行攻击,当然这个不是主要用途。因为笔者所在的项目采用增量部署的形式,所以笔者写了个简单的工具实现增量包的自动生成,在改进过程中,加入了YUI Compressor(雅虎的一个开源库),这是业内常用的压缩工具,互联网上大多数在线压缩也是使用的他。

昨天同事在使用我的打包工具进行打包时,发现工具报出如下错误:

Exception in thread "main" java.lang.NullPointerException
	at org.mozilla.javascript.Parser.addError(Parser.java:122)
	at org.mozilla.javascript.Parser.reportError(Parser.java:136)
	at org.mozilla.javascript.Parser.mustMatchToken(Parser.java:241)
	at org.mozilla.javascript.Parser.variables(Parser.java:1261)
	at org.mozilla.javascript.Parser.statementHelper(Parser.java:1058)
	at org.mozilla.javascript.Parser.statement(Parser.java:656)
	at org.mozilla.javascript.Parser.parseFunctionBody(Parser.java:440)
	at org.mozilla.javascript.Parser.function(Parser.java:547)
	at org.mozilla.javascript.Parser.parse(Parser.java:371)
	at org.mozilla.javascript.Parser.parse(Parser.java:337)
	at com.yahoo.platform.yui.compressor.JavaScriptCompressor.parse(JavaScriptCompressor.java:312)
	at com.yahoo.platform.yui.compressor.JavaScriptCompressor.<init>(JavaScriptCompressor.java:533)

经过排查,定位到一个js方法,js方法里面定义了一个名为package的变量,在java里面package为关键字,所以猜测是否是因为关键字原因(未压缩版本js方法可以正常执行),将变量换个名称,果然正常运行。将js代码copy在oschina上的在线压缩工具进行压缩,发现同样报错,oschina本身也是采用的YUI Compressor进行压缩,可以确定YUI Compressor对js关键字做了检测,不允许代码中出现关键字,这点是正确的。

百度javascript关键字列表:
break delete function return typeof
case do if switch var
catch else in this void
continue false instanceof throw while
debugger finally new true with
default for null try
Javascript未来关键字(Javascript Future Reserved Words)
Javascript还有一些未来关键字,这些字虽然现在没有用到Javascript语言中,但是将来有可能用到。
Javascript未来关键字列表:
abstract double goto native static
boolean enum implements package super
byte export import private synchronized
char extends int protected throws
class final interface public transient
const float long short volatile

开发过程中要避免使用这些关键字,即使有些关键字使用并不影响代码的执行,但可能会留下隐患。

发表评论