App Shell архитектура представляет собой подход к построению веб-приложений, при котором пользовательский интерфейс разделяется на два ключевых компонента: статическую оболочку приложения (shell) и динамическое содержимое. Основная цель такой архитектуры — минимизация времени первого отображения интерфейса и повышение отзывчивости приложения.
Статическая оболочка (Shell) Статическая часть включает в себя элементы интерфейса, которые редко меняются во время работы приложения:
В Polymer статическая оболочка обычно реализуется через Web Components, позволяя инкапсулировать разметку, стили и поведение в отдельных элементах.
Динамическое содержимое Динамическая часть подгружается по мере необходимости. Она может включать в себя:
Для обновления динамической части часто используется data binding Polymer, что позволяет автоматически синхронизировать состояние компонентов с данными.
Polymer предоставляет мощный инструментарий для реализации App Shell:
Создание элементов оболочки
import { PolymerElement, html } from '@polymer/polymer/polymer-element.js';
class AppShell extends PolymerElement {
static get template() {
return html`
<style>
header { background: #2196F3; color: white; padding: 16px; }
nav { width: 250px; float: left; }
main { margin-left: 260px; padding: 16px; }
</style>
<header>Моё приложение</header>
<nav>
<ul>
<li><a href="/home">Главная</a></li>
<li><a href="/profile">Профиль</a></li>
</ul>
</nav>
<main id="content">
<slot></slot>
</main>
`;
}
}
customElements.define('app-shell', AppShell);
Этот компонент задаёт основу интерфейса: шапку, меню и область для динамического контента.
Обновление содержимого через data binding Polymer поддерживает одно- и двустороннее связывание данных. Динамический контент можно подгружать через свойства компонента:
class UserProfile extends PolymerElement {
static get properties() {
return {
userData: {
type: Object,
value: () => ({})
}
};
}
ready() {
super.ready();
fetch('/api/user')
.then(res => res.json())
.then(data => this.userData = data);
}
static get template() {
return html`
<div>
<h2>[[userData.name]]</h2>
<p>Email: [[userData.email]]</p>
</div>
`;
}
}
customElements.define('user-profile', UserProfile);Поддержка кэширования с Service Worker Polymer легко интегрируется с инструментами для работы с Service Worker, что позволяет кешировать shell и статические ресурсы:
self.addEventListener('install', event => {
event.waitUntil(
caches.open('app-shell-v1').then(cache => {
return cache.addAll([
'/',
'/index.html',
'/build/app-shell.js',
'/styles/app.css'
]);
})
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(response => response || fetch(event.request))
);
});Для динамических приложений на Polymer рекомендуется использовать client-side routing, чтобы подгружать контент без перезагрузки страницы. Популярные подходы:
app-route для синхронизации состояния URL
с компонентами;<dom-if> или
<iron-pages>;App Shell архитектура в сочетании с возможностями Polymer обеспечивает высокую производительность, структурированность кода и удобное масштабирование интерфейса для сложных веб-приложений.