Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gwt 延迟加载_Gwt_Lazy Loading - Fatal编程技术网

Gwt 延迟加载

Gwt 延迟加载,gwt,lazy-loading,Gwt,Lazy Loading,在一个大型GWT项目中,是否可以动态加载部分JavaScript? 像覆盖层 附注:Iframes不是一个解决方案。我想这就是您要寻找的 <body onload="onloadHandler();"> <script type="text/javascript"> function onloadHandler() { if (document.createElement && document.getElementsByTagName) {

在一个大型GWT项目中,是否可以动态加载部分JavaScript? 像覆盖层


附注:Iframes不是一个解决方案。

我想这就是您要寻找的

<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>
在Firefox 2、Safari 3.1.2 for Windows、IE 6和Opera 9.52中测试并使用。我认为这些的高级版本也应该可以工作

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


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

GWT不支持这一点,因为您加载的模块所需的所有Java代码(或者更确切地说可能需要的代码)都被编译成单个JavaScript文件。这个JavaScript文件可能很大,但对于非普通模块,它比同等的手写JavaScript文件小


您是否有单个生成的JavaScript文件太大的场景

您可以将应用程序拆分为多个GWT模块,但您需要记住,这将限制您在模块之间共享代码的能力。因此,如果一个模块的类引用了另一个模块引用的同一个类,那么公共类的代码将包含两次

模块有效地创建了自己的名称空间,类似于通过两个单独的类加载器加载同一个类时在Java中得到的名称空间。事实上,由于GWT编译器只在代码中引用的方法中编译(即,它会消除死代码),因此可以想象,一个模块将包含从公共类到另一个模块的不同方法子集

因此,您必须权衡是否将所有模块作为一个单片模块加载,并在第一轮中先发制人,比拥有多个模块(其累积代码大小可能明显大于单模块方法)要好


考虑到GWT的设计,用户只需加载同一版本的模块一次(之后会缓存),在大多数情况下,一次过的前期点击更可取。

尝试使用iPhone或iPod touch以“一次前端”的方式加载大型GWT应用程序……它永远不会加载

模块方法是一种更复杂的管理方法,但更适合于较小的客户端设备

现在,如何在不使用iFrame的情况下从Java代码加载模块

  • 埃里克

查看
GWT.runAsync
以及下面的Google I/O对话,它在
GWT
项目中延迟加载
JavaScript

  • (大约时间25:30)
iAmReady('test');