如何缩小长语句?

时间:2012-05-12 17:24:04

标签: javascript minify

我已尝试同时使用Google ClosureYahoo'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);

然而,这使得代码难以阅读。有没有我想念的选项会为我做这件事。当然谷歌或雅虎知道如何自动执行此操作?

4 个答案:

答案 0 :(得分:1)

也许封闭和YUI在处理时不够“最佳”。您可以查看js1k competitition条目以获得灵感。

This post概述了您可以手动执行的一些操作。

Here's an example of a compressor tool可以在最小化时做得更好(例如关闭或YUI)。

答案 1 :(得分:0)

问题不在于长行没有缩小,而是'document'是一个宿主对象,其属性名称由JS环境修复。缩小器通过使用较短的名称重命名变量来工作,但它不能重命名“文档”或其他主机对象的属性。

如果你的代码的很大一部分被这些重复的行占用,你应该将功能包装在你在所有这些地方调用的函数中,而不是每次都直接使用'document'。您的代码的一些示例将有助于更具体地说明如何执行此操作。

答案 2 :(得分:0)

  1. 列出您在JS中执行的重复操作

  2. 定义所有这些功能,在脚本开头给它们一个自定义名称,并在任何你想要的地方使用这些功能(看看here

  3. 压缩/缩小您的javaScript here

  4. 希望这有帮助。

答案 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 compileADVANCED_OPTIMIZATIONS选项会重命名函数,但会考虑函数的使用次数。它可能会完全删除该功能,而只需使用document.getElementById