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 将重命名不在全局范围内的变量。如果将代码包装在匿名函数中,就会看到这种行为。