【问题标题】:Detecting Super Dev Mode from within GWT app从 GWT 应用程序中检测超级开发模式
【发布时间】:2014-11-13 19:42:16
【问题描述】:

我想标题说明了一切:

是否有某种标志可以让我的 GWT 应用检查它当前是否在超级开发模式下运行(可能类似于 GWT.isProdMode())?

【问题讨论】:

    标签: gwt gwt-super-dev-mode


    【解决方案1】:

    有一个 open issue 关于拥有像 GWT.isProdMode() 这样的公共访问器。

    同时,如果您真的需要知道,可以在<replace-with><generate-with> 规则中使用名为superdevmode 的延迟绑定属性。

    【讨论】:

    • 我会使用<when-property-is name="superdevmode" value="on" />,对吗?
    • 效果很好。谢谢。
    【解决方案2】:

    正如已经提到的,您可以使用superdevmode 属性。

    这是一个真实的例子:

    1. 创建一个包含一个方法的类,该方法告诉我们不在 SuperDevMode:

      public class SuperDevModeIndicator {
          public boolean isSuperDevMode() {
              return false;
          }
      }
      
    2. 扩展之前的类并重写一个方法来告诉我们在 SuperDevMode:

      public class SuperDevModeIndicatorTrue extends SuperDevModeIndicator {
          @Override
          public boolean isSuperDevMode() {
              return true;
          }
      }
      
    3. 根据 superdevmode 属性仅使用一个适当的类 - 使用延迟绑定 - 将其放入您的 *.gwt.xml

      <!-- deferred binding for Super Dev Mode indicator -->
      <replace-with class="com.adam.project.client.SuperDevModeIndicatorTrue">
        <when-type-is class="com.adam.project.client.SuperDevModeIndicator"/>
        <when-property-is name="superdevmode" value="on" />
      </replace-with>
      
    4. 通过延迟绑定实例化SuperDevModeIndicator 类:

      SuperDevModeIndicator superDevModeIndicator = GWT.create(SuperDevModeIndicator.class);
      
    5. 用它来检查你是否处于 SuperDevMode:

      superDevModeIndicator.isSuperDevMode();
      

    瞧!

    您可以在此处找到有关 Deferred binding 的文档。

    【讨论】:

    • 你能在服务器上使用这种技术吗?我只能在客户端上使用 GWT.create()
    【解决方案3】:

    我可以建议:

    public boolean isSuperDevMode()
    {
        return Window.Location.getPort().equals("8888");
    }
    

    【讨论】:

    • 开发模式不仅可以为本地主机启动
    【解决方案4】:

    也许有一种“官方”方式,但这应该可行:

    Storage stockStore = Storage.getSessionStorageIfSupported();
    if (stockStore != null)
    {
        boolean isSuperDevMode = stockStore.getItem("__gwtDevModeHook:" + GWT.getModuleName()) != null);
    }
    

    【讨论】:

    • :) 聪明的破解!我喜欢。但我认为我会采用@ThomasBroyer 建议的延迟绑定方法,特别是因为(我认为)这可以与我在 GWT 外部使用的库中的代码消除一起使用。 +1
    【解决方案5】:

    您可以使用下面实现的 GWTHelper.isSuperDevMode() 方法。

    public final class GWTHelper {
    
        public static boolean isSuperDevMode() {
            final Storage storage = Storage.getSessionStorageIfSupported();
            if (storage == null) {
                return false;
            }
            final String devModeKey = "__gwtDevModeHook:" + GWT.getModuleName();
            return storage.getItem(devModeKey) != null;
        }
    
    }
    

    来源:https://gwt.googlesource.com/gwt/+/master/dev/core/src/com/google/gwt/core/linker/DevModeRedirectHook.js

    【讨论】:

      【解决方案6】:

      检查开发应用服务器: GWT.getHostPageBaseURL() 返回http://127.0.0.1:8888/

      服务器端:request.getRemoteHost() 应该返回相同的(虽然我没有测试过)。

      检查超级开发模式(与没有 SDM 的开发应用服务器相比): 如果 GWT.getModuleBaseURL() 和 GWT.getModuleBaseForStaticFiles() 不同, 你处于超级开发模式。

      property name="superdevmode" 解决方案对我不起作用。

      【讨论】:

        【解决方案7】:

        我使用了以下方法:

        private static native boolean isSuperDevMode()/*-{ return typeof $wnd.__gwt_sdm !== 'undefined'; }-*/;

        在 GWT 2.7.0 中工作。

        【讨论】:

          【解决方案8】:

          我的解决办法是:

          GWT.getModuleBaseForStaticFiles().contains("9876")
          

          【讨论】:

            【解决方案9】:

            这是一个很好的解决方案。

            boolean superdevmode = "on".equals(System.getProperty("superdevmode"));
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-08-22
              • 2021-09-07
              • 2018-02-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多