GWT 惰性加载

5

在一个大型的GWT项目中,是否有可能在运行时懒加载一些JavaScript代码,就像叠加层一样? 比如叠加层。

PS:使用iframe并不是解决方案。

5个回答

7

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>

-- 测试.js

iAmReady('test');

已在Firefox 2、Safari 3.1.2 for Windows、IE 6和Opera 9.52中进行了测试并且可用。我认为这些的升级版本也应该可以使用。

请注意,加载是异步的。如果您在调用appendChild()后立即尝试使用加载文件中的函数或变量,则很可能会失败,这就是为什么我在加载的脚本文件中包含了一个回调,它会在脚本加载完成时强制运行初始化函数。

您还可以在加载的脚本底部调用内部函数,在加载完成后执行某些操作。


0

GWT不容易支持这个功能,因为所有加载模块所需的Java代码(或者可能需要的Java代码)都被编译成一个单独的JavaScript文件。虽然这个单独的JavaScript文件可能很大,但对于非平凡的模块来说,它比手写的等效JavaScript文件要小。

您是否有一个场景,其中单个生成的JavaScript文件太大了?


0
你可以将应用程序拆分成多个GWT模块,但需要记住这会限制在模块之间共享代码的能力。因此,如果一个模块具有引用另一个模块引用的相同类的类,则公共类的代码将被包含两次。
实际上,这些模块创建了自己的命名空间,类似于在Java中通过两个单独的类加载器加载相同类所获得的结果。事实上,由于GWT编译器仅编译代码中引用的方法(即它执行死代码消除),因此一个模块可能会包含与其他模块不同的公共类子集。
因此,您必须权衡一下,是将所有内容作为一个庞大的模块加载并在第一轮中承受前期损失更好,还是使用多个模块,其累积代码大小可能远大于单个模块方法。
考虑到GWT的设计使用户只需加载一次模块的相同版本(之后将缓存),在大多数情况下,一次性的前期损失是可取的。

0
尝试使用iPhone或iPod touch的“一次性”方法加载大型GWT应用程序...它永远不会加载。
模块化方法有点复杂,但更适合较小的客户端设备。
现在,我如何在我的Java代码中加载模块而不使用iFrame?
  • Erick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接