如何在GWT中将全局样式表迁移到GSS

如何在GWT中将全局样式表迁移到GSS,gwt,Gwt,我有一个GWT2.7应用程序,其中许多样式都是在模块XML文件中引用的CSS文件中完成的。我想把这个文件迁移到GSS,这样我就可以使用一些新的功能,比如变量和函数 有关于迁移到GSS的说明,但它似乎仅适用于通过CSSResource对象使用的样式。我的理解是,唯一可以通过CSSResources访问的类选择器是那些声明访问器的类选择器,并且所有这些类选择器都将被混淆。这对我不起作用,因为我要使用的选择器是未模糊的,它们主要是通过UIObject.addStyleName和addStyleDepe

我有一个GWT2.7应用程序,其中许多样式都是在模块XML文件中引用的CSS文件中完成的。我想把这个文件迁移到GSS,这样我就可以使用一些新的功能,比如变量和函数

有关于迁移到GSS的说明,但它似乎仅适用于通过CSSResource对象使用的样式。我的理解是,唯一可以通过CSSResources访问的类选择器是那些声明访问器的类选择器,并且所有这些类选择器都将被混淆。这对我不起作用,因为我要使用的选择器是未模糊的,它们主要是通过
UIObject.addStyleName
addStyleDependentName
添加的。我也不希望每次我想添加新样式时都必须向接口添加访问器

关于在GWT项目中使用CSS文件的方法:

  • 在主机HTML页面中使用
    标记
  • 使用模块XML文件中的
    元素
  • 在UiBinder模板中使用内联
    元素
前两个似乎不支持GSS:即使我指定了一个GSS文件,它也会直接提供给浏览器,而无需处理

那么,迁移到UIBinder是我唯一的选择吗?如果是的话,最简单的方法是什么?(我当前的HTML主机页只是在
元素中添加了一些额外的内容,所以我觉得这应该很简单)。

使用
与使用
CssResource
是一样的。.ui.xml文件将生成所需的ClientBundle和CssResource文件,这些文件将依次将GSS转换为css

当您在.ui.xml文件中引用
内容时,您这样做就像在接口上校准访问者一样,就像
{style.myStyleName}
——因为您正在调用访问者,但它是自动生成的。这可能会稍微限制您在
标记中可以执行的操作。另一方面,一旦您编写了CSS,您的IDE几乎肯定可以为您自动添加访问器,如果没有,失败的重新编译将列出它们,以便您可以添加它们

如果你只是在Java或HTML中输入一个字符串文字“my class name”,编译器就无法知道“my class name”在应用程序中的任何地方都是相同或不同的,以及何时使用一个CssResource与另一个CssResource。它也不能重写那些字符串,因此CSS将保持未优化状态。另外,现在您可以检查给定css类名访问器的用法-如果没有人使用它,请删除它,然后删除使用它的css,以使.gss文件更小,应用程序更小


html中的
标记和.gwt.xml中的
标记不会导致运行GSS,这是正确的。您不需要使用UiBinder(我个人不是一个粉丝,但有些人喜欢),但您确实需要使用访问器,否则GSS就没有意义了

如果您想避免混淆和重命名,请只考虑直接运行关闭样式表,或者在您的普通CSS文件上使用更少或SASS之类的文件,这些文件没有GWT集成,因此您的字符串文本已经被使用了。这将导致更大的编译输出,并使您无法轻松查找和删除未使用的CSS。

使用
与使用
CssResource
相同。.ui.xml文件将生成所需的ClientBundle和CssResource文件,这些文件将依次将GSS转换为css

当您在.ui.xml文件中引用
内容时,您这样做就像在接口上校准访问者一样,就像
{style.myStyleName}
——因为您正在调用访问者,但它是自动生成的。这可能会稍微限制您在
标记中可以执行的操作。另一方面,一旦您编写了CSS,您的IDE几乎肯定可以为您自动添加访问器,如果没有,失败的重新编译将列出它们,以便您可以添加它们

如果你只是在Java或HTML中输入一个字符串文字“my class name”,编译器就无法知道“my class name”在应用程序中的任何地方都是相同或不同的,以及何时使用一个CssResource与另一个CssResource。它也不能重写那些字符串,因此CSS将保持未优化状态。另外,现在您可以检查给定css类名访问器的用法-如果没有人使用它,请删除它,然后删除使用它的css,以使.gss文件更小,应用程序更小


html中的
标记和.gwt.xml中的
标记不会导致运行GSS,这是正确的。您不需要使用UiBinder(我个人不是一个粉丝,但有些人喜欢),但您确实需要使用访问器,否则GSS就没有意义了


如果您想避免混淆和重命名,请只考虑直接运行关闭样式表,或者在您的普通CSS文件上使用更少或SASS之类的文件,这些文件没有GWT集成,因此您的字符串文本已经被使用了。这将导致更大的编译输出,并使您无法轻松查找和删除未使用的CSS。

正如我后来发现的,您可以将GSS(或CSS)样式表作为
CSSResource
插入,而不必混淆选择器。只需将以下注释添加到样式表中:

@external '*';
这会将文件中的所有选择器标记为外部选择器,这意味着1)用作样式表资源类型的
CSSResource
子接口将不再需要实现与样式表中的类选择器相对应的访问器方法,2)样式表中的选择器将不模糊,因此,例如,如果样式表中有一个类
.foo
,则可以将其应用于