2008-09-16 162 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?

  • 埃里克