在大型GWT项目中,是否有可能在运行时加载一些懒惰的JavaScript? 喜欢叠加。
PS:iframe不是解决方案。
答案 0 :(得分:7)
查看GWT.runAsync
以及下面的Google I / O演讲,该演讲将在JavaScript
项目中延迟加载GWT
。
答案 1 :(得分: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 for Windows,IE 6和Opera 9.52中测试并使用。我认为这些版本的高级版本也可以正常工作。
请注意,加载是异步的。如果在调用appendChild()
之后立即尝试在加载的文件中使用函数或变量,它很可能会失败,这就是为什么我在加载的脚本文件中包含了一个强制执行初始化函数的回调。脚本完成加载。
您也可以在加载的脚本底部调用内部函数,以便在加载后执行某些操作。
答案 2 :(得分:0)
GWT并不支持这一点,因为您加载的模块所需的(或更确切地说)所需的所有Java代码都被编译为单个JavaScript文件。这个单独的JavaScript文件可能很大,但对于非平凡的模块,它比同等的手写JavaScript小。
您是否有单个生成的JavaScript文件过大的情况?
答案 3 :(得分:0)
您可以想象将您的应用程序拆分为多个GWT模块,但您需要记住,这将限制您在模块之间共享代码的能力。因此,如果一个模块具有引用另一个模块引用的同一个类的类,则公共类的代码将包含两次。
有效地,模块创建自己的命名空间,类似于Java中的内容,如果您通过两个单独的类加载器加载相同的类。实际上因为GWT编译器只编译代码中引用的方法(即它消除了死代码),所以可以想象一个模块将包含从公共类到另一个模块的不同方法子集。
所以你必须权衡是否将它全部加载为一个整体模块并且第一次采用前期命中比使用多个模块更好,这些模块的累积代码大小可能远远大于单模块方法。
鉴于GWT的设计使得用户只应该加载一次模块的相同版本(之后进行缓存),在大多数情况下,最好先关闭一次模块。
答案 4 :(得分:0)
尝试使用iPhone或iPod touch以“一个前期”方法加载一个大型GWT应用程序......它永远不会加载。
模块方法管理起来更复杂,但对于较小的客户端设备更好。
现在,如何在不使用iFrame的情况下从我的Java代码加载模块?