Vue CLI plugin that adds Progressive Web App capabilities including service workers, manifests, and PWA meta tags
—
Webpack plugin that injects PWA-specific HTML meta tags, icons, and manifest links during the build process. Integrates with html-webpack-plugin to modify generated HTML output.
Webpack plugin that handles PWA HTML meta tag injection and manifest generation.
/**
* Webpack plugin for PWA HTML integration
* @param {HtmlPwaOptions} options - Configuration options for PWA HTML integration
*/
class HtmlPwaPlugin {
constructor(options?: HtmlPwaOptions);
/**
* Apply plugin to webpack compiler
* @param {Compiler} compiler - Webpack compiler instance
*/
apply(compiler: Compiler): void;
}Usage Example:
const HtmlPwaPlugin = require('@vue/cli-plugin-pwa/lib/HtmlPwaPlugin');
// In webpack configuration
module.exports = {
plugins: [
new HtmlPwaPlugin({
name: 'My PWA',
themeColor: '#4DBA87',
iconPaths: {
favicon32: 'assets/icon-32x32.png'
}
})
]
};Configuration interface for HTML PWA integration.
interface HtmlPwaOptions {
/** App name for meta tags (default: 'PWA app') */
name?: string;
/** Theme color for PWA (default: '#4DBA87') */
themeColor?: string;
/** Microsoft tile color (default: '#000000') */
msTileColor?: string;
/** Apple mobile web app capable (default: 'no') */
appleMobileWebAppCapable?: string;
/** Apple status bar style (default: 'default') */
appleMobileWebAppStatusBarStyle?: string;
/** Version string for asset cache busting (default: '') */
assetsVersion?: string;
/** Manifest file path (default: 'manifest.json') */
manifestPath?: string;
/** Custom manifest content */
manifestOptions?: ManifestOptions;
/** Crossorigin attribute for manifest link */
manifestCrossorigin?: 'anonymous' | 'use-credentials';
/** Custom icon file paths */
iconPaths?: IconPaths;
}Default settings applied by the plugin.
const defaults = {
name: 'PWA app',
themeColor: '#4DBA87',
msTileColor: '#000000',
appleMobileWebAppCapable: 'no',
appleMobileWebAppStatusBarStyle: 'default',
assetsVersion: '',
manifestPath: 'manifest.json',
manifestOptions: {},
manifestCrossorigin: undefined
};
const defaultIconPaths = {
faviconSVG: 'img/icons/favicon.svg',
favicon32: 'img/icons/favicon-32x32.png',
favicon16: 'img/icons/favicon-16x16.png',
appleTouchIcon: 'img/icons/apple-touch-icon-152x152.png',
maskIcon: 'img/icons/safari-pinned-tab.svg',
msTileImage: 'img/icons/msapplication-icon-144x144.png'
};Interface for customizing PWA icon file paths.
interface IconPaths {
/** SVG favicon path (default: 'img/icons/favicon.svg') */
faviconSVG?: string;
/** 32x32 PNG favicon (default: 'img/icons/favicon-32x32.png') */
favicon32?: string;
/** 16x16 PNG favicon (default: 'img/icons/favicon-16x16.png') */
favicon16?: string;
/** Apple touch icon (default: 'img/icons/apple-touch-icon-152x152.png') */
appleTouchIcon?: string;
/** Safari pinned tab icon (default: 'img/icons/safari-pinned-tab.svg') */
maskIcon?: string;
/** Microsoft tile image (default: 'img/icons/msapplication-icon-144x144.png') */
msTileImage?: string;
}Usage Example:
// Custom icon paths - set to null to exclude specific icons
const customIconPaths = {
faviconSVG: 'assets/favicon.svg',
favicon32: 'assets/favicon-32.png',
favicon16: 'assets/favicon-16.png',
appleTouchIcon: null, // Exclude Apple touch icon
maskIcon: 'assets/safari-icon.svg',
msTileImage: 'assets/ms-tile.png'
};The plugin injects various PWA-specific HTML tags:
// Favicon tags
<link rel="icon" type="image/svg+xml" href="/img/icons/favicon.svg">
<link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png">
// Manifest link
<link rel="manifest" href="/manifest.json">
// Theme color
<meta name="theme-color" content="#4DBA87">
// Apple meta tags
<meta name="apple-mobile-web-app-capable" content="no">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="My PWA App">
<link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png">
<link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#4DBA87">
// Microsoft meta tags
<meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png">
<meta name="msapplication-TileColor" content="#000000">The plugin automatically generates manifest.json when manifestPath is relative.
interface ManifestOptions {
/** App name (defaults to options.name) */
name?: string;
/** Short app name (defaults to options.name) */
short_name?: string;
/** App start URL (default: '.') */
start_url?: string;
/** Display mode (default: 'standalone') */
display?: string;
/** Background color (default: '#000000') */
background_color?: string;
/** Theme color (defaults to options.themeColor) */
theme_color?: string;
/** App icons array */
icons?: ManifestIcon[];
}
interface ManifestIcon {
/** Icon file path */
src: string;
/** Icon sizes (e.g., '192x192') */
sizes: string;
/** MIME type (e.g., 'image/png') */
type: string;
/** Icon purpose (e.g., 'maskable') */
purpose?: string;
}const defaultManifest = {
icons: [
{
src: './img/icons/android-chrome-192x192.png',
sizes: '192x192',
type: 'image/png'
},
{
src: './img/icons/android-chrome-512x512.png',
sizes: '512x512',
type: 'image/png'
},
{
src: './img/icons/android-chrome-maskable-192x192.png',
sizes: '192x192',
type: 'image/png',
purpose: 'maskable'
},
{
src: './img/icons/android-chrome-maskable-512x512.png',
sizes: '512x512',
type: 'image/png',
purpose: 'maskable'
}
],
start_url: '.',
display: 'standalone',
background_color: '#000000'
};Usage Example:
// Custom manifest configuration
const manifestOptions = {
name: 'My Progressive Web App',
short_name: 'MyPWA',
description: 'A sample PWA built with Vue CLI',
start_url: '/',
display: 'standalone',
orientation: 'portrait',
background_color: '#ffffff',
theme_color: '#4DBA87',
icons: [
{
src: './img/custom-icon-192.png',
sizes: '192x192',
type: 'image/png'
}
]
};Install with Tessl CLI
npx tessl i tessl/npm-vue--cli-plugin-pwa