gwt代码拆分:测试片段是否已经加载有任何好处吗?
在定义排除代码片段的上下文和其中建议的模块模式中,我理解第一次使用staticgwt代码拆分:测试片段是否已经加载有任何好处吗?,gwt,Gwt,在定义排除代码片段的上下文和其中建议的模块模式中,我理解第一次使用staticmodule.createAsync(最终ModuleClient客户端)调用,然后下载模块类中的代码,对该静态函数的后续调用将不会再次下载相同的代码片段 该模式进一步建议缓存模块类的实例,以“用于模块之后肯定加载的任何代码” 因此,我的问题是: 从初始片段进行第一次调用后,是否每次调用Module.createAsync(最终ModuleClient)都会调用服务器以检查是否需要下载代码片段?或者调用onSucces
module.createAsync(最终ModuleClient客户端)调用
,然后下载模块
类中的代码,对该静态函数的后续调用将不会再次下载相同的代码片段
该模式进一步建议缓存模块
类的实例
,以“用于模块之后肯定加载的任何代码”
因此,我的问题是:
Module.createAsync(最终ModuleClient)
都会调用服务器以检查是否需要下载代码片段?或者调用onSuccess()
时是否没有任何服务器调用开销模块
代码成为初始下载的一部分(即,不是独占片段)INSTANCE.showBigComplexizedStuff()初始片段子句中的code>会导致模块
代码包括showBigComplexidestuff()
成为初始片段的一部分,或者模块
无论如何都将位于独占片段中,因为新模块()
在模块内调用。createAsync
(在GWT.runAsync
中)
INSTANCE==null
时,这种第一次调用Module.createAsync
的模式才有助于减少对服务器不必要的异步调用吗?(同样,我知道那些最终的服务器调用不会再次下载相应的Module
片段)您拥有的代码不完整-不清楚您为什么拥有
实例
和实例
,如果实例是作为Module.createAsync的一部分生成的公共字段,是否还有其他内容可以填充它?我将试着自己回答这两个问题,并指出我在此过程中所做的任何假设
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();