Backbone.js предоставляет минималистичную архитектуру для построения клиентских приложений на JavaScript, сосредоточенную на моделях, коллекциях, видах и маршрутизации. В крупных приложениях эффективное управление данными и оптимизация работы с сервером критически важны, поэтому кэширование становится ключевым инструментом.
Кэширование в Backbone.js строится вокруг моделей
(Backbone.Model) и коллекций
(Backbone.Collection). Эти объекты могут хранить локальные
копии данных, что позволяет снизить количество сетевых запросов и
ускорить отклик интерфейса.
Ключевые элементы:
change,
sync).Backbone.js не содержит встроенного кэширования на уровне HTTP,
поэтому стратегии кэширования реализуются через переопределение методов
fetch, save и использование локального
хранилища.
Коллекции могут выступать кэшем моделей. Часто используется следующая схема:
var UsersCollection = Backbone.Collection.extend({
url: '/users',
initialize: function() {
this.cachedModels = {};
},
fetch: function(options) {
options = options || {};
if (!options.force && Object.keys(this.cachedModels).length) {
this.reset(Object.values(this.cachedModels));
return Promise.resolve(this);
}
return Backbone.Collection.prototype.fetch.call(this, options).then(models => {
models.forEach(model => this.cachedModels[model.id] = model);
return this;
});
}
});
Пояснение:
cachedModels хранит локальный кэш по идентификатору
модели.force позволяет принудительно загрузить данные
с сервера.fetch сначала проверяет кэш, возвращает его при
наличии данных и синхронизирует с сервером только при
необходимости.Модели могут кэшировать собственные атрибуты и контролировать повторные запросы:
var UserModel = Backbone.Model.extend({
urlRoot: '/users',
fetch: function(options) {
options = options || {};
if (!options.force && this.has('cachedAt') && (Date.now() - this.get('cachedAt') < 60000)) {
return Promise.resolve(this);
}
return Backbone.Model.prototype.fetch.call(this, options).then(() => {
this.set('cachedAt', Date.now());
return this;
});
}
});
Особенности:
cachedAt позволяет реализовать
TTL (time-to-live) для кэша.localStorage и
sessionStorageДля длительного кэширования можно сохранять модели в браузерное хранилище:
var LocalUserModel = UserModel.extend({
initialize: function() {
var cachedData = localStorage.getItem('user_' + this.id);
if (cachedData) {
this.set(JSON.parse(cachedData));
}
this.on('change', () => {
localStorage.setItem('user_' + this.id, JSON.stringify(this.toJSON()));
});
}
});
Преимущества:
Недостатки:
Backbone.js использует метод sync для взаимодействия с
сервером. Кэширование можно интегрировать через его переопределение:
Backbone.sync = function(method, model, options) {
if (method === 'read' && model.cachedData) {
return Promise.resolve(model.cachedData);
}
return Backbone.ajax(_.extend(options, {
url: options.url || _.result(model, 'url')
})).then(response => {
if (method === 'read') {
model.cachedData = response;
}
return response;
});
};
Особенности:
cachedData хранит результат последнего запроса.change, sync и
destroy для автоматического обновления кэша.Promises или
async/await для удобного управления асинхронностью.Кэширование в Backbone.js является гибкой концепцией, позволяющей контролировать частоту запросов, поддерживать актуальность данных и оптимизировать производительность клиентского приложения. Правильное использование кэша снижает нагрузку на сервер и ускоряет работу интерфейса без потери согласованности данных.