2008-09-16 9 views
5

¿Es posible en un gran proyecto GWT cargar algo de JavaScript vago sobre la marcha? Como superposiciones.gwt perezosa cargando

PD: Iframes no es una solución.

+0

Pedantería: * en una, * parte – GEOCHET

Respuesta

0

Creo que esto es lo que estás buscando.

<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'); 

Probado y trabajando en Firefox 2, Safari 3.1.2 para Windows, IE 6 y Opera 9.52. Supongo que las versiones de alto nivel también deberían funcionar.

Tenga en cuenta que la carga es asincrónica. Si intenta usar una función o variable en el archivo cargado inmediatamente después de llamar al appendChild(), es muy probable que falle, es por eso que incluí una devolución de llamada en el archivo de script cargado que obliga a ejecutar una función de inicialización cuando el script está listo cargando.

También puede llamar a una función interna en la parte inferior del script cargado para hacer algo una vez que se haya cargado.

0

GWT no admite esto fácilmente, ya que todo el código Java que es (o más bien puede ser) necesario para el módulo que carga se compila en un único archivo JavaScript. Este único archivo de JavaScript puede ser grande, pero para los módulos no triviales es más pequeño que el JavaScript escrito a mano equivalente.

¿Tiene un escenario en el que el único archivo JavaScript generado es demasiado grande?

0

Podría dividir su aplicación en varios módulos de GWT, pero debe recordar que esto limitará su capacidad para compartir el código entre los módulos. Entonces, si un módulo tiene clases que hacen referencia a la misma clase a la que hace referencia otro módulo, el código de la clase común se incluirá dos veces.

Efectivamente, los módulos crean su propio espacio de nombres, similar a lo que obtienes en Java si cargas la misma clase a través de dos cargadores de clases separados. De hecho, debido a que el compilador de GWT solo compila los métodos a los que se hace referencia en su código (es decir, elimina el código muerto), es concebible que un módulo incluya un subconjunto diferente de métodos de la clase común al otro módulo.

Así que hay que sopesar si cargar todo como un módulo monolítico y tomar un golpe inicial la primera vez es mejor que tener múltiples módulos cuyo código acumulado podría ser significativamente mayor que el enfoque de módulo único.

Dado que GWT está diseñado para que el usuario solo cargue la misma versión de un módulo una vez (se almacena en caché a partir de entonces), en la mayoría de los casos, es preferible el golpe inicial.

0

Intenta cargar una gran aplicación GWT con el enfoque "one upfront" usando un iPhone o un iPod touch ... nunca se cargará.

El enfoque de módulo es más complejo de administrar, pero es mejor para dispositivos de clientes más pequeños.

Ahora, ¿cómo cargo un módulo desde mi código Java sin utilizar un iFrame?

  • Erick