【问题标题】:Google Closure Compiler Service is giving invalid codeGoogle Closure Compiler Service 提供的代码无效
【发布时间】:2016-02-01 08:34:41
【问题描述】:

我在https://closure-compiler.appspot.com/ 使用 Closure Compiler 来混淆/缩小我的 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});

该代码正在运行,没有错误。 然后我想缩小/混淆它,所以我去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 库,它们也被编译了。我做错了什么?

请帮帮我,这很重要。

提前致谢!

【问题讨论】:

  • 输出是否包含 jQuery?请注意,这些库可能无法与高级编译一起正常工作,因为它们可能不是为它设计的。如果切换到其他模式,它会起作用吗?
  • 是的,输出包含 jQuery。如果我切换到另一种模式,它就可以工作,但是闭包编译器不再对我有用,因为它不会更改变量名称等等。
  • 好吧,如果您阅读有关高级编译模式的文档,您会发现代码必须以某种方式编写,以确保某些内容不会被重命名或删除。 jQuery 可能不是那样写的。 SIMPLE_OPTIMIZATION 重命名变量:developers.google.com/closure/compiler/docs/…
  • jQuery 的完整(不是缩小/混淆)版本是否应该与 Closure Compiler 一起使用?
  • 对于ADVANCED_OPTIMIZATIONS,绝对不是。

标签: javascript jquery html google-closure-compiler velocity.js


【解决方案1】:

请务必阅读Which Compilation Level is Right For Me?

简而言之,ADVANCED_OPTIMIZATIONS 只能与支持它的库一起使用。 jQuery 源代码没有(您必须将它与 externs 一起使用)。

您应该使用SIMPLE_OPTIMIZATIONS 级别,该级别大致相当于其他压缩编译器(如 UglifyJS),并且对于大多数代码来说是安全的。

SIMPLE_OPTIMIZATIONS 将重命名不在全局范围内的变量。如果您将代码包装在匿名函数中,您会看到这种行为。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-15
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多