Как справиться с кэшированием CSS-файлов GWT-темы - PullRequest
7 голосов
/ 13 января 2010

У меня есть приложение, написанное на Struts / Tiles / JSP, к которому я добавляю приложение GWT. Часть моего приложения, не относящаяся к GWT, обрабатывает кэширование CSS, фактически выписывая файл CSS с номером версии, взятым из моего прикрепленного репозитория svn, например, "styles.css? Svnbuild = 12345". Таким образом, я могу сказать браузеру, что они всегда будут кэшировать эти CSS-файлы, и когда я разверну новую версию, все мои пользователи немедленно скачают ее.

Теперь я перехожу к приложению GWT, и мне нравится, как оно использует «longmd5sum.cache.css» в качестве имени файла, поэтому я все еще могу сказать браузеру, что оно будет кешироваться вечно. Проблема в том, что файлы css, связанные с моей темой, такие как "gwt-standard.css", не имеют строгого имени и не имеют прикрепленного параметра svnbuild. Всякий раз, когда я развертываю новую версию своего приложения, пользователи все еще видят старую версию css, из-за чего она выглядит неправильно.

Кто-нибудь нашел лучший метод для обработки кэширования css файлов gwt theme? Есть ли способ добавить параметр svnbuild или нечто подобное при добавлении CSS к документу?

Ответы [ 2 ]

10 голосов
/ 13 января 2010

Хорошо. Поэтому после того, как я опубликовал это, я покопался в исходном коде GWT и нашел несколько ссылок о создании собственного компоновщика GWT.

http://development.lombardi.com/?p=29

http://code.google.com/webtoolkit/doc/1.6/DevGuideOrganizingProjects.html

Вот как я решил это с помощью своего собственного компоновщика. Сначала я создал класс компоновщика, который расширяет стандарт IFrameLinker:

@LinkerOrder(LinkerOrder.Order.PRIMARY)
public class MyLinker extends IFrameLinker {
    protected String generateStylesheetInjector(String stylesheetUrl) {
        stylesheetUrl = stylesheetUrl + "?buildtime=" + System.currentTimeMillis();
        return super.generateStylesheetInjector(stylesheetUrl);
    }
}

После этого достаточно указать вашему модулю использовать ваш собственный компоновщик. В вашем файле module.gwt.xml:

<module>
    <define-linker name="mylinker" class="com.company.gwt.core.linker.MyLinker" />
    <add-linker name="mylinker" />
</module>

Только что попробовал, и теперь в моем файле nocache.js он выдает новую метку времени каждый раз, когда я компилирую. Мои пользователи могут кешировать файл css навсегда, и они будут автоматически загружать новый при каждом развертывании новой версии приложения.

2 голосов
/ 29 июня 2012

Похоже, что сейчас предпочтительнее использовать ClientBundles, а не отдельные CSS: Справочник по ресурсам Google Css , Недавно мы сделали этот переход довольно безболезненно с помощью следующего (очевидно, что в будущем намереваемся исключить аннотацию @ CssResource.NotStrict):

public interface OurCssResources extends ClientBundle {

    @Source("ourCSS.css")
    @CssResource.NotStrict
    public CssResource getCss();
...

Тогда в корне нашего приложения:

private void injectAllCss() {
        OurCssResources resources = GWT.create(OurCssResources.class);
        resources.getCss().ensureInjected();
...

Это довольно трудоемкий подход, но он решает проблему и ставит вас на пути к тому, чтобы поступить так, как задумал Google.

Похоже, вы можете даже приблизиться к их намеченному пути довольно автоматически (хотя я не пробовал их на 2.4, упомянутые выше вещи работали под 2.4 (у меня была проблема с внешняя зависимость (GXT), но так как это не изменится, я просто оставил ее, используя старомодный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...