GWT ленивая загрузка - PullRequest
       25

GWT ленивая загрузка

5 голосов
/ 16 сентября 2008

Возможно ли в большом проекте GWT загружать некоторую часть JavaScript на лету? Как и наложения.

PS: Iframes не является решением.

Ответы [ 5 ]

7 голосов
/ 09 июня 2009

Ознакомьтесь с GWT.runAsync, а также с речью Google I / O ниже, в которой говорится о ленивой загрузке JavaScript в GWT проектах.

0 голосов
/ 15 октября 2008

Попробуйте загрузить большое приложение GWT с использованием подхода «один аванс», используя iPhone или iPod touch ... оно никогда не загрузится.

Модульный подход более сложен в управлении, но лучше для небольших клиентских устройств.

Теперь, как мне загрузить модуль из моего кода Java без использования iFrame?

  • Erick
0 голосов
/ 17 сентября 2008

GWT не поддерживает это, так как весь код Java, который (или, скорее, может быть) необходим для загружаемого вами модуля, скомпилирован в один файл JavaScript. Этот единственный файл JavaScript может быть большим, но для нетривиальных модулей он меньше, чем эквивалентный рукописный JavaScript.

Есть ли у вас сценарий, когда один сгенерированный файл JavaScript слишком велик?

0 голосов
/ 17 сентября 2008

Вы могли бы разделить свое приложение на несколько модулей GWT, но вы должны помнить, что это ограничит вашу способность обмениваться кодом между модулями. Таким образом, если один модуль имеет классы, которые ссылаются на тот же класс, на который ссылается другой модуль, код для общего класса будет включен дважды.

По сути, модули создают свое собственное пространство имен, аналогичное тому, которое вы получаете в Java, если загружаете один и тот же класс через два отдельных загрузчика классов. Фактически, поскольку компилятор GWT компилируется только в методах, на которые ссылается ваш код (т. Е. Он устраняет мертвый код), вполне возможно, что один модуль будет включать в себя другое подмножество методов из общего класса в другой модуль.

Таким образом, вы должны взвесить, лучше ли загружать все как один монолитный модуль и делать предварительный удар с первого раза, чем иметь несколько модулей, совокупный размер кода которых может быть значительно больше, чем подход с одним модулем.

Учитывая, что GWT спроектирован так, что пользователь должен когда-либо загружать одну и ту же версию модуля только один раз (после этого он кэшируется), в большинстве случаев предпочтительнее одноразовое обращение.

0 голосов
/ 16 сентября 2008

Я думаю, это то, что вы ищете.

<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(), скорее всего, произойдет сбой, поэтому я включил обратный вызов в загруженный файл сценария, который заставляет функцию инициализации запускаться, когда сценарий загрузка завершена.

Вы также можете просто вызвать внутреннюю функцию внизу загруженного скрипта, чтобы сделать что-то после его загрузки.

...