Как работает кэширование GWT ClientBundle?
Я пытаюсь лучше понять использование GWT ClientBundle и кеширование.
Если у меня есть большой текстовый файл, например, который я хотел бы сделать доступным для моего клиента, я могу использовать
public interface MyResources extends ClientBundle {
public static final MyResources INSTANCE = GWT.create(MyResources.class);
@Source("myText.txt")
public TextResource myText();
}
//-- then later to use the text
String text = MyResources.INSTANCE.myText().getText();
Означает ли это, что файл "myText.txt" будет загружен с сервера при первом запуске приложения клиентом, а затем файл будет сохранен в кеше браузера, чтобы в будущем при использовании приложения файл не нужно скачать?
Если так, что произойдет, если я изменю "myText.txt", знает ли приложение, чтобы получить новую версию?
Наконец, если файл действительно хранится в кеше, чем он отличается от локального хранилища в HTML5?
Благодарю.
3 ответа
- Как уже упоминал Даниэль Курка, ресурсы могут быть встроены в файл js (
*.cache.*
файл) где живет остальная часть скомпилированного кода GWT. - Встраивание не происходит для всех ресурсов в клиентском комплекте. Например, большие изображения никогда не вставляются, это также можно предотвратить с помощью
@ImageOptions.preventInlining()
и это не происходит для ExternalTextResources.
Для обоих случаев общим является то, что результаты будут *.cache.*
файлы с уникальными именами, которые изменяются автоматически при изменении содержимого исходного файла (хотя вам придется перекомпилировать приложение GWT!)
Это позволяет серверу доставлять эти файлы с соответствующими кэширующими заголовками HTTP (вы должны будете настроить это самостоятельно!). Для клиента это означает, что он не только сможет кэшировать содержимое (что он в любом случае делает, даже если эти заголовки не установлены), но он может даже пропустить запрос к серверу, если существует более новая версия.
Большим преимуществом ClientBundles является то, что имена файлов будут меняться автоматически. Самым большим недостатком является то, что вы должны перекомпилировать ваше приложение GWT, когда ресурс меняется. Если вы этого не хотите, то для загрузки файлов лучше использовать другой подход: вы все равно можете сделать браузер кэширующим любой файл, который вам нравится (установив заголовки HTTP), но тогда вам нужно быть осторожным с Вручную дайте им новое имя, когда содержимое изменится.
Вам следует использовать внешний текстовый ресурс, если вы хотите, чтобы он загружался по требованию, а не как часть скомпилированного JavaScript.
https://developers.google.com/web-toolkit/doc/latest/DevGuideClientBundle
Если вашим пользователям нужен весь файл, используйте один текстовый ресурс. Если пользователям нужны его части, разбейте этот файл на отдельные меньшие файлы: при необходимости будет загружен только запрошенный файл.
Внешние текстовые ресурсы могут быть кэшированы, как и все другие статические файлы.
Файлы, которые находятся внутри клиентского пакета, встроены в ваш скомпилированный javascript. Они не будут загружены отдельно. Если вы хотите загрузить ресурс в указанное время, вы можете легко использовать для этого конструктор запросов.
Если вы не хотите загружать файл сразу, но по-прежнему хотите встроить его, вы можете использовать разбиение кода и поместить пакет в другую часть вашего приложения.