Push API 的出现则让推送服务具备了向 web 应用推送消息的能力,它定义了 web 应用如何向推送服务发起订阅、如何响应推送消息,以及 web 应用、应用服务器与推送服务之间的鉴权与加密机制;由于 Push API 并不依赖 web 应用与浏览器 UI 存活,所以即使是在 web 应用与浏览器未被用户打开的时候,也可以通过后台进程接受推送消息并调用 Notification API 向用户发出通知
self.addEventListener('push', event => {
event.waitUntil(
// Process the event and display a notification.
self.registration.showNotification("Hey!")
);
});
self.addEventListener('notificationclick', event => {
// Do something with the event
event.notification.close();
});
self.addEventListener('notificationclose', event => {
// Do something with the event
});
web前端的发展趋势
前言
你一个写前端的,也敢自称程序员??
相信web前端开发的伙伴们,在职业道路上,十有八九会受到这样的质疑或者嘲讽(大多数其实还是调侃之意)。写几个标签,懂一些HTML CSS 就是程序员? 你们知道CPU、存储、网络、集群吗? 你们了解过并发、业务架构、数据库、性能调优、分布式计算、集群架构、容灾、安全、运维吗
哼 辣鸡👎
今日我们为前端带盐
近年来,Web 应用在整个软件与互联网行业承载的责任越来越重,软件复杂度和维护成本越来越高,Web 技术,尤其是 Web 客户端技术,迎来了爆发式的发展。
进入主题,我们将从2个方面:
来浅谈一下前端发展的趋势
下一代Web应用:PWA
老生常谈,我们先对比一下生活中WebAPP 和 原生APP的优劣
PWA解决的问题
一个十分成熟的🌰(例子) 「印度阿里巴巴」 —— Flipkart
FlipKart Lite应该是最为人津津乐道的PWA案例了 当浏览器发现用户需要 Flipkart Lite 时,它就会提示用户“Hello,你可以把它添加至主屏哦”,当然也可以右上角手动添加。 这样,Flipkart Lite 就会像原生应用一样在主屏上留下一个自定义的 icon 作为入口;与一般的添加一个Web书签不同,当用户点击这个 icon 时,Flipkat Lite 将直接全屏打开,不再受困于浏览器的 UI 中,而且有自己的启动屏效果。
而且有一个很大的突破,在无法访问网络时,Flipkart Lite 可以像原生应用一样照常执行,还会很骚气的变成黑白色;不但如此,曾经访问过的商品都会被缓存下来得以在离线时继续访问。在商品降价、促销等时刻,Flipkart Lite 会像原生应用一样发起推送通知,吸引用户回到应用。
Web App Manifest
它其实是一个网络应用清单,一个JSON文件,开发者可以利用它控制在用户想要看到应用的区域(例如移动设备主屏幕)中如何向用户显示网络应用或网站,指示用户可以启动哪些功能,以及定义其在启动时的外观。是PWA技术的必备要素
总结一下Manifest的三个步骤:
创建清单demo
一些可选项
添加启动画面 splash screen
设置启动样式
这里是选择全屏显示,还是保留地址栏
debugger
Chrome 浏览器已经提供给我们一些方法和手段,直接进入 Application 板块,选择 manifest 选项卡,即可,将它添加到 Chrome 应用中。
Service Worker
我们原有的整个 Web 应用,都是建立在用户能上网的前提之下的,所以一离线就只能看转圈圈了。web社区也做过很多类似的尝试,如APP Cache。但是它,几乎没有路由机制,出了BUG无法监控,现下已经在html5.1中 被干掉了
这个时候,Service workers 横空出世!!
Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,也可以在网络可用时作为浏览器和网络间的代理。它们旨在(除其他之外)使得能够创建有效的离线体验,拦截网络请求并基于网络是否可用以及更新的资源是否驻留在服务器上来采取适当的动作。他们还允许访问推送通知和后台同步API。
service worker将遵守以下生命周期:
看一下实例代码
这段代码先做了一个特性检查,在注册之前确保 Service Worker 是支持的, 接着,我们使用 ServiceWorkerContainer.register() 函数来注册 service worker, 这就注册了一个 service worker。
新增了一个 install 事件监听器,接着在事件上接了一个ExtendableEvent.waitUntil() 方法——这会确保Service Worker 不会在 waitUntil() 里面的代码执行完毕之前安装完成。
在 waitUntil()内,我们使用了 caches.open() 方法来创建了一个叫做 v1 的新的缓存,将会是我们的站点资源缓存的第一个版本。
它返回了一个创建缓存的 promise,当它 resolved的时候,我们接着会调用在创建的缓存示例上的一个方法 addAll(),这个方法的参数是一个由一组相对于 origin 的 URL 组成的数组,这些 URL 就是你想缓存的资源的列表。
Service Worker 的 新的标志性的存储 API — cache — 一个 service worker 上的全局对象,它使我们可以存储网络响应发来的资源,并且根据它们的请求来生成key。
推送Push Notification
Push API 的出现则让推送服务具备了向 web 应用推送消息的能力,它定义了 web 应用如何向推送服务发起订阅、如何响应推送消息,以及 web 应用、应用服务器与推送服务之间的鉴权与加密机制;由于 Push API 并不依赖 web 应用与浏览器 UI 存活,所以即使是在 web 应用与浏览器未被用户打开的时候,也可以通过后台进程接受推送消息并调用 Notification API 向用户发出通知
PWA任重道远
国内较重视 iOS,而 iOS 对PWA是十分不友好的。
国内的 Android 实为「安卓」,不自带 Chrome ,其次,各厂商喜欢自己瞎加班(JB)订制各种系统,带来兼容性问题
Push Notification还处于襁褓阶段(还没有一个标准的协议),未来的变数较大
国内的web应用入口多集中于各类APP,如微信,qq,带来的限制较多
WebAssembly
布兰登·艾克:你说你们老板10天上线1个app,丧心病狂?大哥10天干了一门语言
正是因为JS的诞生显得没有那么"正式",所以带来了很多的坑点和性能上的限制。它更像一个还在建造当中的楼房,我们web开发人员不断的为它添砖加瓦,总有一天会变成摩天大楼!
什么是WebAssembly
WebAssembly 是由主流浏览器厂商组成的 W3C 社区团体 制定的一个新的规范。
它的缩写是".wasm",.wasm 为文件名后缀,是一种新的底层安全的二进制语法。
可以接近原生的性能运行,并为诸如C / C ++等语言提供一个编译目标,以便它们可以在Web上运行。它也被设计为可以与JavaScript共存,允许两者一起工作。
能突破前端3D game 、 VR/AR 、 机器视觉、图像处理等运行速度瓶颈
我们来看一个demo:http://webassembly.org.cn/demo/Tanks/
WebAssembly 工作原理
了解WebAssembly之前,我们先大概的了解一下代码的运行机制
在代码的世界中,通常有两种方式来翻译机器语言:解释器和编译器。
如果是通过解释器,翻译是一行行地边解释边执行
编译器是把源代码整个编译成目标代码,执行时不再需要编译器,直接在支持目标代码的平台上运行。
最开始的浏览器是只有解释器的,因为解释器看起来更加适合 JavaScript。对于一个 Web 开发人员来讲,能够快速执行代码并看到结果是非常重要的。后来将编译器也加入进来,形成混合模式。
再添加一个监视器,用来监控着代码的运行情况,记录代码一共运行了多少次、如何运行的等信息。
加这么多东西的好处是什么呢
那是如何编译解释呢?
重点来了
那为什么不直接用JS,这么麻烦用WebAssembly
Parsing——表示把源代码变成解释器可以运行的代码所花的时间;
Compiling + optimizing——表示基线编译器和优化编译器花的时间。一些优化编译器的工作并不在主线程运行,不包含在这里。
Re-optimizing——包括重优化的时间、抛弃并返回到基线编译器的时间。
Execution——执行代码的时间
Garbage collection——垃圾回收,清理内存的时间
wasm的优势是本身就是通过编译器并优化过后的二进制文件,可以直接转换为机器码,省去了Javascript需要解析,优化的工作,所以在加载和执行上本身就具有优势
具体优势点
WebAssembly 比 JavaScript 的压缩率更高,所以文件获取也更快。即便通过压缩算法可以显著地减小 JavaScript 的包大小,但是压缩后的 WebAssembly 的二进制代码依然更小。
这就是说在服务器和客户端之间传输文件更快,尤其在网络不好的情况下。
JavaScript 源代码到达浏览器时被解析成了AST (抽象语法树)。 解析过后 AST (抽象语法树)就变成了中间代码(叫做字节码),提供给 JS 引擎编译。
而 WebAssembly 则不需要这种转换,因为它本身就是中间代码。它要做的只是解码并且检查确认代码没有错误就可以了。
浏览器的JIT会反复地进行“抛弃优化代码<->重优化”过程, 比如当循环中发现本次循环所使用的变量类型和上次循环的类型不一样,或者原型链中插入了新的函数,都会使 JIT 抛弃已优化的代码,进行重优化。
在 WebAssembly 中,类型都是确定了的,所以 JIT 不需要根据变量的类型做优化假设。也就是说 WebAssembly 没有重优化阶段。
在JS中的内存概念是非常模糊的,因为JS并不需要申请内存,所有内存都有JS自动分配,因为它不可控,所以清理垃圾的时候会带来性能开销
WebAssembly不需要垃圾回收,内存操作都是手动控制的(像 C、C++一样)。这对于开发者来讲确实增加了些开发成本,不过这也使代码的执行效率更高。
如何实现一个WebAssembly demo
从0开始完成刚刚坦克大战的例子
4.大功告成
谢谢大家~
广而告之
本文发布于薄荷前端周刊,欢迎Watch & Star ★,转载请注明出处。
欢迎讨论,点个赞再走吧 。◕‿◕。 ~