vue2项目添加网页保存到桌面功能(PWA)

注: pwa 只能在https环境下才可以使用

1. 使用vue create 项目名称 的可以直接使用 vue add pwa方式添加 pwa功能;参考地址: 参考地址

2. 使用webpack 创建的vue(不带 vue.config.js )项目或其它项目添加pwa,步骤如下:

(1)  手动创建 manifest.json (内容在文末)   注 manifest.json文件必需放下项目根目录下即: (域名/manifest.json 可以访问到manifest.json文件)

(2) 手动创建 sw.js (内容在文末);   注 sw.js文件必需放下项目根目录下即: (域名/sw.js 可以访问到sw.js文件)

(3) 在index.html 引入 manifest.json和sw.js 

引入manifest.json:  <link rel="manifest" href="/manifest.json">

引入sw.js: 

if (window.matchMedia('(display-mode: standalone)').matches) {

        console.log('display-mode is standalone');

}

if ('serviceWorker' in navigator) { 

        navigator.serviceWorker.register('/sw.js').then(function (registration) {

          console.log('ServiceWorker registration successful with scope: ', registration.scope);

        }).catch(function (err) {

          console.log('ServiceWorker registration failed: ', err);

        });

}

window.addEventListener("beforeinstallprompt", (e) => {

      e.preventDefault();

      window.deferredPrompt = e;

});

(4) 在 webpack.prod.conf.js 的 CopyWebpackPlugin 中添加配置(防止打包的时候编译sw.js 和 manifest.json文件)

{

        from: path.resolve(__dirname, '/sw.js'),

        to: path.join(__dirname, '/dist'),

        // ignore: ['.*']

},

{

        from: path.resolve(__dirname, '/manifest.json'),

        to: path.join(__dirname, '/dist'),

        // ignore: ['.*']

}


配置完成,以下是 manifest.json 和 sw.js 的文件内容

manifest.json 文件配置

{ "background_color": "#ffffff",

  "categories": [

    "关键词1",

    "关键词2",

    "关键词3",

  ],

  "description": "项目介绍",

  "display": "standalone",

  "gcm_sender_id": "",

  "gcm_user_visible_only": true,

  "icons": [  // 必须要要192及以上尺寸的图标

    {

      "src": "/static/img/pwa/192x192.png",

      "sizes": "192x192",

      "type": "image/png"

    }

  ],

  "name": "项目名称",

  "short_name": "项目名称",

  "start_url": "/",

  "theme_color": "#ffffff",

  "scope": "/"

}


sw.js 文件配置

var cacheName = '项目名称-pwa';

self.addEventListener('install', event => {

    event.waitUntil(

        caches.open(cacheName)

          .then(cache => {

            console.log(cache)

            cache.addAll(

              [

                  '/', 

                  './css/*',

                  './index.html',

                  './img/*',

                  './js/*',

                  './static/*',

              ])

          }

          ).then(() => self.skipWaiting())

    );

});

self.addEventListener('fetch', function (event) { 

    event.respondWith(

      caches.match(event.request)                   

      .then(function (response) {

        if (response) {                             

          return response;                         

        }

        return fetch(event.request);               

      })

    );

});

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容