写点什么

QCon 前端参会分享

  • 2019-09-22
  • 本文字数:4661 字

    阅读完需:约 15 分钟

QCon前端参会分享

1. Building Web Apps With Cloud And AI

Microsoft。主要内容偏 machine learning 和 deep learnning 的应用,(说实话英语太渣听的云里雾里)。但微软提出的各种应用场景都很贴近生活,还有一些非常具有社会推动价值,例如如何利用 ai 帮助残疾人。


整体感觉不像是讲前端技术或工程的题目,而是偏研究性质,如何用 AI 的思维去解决问题。


例如这向年各种币(如比特币)很火,他们用 ai 去分析数据拿到各种货币的发现趋势。


讲一个盲人 c#工程师用一个 AI 的眼镜,可以很好的生活甚至写代码,眼镜可以分析图像告诉用户眼前的场景,如:有个孩子在滑滑板,开会中对方的表情是怎么样的,菜单上可以点哪些菜等等。


介绍了 AzSearch.js,配合 Azure(微软研发的云搜索服务)使用的前端 UI 框架,可以定制搜索目标和结果展示样式等。

2. PWA(Progressive Web Appi[lication)

百度,演讲者是基于 vue 的 PWA 框架 LAVAS 的作者。概念的部分在框架官网上都有。我觉得最主要的两点第一弄懂 app shell 架构,包含 app shell 和 app skeleton 的概念,第二理解 service worker 的在 pwa 中的作用及生命周期。


印象最深的点是,百度对每一个技术难点的探究都会抽象成通用框架,把最佳实践梳理成行为规范。LAVAS 的官网上不仅包含框架的内容,还包括总结出的非常全面的 pwa 的知识,给我们以后做这种网站提供了好的思路。


现在百度搜索已经实现了 pwa,链家大 C 移动端如果支持了 pwa 也可以使用户体验更上一层楼,不想下载 app 的用户可以通过加入桌面快捷方式得到一个更轻量的入口,前期准备工作需要网站升级到 https 的来支持 service worker。最后作者讲了 ssr 配合 pwa 的渲染流程,ServerSideRendering 可以解决单页应用的 SEO 问题,也是值得尝试的一个技术点。

2.1 pwa 的定义

包含主屏图标,离线可用,离线通知等功能的渐进式的网页应用程序。


演讲者强调应用体验才是 pwa 的核心,progressive(渐近式)体现在它的功能和开发过程都是渐进的,国内还不支持消息推送,但并不影响我们实现它其他的特性。


有个 demo(请用移动端浏览器打开)来演示,把他添加到桌面后,断网后从桌面 icon 进入,页面仍然有内容。

2.2 强调 pwa 的三个特点

  • 可靠:运行在可靠的 https 下,离线可用特性使得网络不可靠时 pwa 也可靠

  • 体验:快速响应,能做到接近 Native App 的体验

  • 用户粘性: 例如消息推送,chrome 可放到主屏等功能,可增加用户依赖度

2.3 pwa 的技术点

  1. pwa 一般都是 spa 的,如何让白屏时间变短?

  2. 两个主要概念


app shell: 是可以让网站运行起来的最小的集合,在手机 app 里一般就是 header,footer,menu 这些部分,不包含 content。可以缓存起来缩短白屏时间。


app skeleton: 主要内容区域,在实际内容加载出来之前的占位图片叫做 app skeleton。


分析:页面加载时 html 顶部的 css 会阻碍下面 skeleton 的展现,导致白屏时间长


解决:把 css link 加入 preload 属性、使之不会阻止 skeleton 的渲染


  1. 桌面快捷方式(主要讲 manifest 支持的兼容性)

  2. 通过配置 app manifest.json 文件中的 start_url,点击桌面 icon 将会在浏览器中打开 start_url 指定的地址。


1<link rel="manifest" href="path-to-manifest/manifest.json">
复制代码


Chrome 和 Firefox 已经实现了这个功能,safari 旧版还不支持这种方式,但是提供了自有的属性同样达到效果,随着 iOS 11.3 的发布,苹果悄悄的支持了 PWA 理念背后的 Service Worker 和 Web App Manifest。



图 1.ios 兼容属性设置


3) servise worker是浏览器在后台独立于网页运行的脚本,是一个独立于网页的线程,负责处理并拦截请求,操作缓存等,国内各大浏览器微信都支持。在pwa主要用来控制请求走server还是cache,如果首次请求就走server并且缓存起来。Service Worker的缓存机制依赖Cache API、HTML5 fetch API,以及Promise。


sw 的生命周期包含五个阶段,分别有不同的状态及职责:


安装中(installing):sw 注册之后进入此过程,触发 install 事件回调,本阶段利用 Cache API 指定静态资源进行离线缓存。


