以兴趣部落为例讲解面向亿万用户的 Web 同构直出。
首先介绍了一些基本概念。
什么是直出?javascript
以 Node 做为后端语言实现的服务端渲染页面并输出的技术。复制代码
什么是同构?前端
客户端与服务端能够共享部分代码复制代码
而后给出了两个二维码,让你们扫码体验哪一个是直出前页面,哪一个是直出后页面。java
ReactDomServer.renderToString
拼装 HTML 字符串,返回给浏览器。浏览器端根据服务端返回的数据 ReactDom.render
出真实 DOM。`_BROWSER_`;
...
`_END_`;复制代码
经过直出框架机来实现。react
框架集本地开发调试经过使用命令行工具包 fireDragon
,执行如下命令就能够啦。jquery
npm link // 创建全局连接
firedragon init //初始化路由配置
firedragon // 读取路由配置文件,启动服务复制代码
容灾采用两种方式,框架机进行柔性处理,以及接入层转发。git
经过 wetest.qq.com
平台监控各项应用数据了解承受能力,找出性能瓶颈。github
采用灰度发布,逐步扩大直出页面访问用户从 10 拓展到 3亿,服务器从 1 台拓展到 111 台。web
服务器层面从 CPU 使用率,CPU 性能,内存占用,磁盘 IO,网络 IO 监控。
运行时数据从脚本错误,测试,PV/UV,直出服质量,后台接口质量和染色日志。面试
零脚本错误实战主要从下面五个方面展开讲解。ajax
客户反馈?老板连环夺命 call ? 经历了这些思考采用更高效的方案。
体系组成分为三步,监听->上报->数据收集系统。
try-catch
,window-onerror
。ajax
请求或者直接使用 img
。上报发现遇到不少 script error
错误,是由浏览器的同源策略致使的。
如何解决呢?script
标签添加 crossorigin
属性,后端作 CORS 处理。
错误脚本分析基于 SourceMap
监控方案解决。
经过生成 SourceMap
文件维护源文件和处理后文件的映射关系,使用 VLQ
编码来存储映射。
或者使用开源的 sentry
。
监控、上报白名单中的前端资源。
HTML Meta
标签<meta http-equiv="Content-Security-Policy" content="script-src 'self'" >复制代码
HTTP Header
(响应头带上 CSP
的指令)使用上报(不拦截),拦截两种方式。复制代码
推荐了两个插件,js-error-dialog
报错弹窗和prettyjs
代码格式化、高亮和错误展现。
分享提问开发者开发的第一个网站为引导,引出前端工程化的议题,而且从开发环境、衔接和生产环境三个环节来说述。
开发工程化从三个主要环节进行,脚手架与命令行、组件化和接口联调。
steamerjs
。即装即用的插件式机制方便项目快速搭建,只须要键入如下几条命令就好啦:npm i -g steamerjs
npm i -g steamer-plugin-kit
npm i -g steamer-react
steamer kit复制代码
npm
或者 npm
私服,方便跨项目的组件复用。element
。postman
,easy-mock.com
,steamer-plugin-mock
。wetest
, 日志监控推荐 sentry.io
。github + travis-ci
,私有项目可使用bitbucket + pipeline
or github + pipeline
。pre-Commit
检查。生产部署推荐使用腾讯云(此处有广告硬植入,哈哈~)
首先介绍了什么是 Service Worker。
Service Worker 是浏览器后台运行 JS 处理网络请求和管理缓存相应的方法。Service Worker 提供了一个 Application Cache 的替代方案。
最简单的 Service Worker 样例:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('./sw.js')
}
// sw.js
self.onfetch = (e) => {
e.respondWith(new Response('Hello Service Worker!'))
}复制代码
Installing
-> Active
,出错的话会进入 Error
。Installing
-> Waiting
-> Active
,出错的话一样会进入 Error
。兼容性
Service Worker 的 URL
千万不要打版本号!!!正确的作法是保持 SW URL 不变,且与主页在同一域名下。
xxx.com/xxx/sw.js复制代码
Dev Tool
在 Chrome 调试工具 network
选项中,Size
栏为 from Service Worker
就是启用了 Service Worker
加载的资源。
自动构建
业界比较成熟的是谷歌的 sw-precache。使用也很简单,一行命令搞定:
sw-precache —config=sw-config.js
// sw-config.js
module.exports = {
// 须要SW缓存的⽂文件,默认使⽤用缓存优先策略略
staticFileGlobs: [
'dist/cdn/**',
'dist/webserver/**'
],
// 前缀替换
stripPrefixMulti: {
'dist/cdn/': '//path/to/your/cdn/',
'dist/webserver/': '//path/to/your/webserver'
},
// 输出路路径
swFile: '/dist/webserver/sw.js',
// 动态内容的缓存策略略
runtimeCaching: [{
// 对于全部url中带有 '/api/' 的请求,优先⽹网络请求,若离线,则使⽤用以前的缓存
urlPattern: /\/api\//,
handler: 'networkFirst'
}]
};复制代码
固然 sw-precache 也有一些缺陷,好比没有集成的 Runtime,不支持外部 CDN 资源。
考虑到这些缺陷,基于 sw-precache 作了一些改进解决这些缺点,命名为 create-sw。
最后还提到了 PWA 实践,有兴趣能够详细了解。
首先简单描述了人工智能的大背景,人工智能时代背景下每一个人都须要了解或学习人工智能。以后推荐了一个前端深度学习库 deeplearn.js
。
分享主要以兴趣部落送礼页面的实践为例,分如下几个话题讲述:
移动端的屏幕适配分为如下几种场景阐述:
需考虑内存消耗和帧率,推荐工具 stats.js 和 Chrome developTool。
使用 GPU 硬件加速
图片压缩
性能问题
性能的监控使用以前推荐的 stats.js 就好。分析发现 translate 的表现明显优于 background。
测试过程当中发现动画有锯齿,卡顿明显,有多是图片太大致使的。
性能调试 timeline
锯齿是如何产生的呢?
帧动画图片性能
帧动画到底用不用合图?建议不要合图使用 HTTP2.0 便可。合图以后的雪碧图会有空白区域,一个动画大概 40 - 50 帧的图片,单张图片要 500 500 px,合并图后达到 4000px 3000px。
帧动画优化方案 - zip 压缩包
帧动画优化方案 - indexedDB
硬件加速 will-change
兼容性问题 CSS3 动画控制
兼容性问题 FPS 控制
限制帧率 RAF
通常建议保证 60 FPS 的帧率。若是不限制帧率的时候,使用 RAF 自由发挥,但须要注意资源包体积。
兼容性问题 canvas Retina适配
250px 250px 的原图到 500px 500px 的画布上发现变模糊了,缘由是设备像素比 window.devicePixelRatio 致使的。能够画在 500px * 500px 的 Canvas 上再 scale(0.5)。
致使性能问题的缘由多是机器性能低,内存紧张,帧率低。
性能评分的原理是页面建立必定数量的DOM,并添加 transform 和 opacity 变化。根据帧率衡量机器性能。
fps = 1000 * n/t
@1x
图片产品频繁新增/更换礼物,若是每次更换都修改代码无疑是不可取的。所以须要把动画效果改成可配置,定义统一配置文件,动画资源由 packageID 惟一标识,礼物配置与动画资源分离。
Javascript 语言的执行环境是单线程的。若是一个任务耗时很长,就会阻塞后面的任务,致使页面无响应。因而,Javascript 将任务的执行模式分为同步和异步。
经过jQuery when
方法一样能够实现相似于 Promise
对象的功能。而且经过 when
可使得多个异步并行请求,而后获取返回值进行回调处理
经过 done
或者 then
两种方式进行回调。
promise的功能是能够将复杂的异步处理轻松地进行模式化。
接着简单介绍了 promise
的 API,就再也不详细讲述了:
Promise只能进行异步调用方式。
理论上,在promise.then 执行的时候promise对象已是肯定状态,从程序上说对回调函数进行同步调用也是行得通的。
Promise也会以异步的方式调用该回调函数,这是在Promise设计上的规定方针。
当需求变得复杂后,多层嵌套和链式调用,也让代码看起来不那么优雅。
经过 async/await 解决异步方式有如下几个有优势:
以后是下午甜点:
首先以一个 Demo 为例判断是否为函数式编程。
function f(h){
return h + 1;
}
var x = 3;
f(x + 1);复制代码
理解函数式编程意味着:
经过点击计数任务不一样的写法来说述函数式编程的特色。代码传送门:
函数式编程是种编程范式,它将电脑运算视为函数的计算,关注纯逻辑与数学运算。
纯函数只有逻辑运算和数学运算,同一个输入总获得同一个输出。纯函数的优势是可缓存、可测试、可并行(web worker),可进行惰性计算。
var memoize = function(f) {
var cache = {};
return function() {
var arg_str = JSON.stringify(arguments);
cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
return cache[arg_str];
};
};复制代码
let f = x => x + 1;
let g = x => x * 2;
g(f(1))
compose(g, f)(1)复制代码
Container.of
把东西装进容器中隔绝外部影响,经过 Map 来接触、操做窗口内的值,得到包含新值的容器。var Container = function(x) {
this._value = x;
}
Container.of = function(x) {
return new Container(x);
}
Container.of(3)
// => Container(3)
Container.prototype.map = function(f){
return Container.of(f(this._value))
}
Container.of('flamethrowers').map(function(s) {
return s.toUpperCase()
}
// => Container('FLAMETHROWERS')复制代码
上个函数输出是下个函数函数输入。
流式框架有 xtream 和 RxJS。
最后附上参考资料
老教授首先抛出一个经典问题,“若是你是一个大学毕业生,你会选择大型互联网公司仍是创业公司?”。
这个问题历来没有标准的答案,而且现场的回答者就很坚决的选择小公司,而老教授的建议是选择大公司。
以及一些综合知识考察,好比:用户从输入 url 到最终页面展现,这个过程当中发生了什么?老板反馈页面打开白屏,而你手机是正常的,怎么办?页面卡顿,怎么优化?
若是你连前端基础知识都没掌握好,我怎么相信你是热爱前端的学习者?
一个字,怼!找出项目经历的关键词,而后由浅入深,一直问到答不上来为止。暗中观察团队协做意识、攻克难题决心、搜索资料能力等。
大学的时候以广度为主,拓展视野;
工做以后以深度为主,单点深挖;
当达到瓶颈后,再次向广度拓展,打通知识。
————百度某总监复制代码
基础知识
基础知识相比社招有更高的要求。
项目经验
项目经验需对比腾讯的高级前端工程师要求。
最后,乐观自信和技术能力同样重要!
到这里本次 AC 大会的现场实录就更新完了,一成天 9 场的技术分享加圆桌讨论,议题也是从项目搭建、优化、监控到编程思想、前沿科技以及职业发展涵盖各个方面,真的是干到不能再干的大会了。一天很短,内容很长,但愿对你们有所帮助,将来几天慢慢消化,接下来也能够多多交流。