Jmingzi / blog

温故而知新
14 stars 1 forks source link

spa首屏优化的思考 #38

Open Jmingzi opened 6 years ago

Jmingzi commented 6 years ago

利用ssr结合pwa,将app shell缓存在本地

由于做了code-spliting,需要收集路由依赖,将对应的js preloadprefetch

app-shell为webpack打包时,将依赖的js收集起来,生成新的service-worker.js,cache到本地,另外在需要显示的页面,利用组件的空状态先将app-shell渲染出来,再在下个eventloop的时候new Vue

关于本地缓存的更新,由于生成了新的service-worker.js,里面cachelist的文件也是由webpack打包带hash的,所以delete掉不在cachelist的文件即可

以上处理完带hash的js,都会在打包时插入到html中

另外,如果非ssr怎么办?

首先,app shell不可能手动开发,它可能只存在与首页路由里

html是可以被cache的,因为只要service-worker.js会更新就不会有问题

那么,我们可以这样做

一张流程图

architecture

延伸阅读:

Jmingzi commented 6 years ago

App shell生成相关

webpack插件

pwa应用构建工具

preload和prefetch

[译]Preload,Prefetch 和它们在 Chrome 之中的优先级

preload 是声明式的 fetch,可以强制浏览器请求资源,同时不阻塞文档 onload 事件

prefetch 提示浏览器这个资源将来可能需要,但是把决定是否和什么时间加载这个资源的决定权交给浏览器

对于当前页面很有必要的资源使用 preload,对于可能在将来的页面中使用的资源使用 prefetch

preload 使用 “as” 属性加载的资源将会获得与资源 “type” 属性所拥有的相同的优先级。比如说,preload as="style" 将会获得比 as=“script” 更高的优先级。这些资源同样会受内容安全策略的影响(比如说,脚本会受到其 “src” 属性的影响)。

延伸阅读
prefetch, preload, dns-prefetch,defer和async

Jmingzi commented 6 years ago

目前有2种实现方案

第一种,相对已有项目去改动是合适的

当然,也可以自己手动写sw.jsmanifest

延伸阅读:

第二种,使用类似lavasworkbox构建工具去构建项目,这样的话就是使用一整套了,要学习它们各自的风格规范及使用。

Jmingzi commented 6 years ago

app shell实践结果

用后,瞬间觉得索然无味~它和loading的作用一致的,好处在于提供了了一个骨架页面,但如果结合工具将其自动化后还是可以一用的。

如果加了js逻辑、或重绘,这就没有必要了。

pwa实践结果

我看了下iOS微信的webview也是不支持的,似乎很多应用的webview都是采用的WKWebView,那在实际的业务应用中,场景就很小了。