安装后(installed):完成安装,等待其他的 SW 线程被关闭。


激活中(activating):清除其他的 worker 以及关联缓存的旧缓存资源,等待新的 SW 线程被激活。


激活后(activated):可以处理功能性的事件,包括 fetch (请求)、sync (后台同步)、push (推送)。


废弃(redundant):结束


开发时在主页面中注册 sw:


jsif ('serviceWorker' in navigator) {   navigator.serviceWorker.register('/sw.js')
}
1在`sw脚本`(sw.js)中, 监听生命周期回调和事件回调,进行资源拦截和缓存:
js
this.addEventListener('install', function (event) { // 利用catch API(caches.open)缓存资源app shell等关键文件});
this.addEventListener('fetch', function (event) { // 处理请求,可从caches里读缓存,没有则从网络拉取})
复制代码


作者提出 serviceworker+app shell 是完美的组合,可以通过如下逻辑来优化页面的展示速度:


缓存 app shell 所需静态文件


拦截页面请求,均返回 app shell 对应 html


app shell 判断当前 url,渲染不同页面


判断当前请求状态,返回不同页面


  1. servise worker 如何更新

  2. sw 脚本控制着页面资源的缓存及更新,它自身也可能需要更新。sw 脚本内容更新时,浏览器会逐字节对比新旧内容,如果不同会再次安装并走一套完整的生命周期。因此作者提出 sw 脚本的更新策略:


浏览器每天至少更新一次 SW


注册新的 SW,带上版本号,如 /sw.js?t=20180421


可手动更新 registration.update()


需要注意的点:sw 更新需要等待所有被旧版本控制的页面都关闭后,第二次进入才会生效。如果想强制立即更新,sw 脚本需要通知所有在控的页面去刷新。



图 2.强制更新逻辑


5)SSR最后讲了LAVAS中的ssr模式,使用SSR流程处理html请求仅限于浏览器缓存中不存在app shell时,也就是第一次访问时。后续访问即便是刷新页面,因为shell的存在也不会再走ssr流程了,这和传统的ssr模式是不同的。


  1. 面向未来的原生化 Web 开发(web assembly)

  2. 作者是广发证券的技术专家,所以他后来的例子是用 wasm 去重构了股票 K 线的 h5 展示效果。这种技术适合前端语言不擅长的复杂的数据计算,不知我们是否能将它用于教主方向的 VR 看房等业务场景。


前端 Js 的性能问题在于从最初的设计它就是一种解释型语言。性能问题可以由原生化来解决,即把 js 转成更底层代码去执行。但是这类私有技术如 activex 插件有安全问题所以需要提示安装。


2015 年 webassembly 出现,使用它可以在浏览器中运行一些高性能、低级别的编程语言,它本身是二进制的。可用它将大型的 C 和 C++代码库导入 Web 平台,这样前端也可以实现游戏、物理引擎甚至是桌面应用程序了。


作者演示示了 js 及 wasm 编写的同一个复杂算法的 demo,运行时间上有 4 至 5 倍的性能差。后面又介绍了开发 wasm 的 emscripten 编辑器,讲解了一些他们遇到的问题和解决办法,大部分是一些 api 的支持。例如


浏览器运行环境是异步的,受限于安全沙箱,并没有权利读直接存取主机的文件,Emscripten 编辑器提供的 fs api 帮助解决了这个问题。编译代码时带上–preload-file 参数,指定需要加载的文件。


如何去解决受限 io 的问题,Emscripten 提供了 emscripten_async_wget 等 api 可以解决。



图 3.wasm 编译原理


最后提及了 rust,它也能被编译成 wasm 具有高效、表达能力强,零成本抽象等特点,高效体现在编译过程中不会产生中间变量。我不太懂就不作评论了,大家可自行学习。

4. quic 在收集微博的应用实践

微博。偏通信及运维方向。初忠是他们想在微博 app 链接时在网络层面请求后端业务时再快一点,以弱网环境下能满足用户基本需求,解决移动端 TCP 连接不稳定的问题。我们的移动端也可以接入,但是感觉链家 app 线上主要是搜索展示型的业务,不像微博用户交互那么频繁,是否适合我司存疑。


从 tcp 加密通道的问题讲为什么选择 quic,tcp 链接需要三次握手是一次 rtt,如果是 http 需要保证安全性需要增加 tls,还会增加握手次数,建立成本高。


udp 协议是无连接协议,但是传输不可靠,应用层需要去保证包的顺序。


quic 是构建在 udp 之上的传输层协议。可以在 1 到 2 次握手完成链接,如果浏览器支持握手缓存,可进一步减少 rtt 次数,目的是为了整合 tcp 的可靠性和 udp 的速度和效率。quic 有数据加密、拥塞控制的特性,把 http2 的优点克隆了,并实现了真正的多路复用。http1 串型的,quic 在 udp 上是并行的,一个包丢失后不影响其他包的发送。前向冗余纠错适用于 youtube 这样的视频网站。


它们的关系找一张图展示:



图 4.http,tcp,udp,quic 关系


第二部分讲了一些服务部署时的实践经验,例如


需要解决 udp 在 lvs dr 模式下端口问题


怎么监测两个端口 8.8.8.8:443, 10.10.10.10:443?可以做代理


实践中 ngix 处理 https 和 caddy 合作


实践中第一次是两次 rtt 不是理论的一次=〉解决:caddy 源码对客户端不信任 把源码改掉


第二次链接换机房了怎么办?解决=〉 全局级握手缓存 把握手信息缓存在 memery cache 共享密钥机制


这部分有些偏离前端就不作深入分析了,网上找到一篇微博讲 quic 的文章(http://www.sohu.com/a/225800602_100061531),有兴趣的同学可以阅读。


作者介绍:


马琳,17 年 6 月加入链家网,平台大前端研发部,任职前端高级开发工程师,专注于 B 端平台化前端技术。


本文转载自公众号贝壳产品技术(ID:gh_9afeb423f390)。


原文链接:


https://mp.weixin.qq.com/s/GHgJRVkU3hsrSLy-Rhviwg


2019-09-22 23:251094

评论

发布
暂无评论
发现更多内容

ReactNative进阶(二十二):点击事件.bind(this)引发的思考

No Silver Bullet

1月月更 ReactNative

2022年,你还要做开源软件么?

亚马逊云科技 (Amazon Web Services)

计算

当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系

阿Q说代码

Java泛型 1月月更 子类型

高效时代,是时候过渡到自动化测试了

SoFlu-JavaAI开发助手

DevOps 软件开发 自动测试

全面提升体系化数据管理能力 | OceanBase 发布全新3.X工具家族

OceanBase 数据库

数据库 开源 开发者 OceanBase 社区版 产品发布

vivo 推送平台架构演进

vivo互联网技术

分布式 架构设计 消息推送 平台搭建、

2021 年 6 个GitHub推荐前端项目

devpoint

vite nextjs tauri 1月月更 Tailwind

Flink,Spark,Storm,Hadoop框架比较

@零度

flink hadoop spark Storm 大数据开发

crontab介绍安装及每秒运行

Owen Zhang

Linux crontab

AJAX工作原理及其优缺点

编程江湖

编程进阶之路,虽无捷径但有长短

程序人生

利用物联网技术加速数字化转型

龙智—DevSecOps解决方案

hi 龙蜥小二来了 ,一键@为你答疑解惑

OpenAnolis小助手

Linux 服务

Apache Kylin PMC 马洪宾:开源,就是一场“螺旋上升”的旅程

腾源会

用户文章转载:Windows用户都来看看,这个锅P4不背

龙智—DevSecOps解决方案

perforce P4

Bruce Eckel教你如何爬出 Gradle 的“坑”?

图灵社区

java 编程

复盘和反思一个被全公司邮件通报的漏测

LynnYang

测试 Postman Mock

1月月更|推荐学java——Spring第一课

逆锋起笔

spring SSM框架 Spring MVC Spring Java Spring项目

netty系列之:不用怀疑,netty中的ByteBuf就是比JAVA中的好用

程序那些事

Netty nio 程序那些事 1月日更

云图说|图解DGC:基于华为智能数据湖解决方案的一体化数据治理平台

华为云开发者联盟

大数据 数据湖 数据治理 数据服务 数据湖治理中心

云效产品篇:开启敏捷需求管理 |云效快速入门

阿里云云效

阿里云 DevOps 云原生 需求管理 云效

龙智搬迁公告

龙智—DevSecOps解决方案

搬迁

几行代码,把zip文件直接破解

你?

Flink是如何支持批流一体的

编程江湖

flink

在 Flutter 中创建自定义 NumPad(数字键盘)

坚果

flutter 1月月更

MySQL性能优化:SQL慢查询优化,索引优化,表优化

Ayue、

MySQL 1月月更

打造智能全场景,《HarmonyOS Connect系列课》7大BUFF为您助力!

HarmonyOS开发者

热烈庆祝龙智高级咨询顾问叶燕秀获得“Atlassian认证专家”称号

龙智—DevSecOps解决方案

Atlassian认证专家 Atlassian认证

深入分析JUC之Lock接口

编程江湖

lock锁

60岁代码匠的几篇小作文,解决了大多数程序的迷茫(上)

图灵社区

java 编程

都2022年了,你的前端工具集应该有vueuse

华为云开发者联盟

Vue 前端 API 工具集 vueuse

QCon前端参会分享_大前端_马琳_InfoQ精选文章