像 google 收件箱那样将 java 翻译成 java 脚本

Translate java to javascript like google inbox did

最近我读到 a blog post Google 已使用 GWT 将 java 中的模型 classes 转换为 java 收件箱的脚本 android 和网络应用程序。我正在评估这对下一个 android 项目是否有意义,该项目可以与 Web 应用程序(java 脚本)共享模型代码基础,所以我开始了一些 java / gradle 基于项目,我只是想 "translate" 一个 Model class 到 javascript.

public class Model {
  public String foo;
  public int anInt;

  public String fancy(){
     return foo + anInt;
  }
}

我的代码是这样组织的:

-src
    -main
        -java
            -com
                -tickaroo
                        -Model.gwt.xml
                        -shared
                            -Model.java

在我的 build.gradle 中,我使用 this gradle plugin:

apply plugin: 'java'
apply plugin: 'gwt-compiler'

gwt {
  gwtVersion = '2.7.0'

  compiler {
    strict = false;
    enableClosureCompiler = true;
    disableClassMetadata = false;
    disableCastChecking = false;
    style = 'DETAILED';
  }

  modules 'com.tickaroo.Model'
}

Model.gwt.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<module>
  <source path="shared" />
  <inherits name="com.google.gwt.user.User"/>
</module>

我使用 ./gradlew compileGwt 编译它,生成 gwt 东西,如 5F23E45D7ECEA3E7E1FBCB3E0CF8B557.cache.jscom.tickaroo.Model.nocache.js

好吧,我想我可以通过某种方式让 java 脚本翻译 Model class 工作并在 java 脚本中访问它 "natively":

 <javascript>
    var model = new com.tickaroo.shared.Model()
    model.fancy()
 </javascript>

GWT 可以吗? Google 的收件箱团队是如何做到的?有谁知道如何在 GWT 或博客文章等任何其他来源中做到这一点?

我们的想法是为 android 、web 和后来的 iOS (j2objc) 建立一个通用的(部分)业务逻辑层。我们有一个复杂的同步算法,我们想做一个同步层,或者如果你想用 public api 称它为库。这个想法是让这个同步库编写一次并翻译到网络和 iOS 平台。该库的 public api 将允许 "inject" 特定于平台的依赖项,如持久层 (DAO)。所以会有手写的java脚本代码,应该与生成的同步库java脚本代码互操作。

我找到了一个名为 gwt-exporter 的 GWT 插件,它似乎可以做类似的事情。但是,这不是在积极开发中,我会避​​免使用此类第三方的东西。

GWT 是一个优化编译器。它修剪所有未从 EntryPoint 引用的内容(类、字段、方法),进行各种优化(方法内联等)并最终混淆所有内容以生成尽可能小的 JS脚本。它主要用于应用程序,而不是库。

gwt-exporter 正在被 JsInterop 取代,但它现在仍然是 alpha 质量(JsInterop V1 应该在今年的 spring 中出现在 2.8 中)。 JsInterop 将使 GWT 更适合 JS 库和混合应用程序(如 Inbox)。 Inbox 团队可能依赖于 JsInterop,但他们还使用了具有自定义功能的 GWT 编译器的分支,以便更好地与 Closure 集成(GWT 生成带有 Closure 注释的 JS),因此它可能不是我们现在可以使用的 JsInterop "from the outside".