Progressive Web App (PWA) представляет собой веб-приложение, которое сочетает возможности обычного веб-сайта и нативного приложения. Основные преимущества PWA включают работу офлайн, быструю загрузку и возможность установки на устройство пользователя. Vue.js, благодаря своей модульной архитектуре и поддержке экосистемы инструментов, предоставляет удобный путь для создания PWA.
Для создания PWA на Vue обычно используется Vue CLI,
который поддерживает шаблон PWA. При инициализации проекта через
vue create можно выбрать плагин PWA. Этот плагин
автоматически интегрирует:
workbox-webpack-pluginmanifest.json с базовыми метаданными приложенияПример добавления плагина в существующий проект:
vue add pwa
После установки плагина автоматически создается структура:
public/
├─ manifest.json
└─ icons/
src/
└─ registerServiceWorker.js
Файл manifest.json описывает PWA и содержит ключевые
параметры:
{
"name": "Vue PWA App",
"short_name": "VuePWA",
"start_url": ".",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#4DBA87",
"icons": [
{
"src": "icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
standalone обеспечивает вид нативного приложения).Service Worker позволяет работать с приложением офлайн и кэшировать
ресурсы. В Vue CLI по умолчанию используется
registerServiceWorker.js:
import { register } from 'register-service-worker'
if (process.env.NODE_ENV === 'production') {
register(`${process.env.BASE_URL}service-worker.js`, {
ready() {
console.log('App is being served from cache by a service worker.')
},
registered() {
console.log('Service worker has been registered.')
},
cached() {
console.log('Content has been cached for offline use.')
},
updatefound() {
console.log('New content is downloading.')
},
updated() {
console.log('New content is available; please refresh.')
},
offline() {
console.log('No internet connection found. App is running in offline mode.')
},
error(error) {
console.error('Error during service worker registration:', error)
}
})
}
Основные этапы работы Service Worker:
Workbox позволяет более гибко управлять кэшированием. В
vue.config.js можно настроить стратегию:
module.exports = {
pwa: {
workboxOptions: {
runtimeCaching: [
{
urlPattern: /\/api\/.*\/*.json/,
handler: 'NetworkFirst',
options: {
cacheName: 'api-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 86400
}
}
},
{
urlPattern: /\.(?:png|jpg|jpeg|svg|gif)$/,
handler: 'CacheFirst',
options: {
cacheName: 'image-cache',
expiration: {
maxEntries: 100,
maxAgeSeconds: 2592000
}
}
}
]
}
}
}
Для полноценного PWA часто используются push-уведомления и офлайн-функции:
Пример записи данных в IndexedDB через библиотеку
idb:
import { openDB } from 'idb';
const dbPromise = openDB('vue-pwa-db', 1, {
upgrade(db) {
db.createObjectStore('posts', { keyPath: 'id' });
}
});
async function savePost(post) {
const db = await dbPromise;
await db.put('posts', post);
}
async function getPosts() {
const db = await dbPromise;
return await db.getAll('posts');
}
manifest.json в актуальном состоянии,
включая иконки разных размеров.Пример интеграции Vuex с localStorage:
const store = new Vuex.Store({
state: {
user: JSON.parse(localStorage.getItem('user')) || null
},
mutations: {
setUser(state, user) {
state.user = user;
localStorage.setItem('user', JSON.stringify(user));
}
}
});
PWA на Vue.js позволяет создавать приложения, которые быстро загружаются, работают офлайн и обеспечивают удобный пользовательский опыт, приближенный к нативным мобильным приложениям.