Is it possible in a large GWT project, load some portion of JavaScript lazy, on the fly? Like overlays.
PS: Iframes is not a solution.
Is it possible in a large GWT project, load some portion of JavaScript lazy, on the fly? Like overlays.
PS: Iframes is not a solution.
查看GWT.runAsync
下面的 Google I/O 演讲,其中涉及JavaScript
项目中GWT
的延迟加载。
GWT 不容易支持这一点,因为您加载的模块需要(或者更确切地说可能需要)的所有 Java 代码都被编译到单个 JavaScript 文件中。这个单一的 JavaScript 文件可能很大,但对于重要的模块,它比等效的手写 JavaScript 文件要小。
您是否有单个生成的 JavaScript 文件太大的情况?
尝试使用 iPhone 或 iPod touch 以“一次性”方法加载大型 GWT 应用程序......它永远不会加载。
模块方法管理起来更复杂,但更适合较小的客户端设备。
现在,如何在不使用 iFrame 的情况下从我的 Java 代码中加载模块?
我想这就是你要找的。
<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、适用于 Windows 的 Safari 3.1.2、IE 6 和 Opera 9.52 中测试并运行。我认为这些的高级版本也应该可以工作。
请注意,加载是异步的。如果您在调用后立即尝试在加载的文件中使用函数或变量appendChild()
很可能会失败,这就是为什么我在加载的脚本文件中包含一个回调,该回调会在脚本加载完成时强制运行初始化函数.
您也可以在加载脚本的底部调用一个内部函数来在加载后执行某些操作。
您可以想象将您的应用程序拆分为多个 GWT 模块,但您需要记住,这将限制您在模块之间共享代码的能力。因此,如果一个模块的类引用了另一个模块引用的同一类,则公共类的代码将被包含两次。
实际上,模块创建了自己的命名空间,类似于通过两个单独的类加载器加载同一个类时在 Java 中获得的命名空间。事实上,因为 GWT 编译器只编译代码中引用的方法(即,它会消除死代码),所以可以想象一个模块将包含从公共类到另一个模块的不同方法子集。
因此,您必须权衡是否将其全部加载为一个整体模块并在第一轮进行前期打击,是否比拥有多个累积代码大小可能明显大于单个模块方法的模块更好。
鉴于 GWT 的设计目的是让用户只应加载相同版本的模块一次(此后将被缓存),在大多数情况下,一次性预先命中更为可取。