标签: google-closure-compiler

如何使用Google的Closure编译JavaScript

谷歌刚刚发布了Closure,这是一个缩小JavaScript的编译器.

在产品网站上,它说"Closure Compiler也与Page Speed集成".

如何使用Page Speed通过Closure编译我的网页JavaScript?

(或者,是否有一个网站,我可以简单地粘贴在我的JavaScript中以关闭缩小它?

javascript minify google-closure google-closure-compiler

13
推荐指数
2
解决办法
2万
查看次数

为什么Closure Compiler不识别自执行匿名函数中的类型声明?

"Unknown type"通过Closure Compiler运行一个相当大的库时,我收到了很多警告,当我的类型在自动执行的匿名函数中声明时,它们似乎就出现了.这没有什么奇特之处,但是如果我将自执行函数剥离出来,类型声明似乎起作用(至少在这个简单的测试中).

我不确定我的代码注释是否有问题,或者代码中是否存在任何违法行为,但我认为这都是犹太教和模块化API的标准方法.

以下测试代码创建一个命名空间(只是一个普通的旧JS对象)并附加一个枚举(一个对象文字)和一个函数.

var mynamespace = {};
(function (mynamespace) {
    /**
     * Some enum.
     * @enum {number}
     */
    mynamespace.SomeEnum = {
        FOO: 1,
        BAR: 2
    };

    /**
     * Frazzle some type.
     * @param {mynamespace.SomeEnum} qux The type to frazzle.
     * @return {boolean} whether the operation succeeded.
     */
    mynamespace.frazzle = function(qux) {
        return true;
    }
}(mynamespace));

// call it
mynamespace.frazzle(mynamespace.SomeEnum.FOO);
Run Code Online (Sandbox Code Playgroud)

看起来很好,对吗?闭包编译错误:

[jscomp] Compiling 1 file(s) with 37 extern(s)
[jscomp] X:\dev\solclientjs\sdk\tools\jscomptest.js:14: WARNING - Parse error. Unknown type mynamespace.SomeEnum

[jscomp] …
Run Code Online (Sandbox Code Playgroud)

javascript design-patterns google-closure-compiler jsdoc

13
推荐指数
1
解决办法
2664
查看次数

使用Google的Closure Compiler缩小字符串的正确方法是什么?

我正在编写一个jQuery插件,我想通过用枚举替换常用的CSS属性字符串来缩小脚本的大小.但是,Google的Closure Compiler用字符串文字替换所有字符串变量.例如,选择高级优化:

这个

var x = "hey bob how are you doing";
alert(x);
alert(x);
alert(x);
alert(x);
Run Code Online (Sandbox Code Playgroud)

回报

alert("hey bob how are you doing");alert("hey bob how are you doing");alert("hey bob how are you doing");alert("hey bob how are you doing");
Run Code Online (Sandbox Code Playgroud)

如果不通过像JScrambler这样的字符串压缩器发送我的代码,我正在尝试做什么的正确方法是什么?

提前致谢.

javascript google-closure-compiler

13
推荐指数
1
解决办法
703
查看次数

如何防止警告'属性MyProp1从未在MyObject上定义'?

我有一些包含JSON字符串的HTML.在on DOM ready回调中,我有这样的事情:

MyObject = JSON.parse($('#TheJsonString').html());
Run Code Online (Sandbox Code Playgroud)

后来在我的代码中,我写了一些东西:

var SomeVar = MyObject.MyProp1;
Run Code Online (Sandbox Code Playgroud)

然后,当我通过Google闭包编译器运行代码时,我收到警告

属性MyProp1从未在MyObject上定义.

如何编写代码以便它不会生成警告?

javascript google-closure google-closure-compiler

13
推荐指数
2
解决办法
7304
查看次数

如何在JavaScript中记录返回

我正在为浏览器应用程序的工作编写自己的库,我遇到了同样的问题,决定如何评论代码.

我正在尝试遵循JsDoc语法,但可能会继续使用Google Closure Compiler方式.我可能最终在文档中使用了两个@return和@returns标签,只是为了便携(当我设置文档的自动生成时).

现在,问题是,如何记录函数中自定义匿名对象的返回?例如:

return {
    username: 'username',
    password: 'password',
    enabled:  true
};
Run Code Online (Sandbox Code Playgroud)

JsDoc有一个示例,说明如何记录@param以期望具有某些字段的对象,而不是@returns标记.同样,Google Closure Compiler记录类型的文档也很模糊,没有示例可以解决.

javascript code-documentation google-closure-compiler jsdoc

13
推荐指数
3
解决办法
6122
查看次数

如何缩小像Google Analytics这样的JavaScript?

大多数人可能都熟悉Google Analytics提供的这一点跟踪代码.

<script>
(
    function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    }
)(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-00000000-0', 'auto');
ga('send', 'pageview');
</script>
Run Code Online (Sandbox Code Playgroud)

有趣的是,这个小摘录包含形成单词isogram的参数.此脚本还使用参数声明变量以从最终文件大小中删除一些位.可以说,在编写代码(?)时你不会使用这种模式,所以我的问题是,谷歌如何缩小其代码并且这些技术是否也适用于凡人?

我在网上找到了Stephen Morley的这个例子,其中包含一个看起来像你在缩小它之前写的东西的代码.我接受了这些代码并通过Google自己的Closure Compiler进行高级优化.正如预期的那样,生成的代码与Google Analytics使用的实际脚本完全不同.

(function(){window.b="ga";"ga"in window||(window.a=function(){window.a.q.push(arguments)},window.a.q=[]);window.a.c=(new Date).getTime();var c=document.createElement("script");c.src="//www.google-analytics.com/analytics.js";c.async=!0;var d=document.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d)})();
Run Code Online (Sandbox Code Playgroud)

