谷歌刚刚发布了Closure,这是一个缩小JavaScript的编译器.
在产品网站上,它说"Closure Compiler也与Page Speed集成".
如何使用Page Speed通过Closure编译我的网页JavaScript?
(或者,是否有一个网站,我可以简单地粘贴在我的JavaScript中以关闭缩小它?
"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) 我正在编写一个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这样的字符串压缩器发送我的代码,我正在尝试做什么的正确方法是什么?
提前致谢.
我有一些包含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上定义.
如何编写代码以便它不会生成警告?
我正在为浏览器应用程序的工作编写自己的库,我遇到了同样的问题,决定如何评论代码.
我正在尝试遵循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记录类型的文档也很模糊,没有示例可以解决.
大多数人可能都熟悉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
我想.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)
我可以或者必须执行一个程序,它将所有文件添加到文件中并在压缩之后?谢谢你能帮助我!
我把它放在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编译器,仅针对特定类型,停止重命名属性吗?
我有一个日志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调用.我想删除.
谢谢!
所以我正在尝试使用Google Closure Compiler,我注意到它会切换所有相等参数,以便变量始终位于比较的右侧.
所以,现在不是typeof XMLHttpRequest=="undefined"我有"undefined"==typeof XMLHttpRequest,我有if(null!==a),而不是if(a!==null),就像一些例子.
我知道他们完成了同样的事情,但这不是我习惯的风格.切换后会有什么好处吗?我看不出会有什么.
有人可以向我解释为什么Closure Compiler决定这样做吗?只是写了那部分Closure的人的偏好吗?
编辑:为了澄清,人们告诉我为什么它可能被认为是良好的编码实践.那没关系,但这是在编译之后.是否有性能优势,或者Closure Compiler只是试图证明一个观点?