什么是PWA

PWA(Progressive Web Apps,渐进式网页应用)是Google在2015年推出的项目,致力于通过web app获得类似native app体验的网站。

优点

1.无需客户端,少量流量即可安装 2.可添加到主屏并全屏运行 3.离线功能,响应更快,及时更新 4.PUSH能力 5.数据传输必须是https

缺点

1.safari对PWA的态度是考虑中,暂时还不支持 2.PUSH还不够成熟,依赖于Web Push Protocol,Chrome只支持Google私有的GCM(Google Cloud Messaging)/FCM服务进行通知推送。国内的mipush也支持了很多app,在此希望中国能尽快有一个统一的推送服务出现~

个人观点

PWA属于非侵入式的技术,可以做到降级兼容,并且拥有强大的离线功能,可以更快的响应,所以还是非常推荐使用的。

网络应用清单

网络应用清单是一个 JSON 文件,主要定义一些启动网址,自定义图标,启动画面,主题颜色,启动样式等等配置信息 这边是在App内的M页,并且国内安卓用户使用的浏览器都不太支持这些定义,所以不详细介绍了。 The Web App Manifest官方文档,介绍的很详细~ webpack-manifest-plugin如果使用webpack也可以使用类似这种插件来生成~ Web App Manifest Generator如果手写也有像这样的工具提供~

Service workers

定义: Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,也可以在网络可用时作为浏览器和网络间的代理。它们旨在(除其他之外)使得能够创建有效的离线体验,拦截网络请求并基于网络是否可用以及更新的资源是否驻留在服务器上来采取适当的动作。他们还允许访问推送通知和后台同步API。

生命周期: 注册→下载→安装→激活

状态 installing 、installed 、waiting 、activating 、activated

主要事件 install 准备sw用于使用,例如创建缓存,放置离线资源 activate 此时可以清理旧缓存及相关的东西以便更新 fetch 响应请求事件,通过FetchEvent.respondWith方法,对这些请求做处理 install、activate事件会触发waitUntil方法

注意: 1.Service workers运行在其他线程,完全异步,同步API不能在其中使用 2.大量使用Promise

Cache

方法 add()addAll()delete()keys()match()matchAll()

基础用法

单独创建一个app.js文件,放到根目录,并在index.html中引用它 app.js ```ecmascript 6 if ('serviceWorker' in navigator) { // register service worker navigator.serviceWorker.register('./service-worker.js', {scope: './'}) // 参数1:注册提供的脚本URL 参数2:导航匹配 .then(function(registration) { // 注册成功 // registration对象存有对sw所在生命周期的状态及状态变更事件及一些父接口的方法 // 状态分别有 installing 、 installed 、 waiting 、 activating 、 activated if(registration.installing) { console.log('Service worker installing'); } else if(registration.waiting) { console.log('Service worker installed'); } else if(registration.active) { console.log('Service worker active'); } }).catch(function(error) { // 注册失败 }); }

根目录下创建执行文件service-worker.js
 `service-worker.js`
```ecmascript 6
// 缓存静态文件
self.addEventListener('install', function(event) {
event.waitUntil(
// 缓存指定文件
caches.open('v1').then(function(cache) {
return cache.addAll([
'/',
'/index.html',
'/style.css',
'/app.js',
'/image-list.js',
'/star-wars-logo.jpg',
]);
})
);
});
 // 缓存接口数据
self.addEventListener('fetch', function(event) {
event.respondWith(caches.match(event.request).then(function(response) {
// 匹配到请求
if (response !== undefined) {
return response;
} else {
return fetch(event.request).then(function (response) {
// 缓存响应数据
let responseClone = response.clone(); caches.open('v1').then(function (cache) {
cache.put(event.request, responseClone);
});
return response;
}).catch(function () {
return caches.match('/gallery/myLittleVader.jpg');
});
}
}));
});
 // 更新缓存
self.addEventListener('activate', function(event) {
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
// 如果有更新
if (cacheName !== 'v1') {
return caches.delete(cacheName);
}
})
);
})
.then(function(){
return self.clients.claim()
})
);
});

webpack项目升级PWA

看到上边n多的API是不是很头疼,以及手动添加静态文件是不是很绝望,那么sw-precache-webpack-plugin这个插件轻松帮你解决所有问题 现在我们就来升级下之前推过的小型Web页打包优化这片文章中所介绍的脚手架