这次,即使没有两个额外的命令,代码也更少DRY和更大.

因此,为了澄清,我很好奇Google工程师是如何得出上述结果的(我不认为他们的代码实际上看起来像斯蒂芬的例子中的那个),即使你不是谷歌的一部分,这个过程是否可以复制?先感谢您!

javascript google-analytics minify google-closure-compiler bundling-and-minification

13
推荐指数
2
解决办法
2870
查看次数

使用Google Closure Compiler Application在一个文件中压缩所有文件.js

我想.js在命令行中使用Google Closure Compiler 将所有文件压缩到一个文件中的同一目录中.

对于一个文件,它是:

java -jar compiler.jar --js test.js --js_output_file final.js
Run Code Online (Sandbox Code Playgroud)

但我没有在文档中找到如何在final.js没有写入最后一个压缩文件的情况下将我的其他文件放在最后?

我想要这样的东西:

java -jar compiler.jar --js --option *.js --js_output_file final.js
Run Code Online (Sandbox Code Playgroud)

我可以或者必须执行一个程序,它将所有文件添加到文件中并在压缩之后?谢谢你能帮助我!

javascript compression google-closure-compiler

12
推荐指数
3
解决办法
1万
查看次数

为什么Closure编译器重命名extern类型的属性?

我把它放在externs文件中:

/** @typedef {{english: string, spanish: string}} */
var SpanishNoun;
Run Code Online (Sandbox Code Playgroud)

然后我有javascript:

/**
 * @param {SpanishNoun} n 
 */
exp1.processData3 = function (n) {
    console.log("pd3:", n.english, n.spanish, n['english'], n['spanish']);
}
Run Code Online (Sandbox Code Playgroud)

编译为:

function(a){console.log("pd3:",a.a,a.c,a.english,a.spanish)};
Run Code Online (Sandbox Code Playgroud)

所以它仍然将'英语'重命名为'a'等等.你如何阻止它?为什么它认为它可以重命名"外部"的东西.

后续问题

John的回答引出了另一个问题:我可以告诉Closure编译器,仅针对特定类型,停止重命名属性吗?

javascript google-closure-compiler

12
推荐指数
1
解决办法
1645
查看次数

使Closure编译器条带日志功能使用



我有一个日志API我想要暴露给一些内部JS代码.我希望能够使用此API进行记录,但仅限于我进行调试构建时.现在,我有部分工作.它只记录调试版本,但是当有常规版本时,对此API的调用仍然在代码中.当我使用goog.DEBUG = false编译时,我希望闭包编译器删除这个基本上死的代码.

日志定义:

goog.provide('com.foo.android.Log');
com.foo.Log.e = function(message){
    goog.DEBUG && AndroidLog.e(message);
}
goog.export(com.foo.Log, "e", com.foo.Log.e);
Run Code Online (Sandbox Code Playgroud)

AndroidLog是一个提供给webview的Java对象,它将在其中运行,并且可以像这样正确地激活:

var AndroidLog = {};

/**
 * Log out to the error console
 * 
 * @param {string} message The message to log
 */
AndroidLog.e = function(message) {};
Run Code Online (Sandbox Code Playgroud)

然后,在我的代码中,我可以使用:

com.foo.Log.e("Hello!"); // I want these stripped in production builds
Run Code Online (Sandbox Code Playgroud)

我的问题是:我如何提供此API,在我的代码中使用此API,但是在未使用goog.DEBUG = true编译时,是否删除了对此API的任何调用?现在,我的代码库变得臃肿,一堆从未调用的Log API调用.我想删除.

谢谢!

javascript google-closure-compiler

12
推荐指数
1
解决办法
1003
查看次数

平等操作数的顺序是否重要?(例如1 == x vs x == 1)

所以我正在尝试使用Google Closure Compiler,我注意到它会切换所有相等参数,以便变量始终位于比较的右侧.

所以,现在不是typeof XMLHttpRequest=="undefined"我有"undefined"==typeof XMLHttpRequest,我有if(null!==a),而不是if(a!==null),就像一些例子.

我知道他们完成了同样的事情,但这不是我习惯的风格.切换后会有什么好处吗?我看不出会有什么.

有人可以向我解释为什么Closure Compiler决定这样做吗?只是写了那部分Closure的人的偏好吗?

编辑:为了澄清,人们告诉我为什么它可能被认为是良好的编码实践.那没关系,但这是在编译之后.是否有性能优势,或者Closure Compiler只是试图证明一个观点?

javascript google-closure-compiler

12
推荐指数
2
解决办法
492
查看次数