通过*. GWT .xml精确控制GWT排列



我需要精确地指定GWT排列并控制其中的变化(每个排列支持的属性值的组合),但很难找到详细的行为规范。

在我的实验中,我知道我必须注意创建set-property…当房产循环时,即使这些循环是"稳定的"——也就是说,它们不会改变周期的任何部分,只是"确认"它。这限制了我能做的事情,所以我决定尝试另一种方法——定义一个全新的属性,(只是)例如:

  <define-property name="precise.permutation" values="webkit,gecko,ie,unsupported"/>

…然后输入如下:

  <set-property name="precise.permutation" value="webkit">
    <!-- ... custom conditions ... -->
  </set-property>
  <set-property name="precise.permutation" value="gecko">
    <!-- ... custom conditions ... -->
  </set-property>
  <set-property name="precise.permutation" value="ie">
    <!-- ... custom conditions ... -->
  </set>
  <set-property name="precise.permutation" value="unsupported">
    <!-- ... custom conditions ... -->
  </set-property>

…然后,我尝试将其限制为除了不支持之外的所有内容,这是用作示例的,但完全违反直觉,因为它使用与上面相同的set-property标签:

  <set-property name="precise.permutation" value="webkit,gecko,ie" />

我还必须折叠其他属性,以确保它们不会导致额外的排列。

不幸的是,这似乎不像预期的那样工作(试用GWT 2.8 RC2)。即使没有显示"不支持的"排列(这是期望的),来自它的属性组合也会重新出现在其他排列中(这不是期望的)。

有人能帮我找到权威的和完整的文档,或者帮我解决这个问题吗?

谢谢!

我还没有找到详细的文档,但我做了大量的实验,得出了以下结论…

(注意:我的例子使用了我开发的Sencha GXT中的一些概念)

& lt; define-property>用于定义属性及其可能的值,但不是实际使用哪些值的最后决定。在*.gwt.xml文件的层次结构中,每个属性应该有一个这样的定义。

& lt; set-property>不会将属性设置为一个值,而是为该属性创建一种包含可能值的集合的规则(理想情况下是在&ltdefine-property>中定义的子集)。set-property>的最后一次声明对于给定的属性获胜。小心!如果你使用后& lt; inherits>(继承一个模块),你可能/将会重写你继承的任何规则。注意,有条件规则和无条件规则。例如,

<set-property name="gxt.user.agent" value="ie10, ie11, gecko1_9, safari5, chrome"/>

…将无条件地声明,在确定排列时,属性' gext .user. 'Agent’可以具有所列值中的任何一个。相反,

<set-property name="user.agent" value="safari">
  <any>
    <when-property-is name="gxt.user.agent" value="safari5" />
    <when-property-is name="gxt.user.agent" value="chrome" />
  </any>
</set-property>

将说明该用户。代理只能是"safari",当"gext .user."Agent"是"safari5"或"chrome"。顺序似乎很重要,因此您可能希望从属属性的规则在其依赖项的规则之后声明。循环依赖项将导致编译失败。您可以创建许多条件规则,只要它们不相互矛盾。我还不知道如果他们这样做会发生什么,但我猜最后宣布的人会赢。

注意条件规则也可以指定多个可能的值。例如(仅作说明,可能不符合您的需要):

<!-- On desktops we do all browsers including IE -->
<set-property name="gxt.user.agent" value="safari5, chrome, gecko1_9, ie11">
  <when-property-is name="gxt.device" value="desktop" />
</set-property>
<!-- ... but on tablets and phones we exclude IE -->
<set-property name="gxt.user.agent" value="safari5, chrome, gecko1_9">
  <any>
    <when-property-is name="gxt.device" value="tablet" />
    <when-property-is name="gxt.device" value="phone" />
  </any>
</set-property>

你可以使用和& lt; all>创建复杂/复合标准。它们可以相互嵌套。

如何使用它来精确控制排列?您可能不需要它,但它帮助我开始定义两个属性,像这样:

<define-property name="custom.use.case" values="case1, case2, ..."/>
<property-provider name="helix.product.mode"><![CDATA[   
    var useCase = ...; // JavaScript code to determine the use case
    return useCase;
  ]]>
</property-provider>
<define-property name="custom.permutation" values="perm1, perm2, ..."/>

第一个属性定义了用例。上面我有一种在运行时确定它的方法。你可能不会,也可能跳过它。它还可以作为定义其他所有内容的起点,因为我们可以根据用例定义所有其他属性。例如:

<!-- Case 1 restrictions -->
<set-property name="gxt.device" value="desktop">
  <when-property-is name="custom.use.case" value="case1" />
</set-property>
<set-property name="gxt.user.agent" value="chrome, safari5, gecko1_9, ie11">
  <when-property-is name="custom.use.case" value="case1" />
</set-property>
...
<!-- Case 2 restrictions -->
<set-property name="gxt.device" value="tablet, phone">
  <when-property-is name="custom.use.case" value="case2" />
</set-property>
<set-property name="gxt.user.agent" value="chrome, safari5, gecko1_9">
  <when-property-is name="custom.use.case" value="case2" />
</set-property>
...
<!-- Case 3 restrictions -->
<set-property name="gxt.device" value="tablet, phone">
  <when-property-is name="custom.use.case" value="case3" />
</set-property>
<set-property name="gxt.user.agent" value="safari5">
  <when-property-is name="custom.use.case" value="case3" />
</set-property>
...
etc.
接下来要做的是折叠所有属性,除了为自定义。排列,因为我们只想要习惯。排列驱动排列:
  <collapse-property name="custom.use.case" values="*" />  
  <collapse-property name="gxt.device" values="*" />
  <collapse-property name="gxt.user.agent" values="*" />
  <collapse-property name="user.agent" values="*" />
  <collapse-property name="user.agent.os" values="*" />

这种方法允许对"排列"及其内部复杂性进行极细粒度的控制,有些人称之为"软排列"。对于每种可能的"习惯",只有一种排列。排列"属性值。如果你很好地设置了上述规则,那么每个排列将只包含所需的"软排列"。

注意,实际排列和软排列都需要成本。拥有许多软排列(分组为实际排列或不分组为实际排列)会消耗编译性能和分组所处排列的运行时代码大小。不要忽略这一点,特别是如果您有许多属性。实际的排列有更高的编译和链接时间成本(但是拥有更多的排列,而不是将许多软排列组合成分组的实际排列,可以减少每个排列的大小)。

如果使用GXT,从版本4开始,您会注意到它添加了GXT .device属性,其值为desktop、tablet和phone。这导致我们的编译时间在升级到gxt4后增加了大约6-7倍,因为我们的排列失去了控制。有些游戏是为Mac OS平板电脑上的ie浏览器设计的。您可以理解对不存在的用例进行排列是多么浪费时间。通过实现上述功能,我们能够将GWT编译时间减少到原始时间的一半左右,或者比gxt4升级后的编译时间快10-12倍。

最新更新