所以我正在尝试使用Google Closure Compiler,我注意到它会切换所有相等参数,以便变量始终位于比较的右侧.
所以,现在不是typeof XMLHttpRequest=="undefined"我有"undefined"==typeof XMLHttpRequest,我有if(null!==a),而不是if(a!==null),就像一些例子.
我知道他们完成了同样的事情,但这不是我习惯的风格.切换后会有什么好处吗?我看不出会有什么.
有人可以向我解释为什么Closure Compiler决定这样做吗?只是写了那部分Closure的人的偏好吗?
编辑:为了澄清,人们告诉我为什么它可能被认为是良好的编码实践.那没关系,但这是在编译之后.是否有性能优势,或者Closure Compiler只是试图证明一个观点?
假设您正在使用具有多个外部库依赖项的javascript项目,并希望使用Google Closure Compiler以ADVANCED_OPTIMIZATIONS模式编译源代码.
由于在此模式下编译器会将代码调用重命名为外部库对象和函数,因此必须提供externs,以防止发生此重命名.
但是,手动生成externs需要做很多工作,那么,从给定的javascript lib自动生成适当的extern的最佳方法是什么?
我正在尝试使用Google Closure Compiler缩小第三方JavaScript库,但它在下面的行中出错:
inBlock.package = package = name
Run Code Online (Sandbox Code Playgroud)
错误是
错误 - 解析错误.之后缺少名字.运营商**
name上面是函数内的局部变量,inBlock是一个输入参数.package除了该错误行之外,函数中没有任何地方声明.
我想这可能是由于packageJavaScript中的保留关键字?知道JavaScript中的包是什么以及如何修复它?
我将我的js代码复制粘贴到google编译器中,当我将其复制回我的应用程序时,它无法正常工作.我意识到我的代码需要jquery,所以我将jquery代码和我的代码复制到谷歌编译器中,希望它能轻松解决问题,但它也不起作用.
在chrome中,代码错误$(document).K(function () {就是文档就绪函数.错误是Uncaught TypeError: Object [object Object] has no method 'K'
我需要做些什么(暂时)工作?
谢谢你的建议.
我有一个json字符串,我解析,然后用点表示法访问对象的属性.但是,在谷歌闭包编译器中,点符号(MyObject.PropertyName)给出了未定义属性的警告.
目前,我正在使用的解决方案是将我的代码转换为括号表示法(MyObject['PropertyName']).这将删除警告,但也会阻止编译器执行其工作.另一方面,当我写时JSON.stringify(MyObject),服务器接收一个具有可理解的属性名称的字符串.
所以我的问题是在处理运行时反序列化和序列化的json对象时,如何在高级模式下最好地使用google编译器.
最近我发现Google Closure Compiler这么酷.有没有其他方法可以获得编译的静态类型语言的好处?
更新
它不是关于真正的编译器,而是关于JavaScript-JavaScript转换器,它提供类型验证等,优化和压缩.
javascript compression compiler-construction optimization google-closure-compiler
我有一个Node.js项目,我想用Closure Compiler编译.我不希望它在浏览器中运行/使用browserify.我主要想要类型检查的实用程序.我最初使用以下代码使编译器正常工作:
java -jar compiler.jar -W VERBOSE
--language_in ECMASCRIPT5_STRICT
--externs closure-externs.js
--js="lib/**.js"
Run Code Online (Sandbox Code Playgroud)
其中closure-externs.js手动定义的变量和我是从Node.js的一个相当原始的方式使用该功能:
// closure-externs.js
/** @constructor */function Buffer(something){}
function require(path){}
var process = {};
[...]
Run Code Online (Sandbox Code Playgroud)
事实证明,这只能通过纯粹的运气来实现.文件之间没有依赖关系跟踪,因此您可能会遇到返回类型的情况,{Foo}并且编译器会抱怨它不存在(取决于计算机,具体取决于编译顺序).然后我发现我做错了--process_common_js_modules所以应该使用,所以编译器会在我的位置进行依赖跟踪require("foo").我目前正在调用这样的编译器:
java -jar compiler.jar -W VERBOSE
--language_in ECMASCRIPT5_STRICT
--externs externs/fs.js
--js="lib/**.js"
--process_common_js_modules
--common_js_entry_module app.js
Run Code Online (Sandbox Code Playgroud)
但这是失败的:
ERROR - required entry point "module$crypto" never provided
ERROR - required entry point "module$dgram" never provided
ERROR - required entry point "module$extend" never provided
ERROR - required entry point "module$fs" never …Run Code Online (Sandbox Code Playgroud) 如何让我的应用程序在谷歌闭包编译器方面100%打字?
我已经使用jsdoc注释标记了所有内容.甚至可以获得100?我在64.6%
是否可以使用闭包编译器删除jQuery的未使用部分?
我有一个只使用jQuery的网络(json)函数的脚本,我想要一个删除其他所有东西的缩小脚本.
我试过调用它:
java -jar compiler.jar --compilation_level=ADVANCED_OPTIMIZATIONS --js=jquery-latest.js --js=my_script.js --js_output_file=out.js
Run Code Online (Sandbox Code Playgroud)
但我最终得到的文件不小于常规的缩小jQuery源代码.
编辑:我应该提一下背后的原因.此脚本将包含在第三方网站中,它需要更高版本的jQuery(1.5或1.6).我认为最简单的处理方法是将最新版本捆绑在脚本中(仅适用于我的脚本,而不是触及window.jQuery),删除未使用的部分以减小大小.这样,如果他们已经有了旧版本的jQuery,它就不会干涉.
是它在某种程度上可以通过命令行标志像--language_in=ECMASCRIPT5或--jscomp_off=internetExplorerChecks到谷歌关闭编译服务API?我在Service API Reference中找不到它.
作为参考,jscomp_off记录在警告中,language_in并记录在JavaScript中.
javascript ×8
jquery ×2
compression ×1
jsdoc ×1
json ×1
minify ×1
node.js ×1
optimization ×1
package ×1
typing ×1