gwt代码拆分:测试片段是否已经加载有任何好处吗?

gwt代码拆分:测试片段是否已经加载有任何好处吗?,gwt,Gwt,在定义排除代码片段的上下文和其中建议的模块模式中,我理解第一次使用staticmodule.createAsync(最终ModuleClient客户端)调用,然后下载模块类中的代码,对该静态函数的后续调用将不会再次下载相同的代码片段 该模式进一步建议缓存模块类的实例,以“用于模块之后肯定加载的任何代码” 因此,我的问题是: 从初始片段进行第一次调用后,是否每次调用Module.createAsync(最终ModuleClient)都会调用服务器以检查是否需要下载代码片段?或者调用onSucces

在定义排除代码片段的上下文和其中建议的模块模式中,我理解第一次使用static
module.createAsync(最终ModuleClient客户端)调用
,然后下载
模块
类中的代码,对该静态函数的后续调用将不会再次下载相同的代码片段

该模式进一步建议缓存
模块
类的
实例
,以“用于模块之后肯定加载的任何代码”

因此,我的问题是:

  • 从初始片段进行第一次调用后,是否每次调用
    Module.createAsync(最终ModuleClient)
    都会调用服务器以检查是否需要下载代码片段?或者调用
    onSuccess()
    时是否没有任何服务器调用开销

  • 初始片段中的以下代码是否会导致
    模块
    代码成为初始下载的一部分(即,不是独占片段)

  • >

    换言之:

  • 是否存在
    INSTANCE.showBigComplexizedStuff()会导致
    模块
    代码包括
    showBigComplexidestuff()
    成为初始片段的一部分,或者
    模块
    无论如何都将位于独占片段中,因为
    新模块()
    模块内调用。createAsync
    (在
    GWT.runAsync
    中)

  • 只有在
    INSTANCE==null
    时,这种第一次调用
    Module.createAsync
    的模式才有助于减少对服务器不必要的异步调用吗?(同样,我知道那些最终的服务器调用不会再次下载相应的
    Module
    片段)


  • 您拥有的代码不完整-不清楚您为什么拥有
    实例
    实例
    ,如果实例是作为Module.createAsync的一部分生成的公共字段,是否还有其他内容可以填充它?我将试着自己回答这两个问题,并指出我在此过程中所做的任何假设

  • 假设INSTANCE类型的对象永远不可能在
    GWT.runAsync
    之外创建,那么实例方法
    showBigComplexidStuff
    无法执行任何操作,除非加载了拆分点(因此至少创建了一个实例)-编译器足够聪明,可以解决这个问题

  • 空检查是毫无意义的,原因正是您提到的-如果您知道没有服务器调用去获取新的
    GWT.runAsync
    片段,那么您认为在
    GWT.runAsync
    中发生了什么异步服务器调用?如果代码已经下载,并且不需要再次下载,那么我就在那里没什么可下载的

  • 自页面加载后第二次运行
    GWT.runAsync
    不会产生任何开销。如果缓存实现正确,即使在页面再次加载后第一次命中它,也应该是便宜/免费的(这意味着服务器不会再次命中,但仍然需要将JS解析到内存中)

    因此,由于
    GWT.runAsync
    在加载后没有服务器调用开销(并且
    实例
    为非空
    ),因此您不必担心它。GWT将注意到它已经有了所需的代码,并且不会再次尝试下载它


    即使没有所谓的“完美”缓存,这种行为也会成立。如果您碰巧设置了缓存头,以便将
    .cache.
    文件缓存一年,那么第二次加载模块或分割点时,它将继续使用相同的本地结果,而没有网络流量。如果没有完美的cache但磁盘上的文件仍然相同,重新加载应用程序将导致
    304未修改
    -不是免费的,但不会像再次下载那样昂贵

    GWT应用程序(使用标准链接器之一)从一个
    appname.nocache.js
    文件开始-该文件包含上面提到的
    字符串,这些字符串仅在代码更改时才会更改,因此不能缓存这些字符串,以便代码更改可以发生,客户端会立即看到更改。给定属性集的初始片段(即“哪种浏览器”*“哪种语言环境”*“哪种形状因子”等)然后作为
    .cache.js
    下载或从缓存中读取,然后当命中给定的拆分点
    时,将拆分点作为
    delferredjs/.cache.js
    获取



    综上所述,
    Module.createAsync
    这件事背后的理论是作为一个异步工厂,因此您当然可以按照您描述的方式使用它。在这种情况下,如果只有一个实例很重要,我可能会有一个
    getOrCreateAsync
    ,它在Module类中执行单例位,只要类负责创建并提供实例,也可以一直提供。这实际上取决于您如何使用实例,它包含什么,等等。

    非常感谢您的全面回答,这是有意义的,正如我所希望的,但我不确定
    GWT.runAsync
    的机制和缓存智能检查是否加载不会影响模块代码拆分,但没有任何用处。为了回答您的问题,我按照单例模式缓存
    INSTANCE
    ,使用public static module.getInstance()实现静态私有它只在
    模块.createAsync
    中的
    GWT.runAsync
    中实例化,所以所有必要和充分的假设都成立。再次感谢。
    if (INSTANCE == null)
      Module.createAsync(new ModuleClient()
      {
        @Override
        public void onUnavailable(Throwable reason)
        {
          // Action in case of failure
        }
        @Override
        public void onSuccess(Module instance)
        {
          instance.showBigComplicatedStuff();
        }
      });
    else
      INSTANCE.showBigComplicatedStuff();