2012-05-12 60 views
1

我試過使用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); 

然而,這會使代碼難以閱讀。有沒有我錯過的選項會爲我做這個。谷歌或雅虎當然知道如何自動執行此操作?

+0

只是目測它,我可以減少我的.js大小5-20%做這個長函數名稱。 –

+0

我不明白。您不能最小化文檔或getElementById並點擊 - 它們是標準的JavaScript名稱,不能重命名。似乎是微不足道的唯一的事情是「測試」。 –

回答

1

在嘎吱嘎吱聲中,封閉和YUI可能不是「最優」。你可以看看js1k competitition條目的一些靈感。

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

Here's an example of a compressor tool這可能會做得更好(比封閉或YUI)最小化。

+0

謝謝...良好的信息...似乎沒有minifiers(我見過)可以「打電話」何時添加一個函數,以減少多次調用該函數的長度... –

+0

有人應該寫這篇文章....這將節省大量的空間......基本上上面列出的手冊部分可以很容易地自動生成。 –

+0

由於js文件太大,我從未有過任何我製作的網站導致我的問題。有很好的評論真的非常重要(正如你知道的那樣,文件大小會更大)。您可能會過早地進行優化。 –

0

問題不在於長行不會縮小,而是'document'是一個宿主對象,其屬性名稱由JS環境修復。縮小器通過用較短的名稱重命名變量來工作,但不能重命名「文檔」或其他主機對象的屬性。

如果很大一部分代碼被這些重複行佔據,則應該將功能包括在所有這些地方調用的函數中,而不是每次都直接使用「文檔」。你的代碼的一些例子將有助於更具體地說明如何做到這一點。

+0

它確實在文檔上進行了替換...而不是getElementById()部分。 –

0
  1. 帶你在你的JS做重複動作的列表

  2. 定義所有這些功能,讓他們在你的腳本的開頭的自定義名稱,無論你想使用這些功能(看看here

  3. 壓縮/壓縮JavaScript here

希望這會有所幫助。

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} 

訣竅關閉編譯器使用盡可能多的變量可能的,不是一般的好主意,但關閉是這麼好,它會決定最好的。

因此,除了將重複出現的代碼移入函數之外,您還可以將每個「點符號」替換爲「方括號表示法」,併爲每個屬性和方法名稱使用變量。

這是一個極端的例子。

var _document=document,getElementById='getElementById', id='test',onclick='onclick',method_call=function(){}; 
_document[getElementById](id)[onclick] = method_call; 

閉合編譯器將決定是否使用括號,如果是的話,它會重命名您的變量。

你可能以此結束;

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)

ADVANCED_OPTIMIZATIONS選項closure compile將重命名功能,但它確實考慮到了多少次功能被使用。它可能完全刪除功能,只需使用document.getElementById

+0

'var u =「undefined」;'在這裏和那裏保存幾個字節,例如'if(typeof var1 == u)' – TarranJones