2008-09-16 111 views
5

是否有可能在一個大的GWT項目中,在飛行中加載JavaScript的一部分懶惰? 像疊加。gwt延遲加載

PS:Iframes不是解決方案。

+0

學究氣:*在,*部分 – GEOCHET 2008-09-16 13:55:34

回答

0

我認爲這就是你要找的。

<body onload="onloadHandler();"> 
<script type="text/javascript"> 
function onloadHandler() { 
    if (document.createElement && document.getElementsByTagName) { 
     var script = document.createElement('script'); 
     script.type = 'text/javascript'; 
     script.src = './test.js'; 
     var heads = document.getElementsByTagName('head'); 
     if (heads && heads[0]) { 
      heads[0].appendChild(script); 
     } 
    } 
} 
function iAmReady(theName) { 
    if ('undefined' != typeof window[theName]) { 
     window[theName](); 
    } 
} 
function test() { 
    // stuff to do when test.js loads 
}   
</script> 

- test.js

iAmReady('test'); 

測試,在Firefox 2,Safari瀏覽器3.1.2工作於Windows,IE 6和Opera 9.52。我認爲這些版本的最新版本應該也能工作。

請注意,加載是異步的。如果您在調用appendChild()後立即嘗試在加載的文件中使用函數或變量,它很可能會失敗,這就是爲什麼我在加載的腳本文件中包含一個回調函數,該腳本文件強制在腳本完成時運行初始化函數加載。

你也可以在加載的腳本底部調用一個內部函數來做一些事情。

0

由於您加載的模塊需要的所有Java代碼都被編譯爲單個JavaScript文件,因此GWT並不支持此操作。這個JavaScript文件可能很大,但對於非平凡的模塊來說,它比等效的手寫JavaScript小。

您是否有單一生成的JavaScript文件太大的情況?

0

你可以想象將你的應用程序分成多個GWT模塊,但你需要記住,這將限制你在模塊之間共享代碼的能力。因此,如果一個模塊具有引用與另一個模塊引用的相同類的類,則通用類的代碼將包含兩次。

有效地,這些模塊創建它們自己的命名空間,類似於在Java中通過兩個單獨的類加載器加載相同的類時獲得的命名空間。實際上,因爲GWT編譯器只在代碼中引用的方法中進行編譯(即,它會執行死代碼消除),所以可以想象,一個模塊將包含從公共類到另一個模塊的不同方法子集。

因此,您必須權衡是否將它全部加載爲一個單片模塊,並且首次執行前期命中比擁有多個模塊的累積代碼大小可能明顯高於單模塊方法要好。

鑑於GWT的設計使得用戶只需加載一次相同版本的模塊(之後進行緩存),在大多數情況下,最好先打一次。

0

嘗試使用iPhone或iPod touch的「一種前沿」方法加載大型GWT應用程序......它永遠不會加載。

該模塊方法是一個但更復雜的管理,但更好的小型客戶端設備。

現在,我如何從我的Java代碼加載模塊而不使用iFrame?

  • 埃裏克