Google 关闭编译器服务提供无效代码
Google Closure Compiler Service is giving invalid code
我正在 https://closure-compiler.appspot.com/ 使用 Closure Compiler 来 obfuscate/minfy 我的 JS 代码,但是出了点问题。我用脚本设置了一个页面来重现问题。
我的HTML5代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title</title>
<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js">
</script>
</head>
<body>
<p>text</p>
<script src="script.js"></script>
</body>
</html>
我的JS代码:
$("p").text("val changed");
$("p").velocity({left: 60},{duration: 2000});
该代码有效,没有错误。
那我要minify/obfuscate呢,所以我去https://closure-compiler.appspot.com
我包括 jQuery 和 Velocity.js 的 url,并将优化设置为高级。
代码:
// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @code_url http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js
// @code_url http://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js
// ==/ClosureCompiler==
$("p").text("val changed");
$("p").velocity({left: 60},{duration: 2000});
然后我等了几秒钟,直到它被编译,然后生成一长串代码,我将它复制到script.min.js。之后我稍微更改了我的 HTML 文档:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title</title>
</head>
<body>
<p>text</p>
<script src="script.min.js"></script>
</body>
</html>
然后我打开我的 HTML 页面,我收到以下错误:
Uncaught ReferenceError: $ is not defined
但是...我包含了 jQuery 和 Velocity.js 库,它们也被编译了。我做错了什么?
请帮助我,这很重要。
提前致谢!
请务必阅读 Which Compilation Level is Right For Me?
简而言之,ADVANCED_OPTIMIZATIONS
只能与支持它的库一起使用。 jQuery 源没有(你必须将它与外部一起使用)。
您应该使用 SIMPLE_OPTIMIZATIONS
级别,它大致相当于 UglifyJS 等其他压缩编译器,并且对大多数代码都是安全的。
SIMPLE_OPTIMIZATIONS
将重命名不在全局范围内的变量。如果将代码包装在匿名函数中,就会看到这种行为。
我正在 https://closure-compiler.appspot.com/ 使用 Closure Compiler 来 obfuscate/minfy 我的 JS 代码,但是出了点问题。我用脚本设置了一个页面来重现问题。
我的HTML5代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title</title>
<script src="//code.jquery.com/jquery-1.12.0.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js">
</script>
</head>
<body>
<p>text</p>
<script src="script.js"></script>
</body>
</html>
我的JS代码:
$("p").text("val changed");
$("p").velocity({left: 60},{duration: 2000});
该代码有效,没有错误。 那我要minify/obfuscate呢,所以我去https://closure-compiler.appspot.com
我包括 jQuery 和 Velocity.js 的 url,并将优化设置为高级。
代码:
// ==ClosureCompiler==
// @output_file_name default.js
// @compilation_level ADVANCED_OPTIMIZATIONS
// @code_url http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js
// @code_url http://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js
// ==/ClosureCompiler==
$("p").text("val changed");
$("p").velocity({left: 60},{duration: 2000});
然后我等了几秒钟,直到它被编译,然后生成一长串代码,我将它复制到script.min.js。之后我稍微更改了我的 HTML 文档:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>title</title>
</head>
<body>
<p>text</p>
<script src="script.min.js"></script>
</body>
</html>
然后我打开我的 HTML 页面,我收到以下错误:
Uncaught ReferenceError: $ is not defined
但是...我包含了 jQuery 和 Velocity.js 库,它们也被编译了。我做错了什么?
请帮助我,这很重要。
提前致谢!
请务必阅读 Which Compilation Level is Right For Me?
简而言之,ADVANCED_OPTIMIZATIONS
只能与支持它的库一起使用。 jQuery 源没有(你必须将它与外部一起使用)。
您应该使用 SIMPLE_OPTIMIZATIONS
级别,它大致相当于 UglifyJS 等其他压缩编译器,并且对大多数代码都是安全的。
SIMPLE_OPTIMIZATIONS
将重命名不在全局范围内的变量。如果将代码包装在匿名函数中,就会看到这种行为。