我已尝试同时使用Google Closure和Yahoo's YUI,但重复的长行不会缩小。为了解决这个问题,我添加了:
var M =
{
m1: function( html_id, method_call )
{
return ( document.getElementById( html_id ).onclick = method_call );
}
};
所以不要写
document.getElementById(test).onclik = test;
我可以写
M.m1(test,test);
然而,这使得代码难以阅读。有没有我想念的选项会为我做这件事。当然谷歌或雅虎知道如何自动执行此操作?
答案 0 :(得分:1)
也许封闭和YUI在处理时不够“最佳”。您可以查看js1k competitition条目以获得灵感。
This post概述了您可以手动执行的一些操作。
Here's an example of a compressor tool可以在最小化时做得更好(例如关闭或YUI)。
答案 1 :(得分:0)
问题不在于长行没有缩小,而是'document'是一个宿主对象,其属性名称由JS环境修复。缩小器通过使用较短的名称重命名变量来工作,但它不能重命名“文档”或其他主机对象的属性。
如果你的代码的很大一部分被这些重复的行占用,你应该将功能包装在你在所有这些地方调用的函数中,而不是每次都直接使用'document'。您的代码的一些示例将有助于更具体地说明如何执行此操作。
答案 2 :(得分:0)
答案 3 :(得分:0)
它是不可读的,因为你创建了不可读的变量名,为什么不创建相关的变量名然后编译它。
document.getElementById
无法重命名,但您可以创建一个返回document.getElementById
的函数,该函数可以重命名。
var getElementById = function(id){
return document.getElementById(id);
}
var getElementByIdClick = function(id, method_call){
return getElementById(id).onclick = method_call;
}
这可以编译为
function f(h) {
return document.getElementById(h);
}
function g(h, k) {
return f(h).onclick = k;
}
或
function f(h){return document.getElementById(h)}function g(h,k){return f(h).onclick=k}
闭包编译器的技巧是你使用尽可能多的变量,通常不是一个好主意,但是闭包是如此之好,它将决定什么是最好的。
因此,除了将重复出现的代码移动到函数中之外,您还可以将每个“点符号”换成“方括号”,并为每个属性和方法名称使用变量。
这是一个极端的例子。
var _document=document,getElementById='getElementById', id='test',onclick='onclick',method_call=function(){};
_document[getElementById](id)[onclick] = method_call;
Closure编译器将决定是否使用括号,如果是,它将重命名您的变量。
你最终会得到这个;
var a=document,b='getElementById',c='test',d='onclick',e=function(){};
a[b](c)[d]=e;
或者它可能用点符号替换它并删除所有变量,但至少你已经给它了选项。
document.getElementById('test').onclick=function(){} //method_call
document.getElementById('test')
永远无法编译为此a[b](c)
closure compile的ADVANCED_OPTIMIZATIONS
选项会重命名函数,但会考虑函数的使用次数。它可能会完全删除该功能,而只需使用document.getElementById
。