gwt pubnub

¿Cómo incluir bibliotecas de JavaScript de terceros en una biblioteca/widget gwt reutilizable?



pubnub (1)

Estoy tratando de mojarme los pies con GWT para ver si la migración funcionará. Por lo general, pruebo primero las partes más difíciles para asegurarme de poder terminar el proyecto. La parte más difícil de mi (s) proyecto (s) es hacer referencia a libs JS de terceros. En este ejemplo, intento usar PubNub a medida que nuestra plataforma lo usa.

Lo que me gustaría hacer es crear un objeto reutilizable que pueda usarse en otros proyectos de GWT que necesiten PubNub. Tengo una pequeña prueba simple ejecutándose con éxito (es decir, tengo los principios básicos de JNSI funcionando), pero mi pregunta es -> ¿dónde pongo la referencia al script de terceros para crear la biblioteca / módulo correctamente? ?

Ahora solo pongo la referencia a los scripts externos en la página HTML del proyecto, pero estoy bastante seguro de que esto es incorrecto desde la perspectiva de la reutilización, ya que esta lib se usaría en otros proyectos, cada uno de los cuales tendría su propio base de página HTML.

Traté de poner la referencia en el archivo gwt.xml, pero esto parece perder las referencias (es decir, mi proyecto de prueba ya no funciona como lo hacía cuando los guiones estaban en la página HTML)

¿Tiene alguna sugerencia sobre cómo incluir bibliotecas de terceros en una biblioteca / widget GWT reutilizable?


Aquí tiene un ejemplo que usa paquetes de clientes e inyector de scripts, puede usar carga síncrona o asincrónica.

Al usar la sincronización, el contenido js externo se insertará en la aplicación, de lo contrario se incluirá en un fragmento diferente que se obtendrá con una solicitud ajax.

Puedes poner tu API en cualquier servidor y cargarla con el ScriptInjector.

public class Example { public static interface MyApiJs extends ClientBundle { MyApiJs INSTANCE = GWT.create(MyApiJs.class); @Source("my_api.js") TextResource sync(); @Source("my_api.js") // Should be in the same domain or configure CORS ExternalTextResource async(); } public void loadSync() { String js = MyApiJs.INSTANCE.sync().getText(); ScriptInjector.fromString(js).inject(); } public void loadAsync() throws ResourceException { MyApiJs.INSTANCE.async().getText(new ResourceCallback<TextResource>() { public void onSuccess(TextResource r) { String js = r.getText(); ScriptInjector.fromString(js).inject(); } public void onError(ResourceException e) { } }); } public void loadFromExternalUrl() { ScriptInjector.fromUrl("http://.../my_api.js").inject(); } }

[EDITADO]

Un mejor enfoque es usar una nueva característica en gwtquery 1.4.0 llamada JsniBundle . Presentamos esta característica durante las conferencias GWT.create en San Francisco y Frankfurt.

Con este enfoque, puede insertar cualquier javascript externo (colocado en su árbol de origen o alojado en un host externo) como un bloque JSNI. Tiene muchos beneficios:

  • Aproveche los validadores, ofuscadores y optimizadores de GWT jsni.
  • Deshágase de cualquier método jsni java cuando la aplicación no lo use.

La sintaxis es realmente fácil:

public interface JQueryBundle extends JsniBundle { @LibrarySource("http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js") public void initJQuery(); } JQueryBundle jQuery = GWT.create(JQueryBundle.class); jQuery.initJQuery();