1.修改文件:

  1. index.html

     <script>
    if ('serviceWorker' in navigator) {
    window.addEventListener('load', function() {
    navigator.serviceWorker.register('./service-worker.js');
    });
    }
    </script>
  2. webpack.prod.config.js ```ecmascript 6 var SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin') // plugins 数组内添加 new SWPrecacheWebpackPlugin({ cacheId: 'my-vue-app', filename: 'service-worker.js', minify: true, // 其他更多配置请查看官方文档 })

    自动生成service-worker.js并自动完成相关配置

2.通过正常逻辑打包~

npm run build ZZSellerTip

3.启动一个本地静态服务器

为了方便调试Service Worker在http://localhost或者http://127.0.0.1 本地环境下也可以跑起来 将打包好的文件通过http-server生成的静态服务器运行 运行结果:  关掉http-server可以看到依然可以访问 

注意:如果你的静态文件是放到CDN上的,那么服务器一定要开通CORS,因为fetch请求是不支持跨域的~~

致此,项目改造就算完成了,总体来说改造成本还是很低的,所以小伙伴们一起搞起来吧~

如果你喜欢我们的文章,关注我们的公众号和我们互动吧。

轻松把你的项目升级到PWA的更多相关文章

  1. C# 利用.NET 升级助手将.NET Framework项目升级为.NET 6

    ​概述 .NET6 正式版本已经发布有一阵子了,今天我就体验一下如何将.NET Framework的项目升级为.NET 6. 升级条件: Windows 操作系统 .NET 6 SDK Visual ...

  2. NET MVC1项目升级到MVC2最简单的方法

    NET MVC1项目升级到MVC2最简单的方法 把MVC1项目升级到MVC2,最简单的做法如下: 新建MVC2项目 新建一个MVC2项目,把原来MVC1的项目文件全部拷贝到新建MVC2项目目录里,依照 ...

  3. [转]将某个Qt4项目升级到Qt5遇到的问题

    原文:http://hi.baidu.com/xchinux/item/9044d8ce986accbb0d0a7b87晚上花了4个小时,将以前的一个项目从Qt 4.8.4-MinGW升级到了Qt5. ...

  4. App项目升级Xcode7&iOS9(续) - This bundle is invalid. The bundle identifier contains disallowed characters

    金田 iOS 9发布已经有2月有余,现在Xcode已经有升级到Xcode7.1,开发环境安装等一系列相关的流程,以及Xcode 7 & iOS 9升级相关的一些部分,在这里就不再多加赘述(详见 ...

  5. 将 Net 项目升级 Core项目经验:(一)迁移Net项目为Net Core\Standard项目

    迁移Net项目为Net Core\Standard项目 背景: 我们公司内部有自己ORM开发框架,最新因为需要将系统迁移到国产服务器上,所以首先需要将最基础的ORM框架改造可以运行在国产服务器上.对于 ...

  6. 项目升级-oracle改版sql server问题点汇总

    目录 1.符号使用 1.1 :->@ 1.2 mod()->% 1.3 ||->+ 1.4 off等表别名 1.5 columnnum=1->top 1 1.6 minus-& ...

  7. ASP.NET Core 实战:将 .NET Core 2.0 项目升级到 .NET Core 2.1

    一.前言  最近一两个星期,加班,然后回去后弄自己的博客,把自己的电脑从 Windows 10 改到 Ubuntu 18.10 又弄回 Windows 10,原本计划的学习 Vue 中生命周期的相关知 ...

  8. 将 Unity5.3 的老项目升级到 Unity 2018.3 遇到的些许问题。

    删除 ParticleEmmiter 等废弃的接口: 删除 WindowsSecurityContext System.Security.Principal.WindowsIdentity 在 .Ne ...

  9. Webpack + Vue 多页面项目升级 Webpack 4 以及打包优化

    0. 前言 早在 2016 年我就发布过一篇关于在多页面下使用 Webpack + Vue 的配置的文章,当时也是我在做自己一个个人项目时遇到的配置问题,想到别人也可能遇到跟我同样的问题,就把配置的思 ...

随机推荐

  1. JSP 页面传值方法总结

    JSP 页面间传递参数是项目中经常需要的,这应该算是 web 基本功吧. 试着将各种方式总结下来,需要时可以进行权衡利弊选择最合适的方式. 1. URL 链接后追加参数 <a href=&quo ...

  2. 阿里云ECS部署ES

    背景 最近越来越多的公司把业务搬迁到云上,公司也有这个计划,自己抽时间在阿里云和Azure上做了一些小的尝试,现在把阿里云上部署ES和kibana记录下来.为以后做一个参考,也希望对其他人有帮助. 这 ...

  3. 正则表达式-linux基础

    通配符 通赔符是模糊匹配的基础,因为通赔符机制的存在使得我们在查找文件的时候非常方便     * :匹配任意长度的任意字符,也可以一个都没有     .  :匹配任意单个字符,必须有一个    [ ] ...

  4. MongoDB Native Node.js Driver

    写在前面 最近读<node.js学习指南>,对于mongodb没有介绍太多的工作原理,但是对于一个前端开发者,即使你还没有用过这种数据库也可以让你很好的理解和使用       一本非常好的 ...

  5. Servlet和Filter的url匹配以及url-pattern详解 及 filter 循环问题的解决

    Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜.估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,ser ...

  6. pycharm中的快捷键和简单设置

    PyCharm3.x默认快捷键 PyCharm Default Keymap 1.编辑(Editing) Ctrl + Space    基本的代码完成(类.方法.属性)Ctrl + Alt + Sp ...

  7. HTML脚本配置Android自动化测试

    说明   在项目配置完基于robotium框架下的自动化测试用例后发现虽然用代码配置测试用例虽然较为灵活,但是如果编写较为全面的测试用例则必然会消耗大量开人员的精力,并且对于用例的后期维护也是很大一部 ...

  8. 迁移学习-Transfer Learning

    迁移学习两种类型: ConvNet as fixed feature extractor:利用在大数据集(如ImageNet)上预训练过的ConvNet(如AlexNet,VGGNet),移除最后几层 ...

  9. java代码块的理解

    最近在复习java基础,在看到java代码块的时候,忽然发现自己貌似对于java代码块一无所知,于是赶紧对着一些资料实战演练了一把. 对于java代码块,不难根据名称看出其实就是一些java语句的集合 ...

  10. 小而美的 React Form 组件

    背景 之间在一篇介绍过 Table 组件< React 实现一个漂亮的 Table > 的文章中讲到过,在企业级后台产品中,用的最多且复杂的组件主要包括 Table.Form.Chart, ...