面试问:
- 对浏览器的工作原理了解多少?
- 前端的新技术有哪些?
- 项目开发过程中遇到的挑战有什么?
- 说一下浏览器(以chrome为例)的进程架构
- 说一下浏览器的渲染流程
- html5的发展趋势
- 页面劫持是什么,浏览器安全
- 如何提高页面的性能
08年Chrome 浏览器推出,完全颠覆了之前浏览器的架构设计,在速度和安全性上占据了绝对优势。在 2010 年底,Google 还推出了一款网络操作系统——ChromeOS。
浏览器的三个大发展方向( Web 应用能做什么,未来能适用于哪些新领域)
-
应用程序 Web 化。云计算和 HTML5 技术的发展,越来越多的应用转向了浏览器 / 服务器(B/S)架构,视频、音频、游戏几大核心场景也都在往 Web 的使用场景切换。
-
Web 应用移动化。移动端web存在的问题:渲染流程过于复杂且性能不及原生应用、离线时用户无法使用、无法接收消息推送、移动端没有一级入口,但 Google 推出了 PWA 方案来整合 Web 和本地程序各自的优势。
-
Web 操作系统化。Web 操作系统有两层含义:
-
一是利用 Web 技术构建一个纯粹的操作系统,如 ChromeOS;
-
二是浏览器的底层结构往操作系统架构方向发展:
- Chrome 朝着 SOA (面向服务的架构)的方向演化,未来很多模块都会以服务的形式提供给上层应用使用;
- 在浏览器中引入多种编程语言的支持,比如新支持的 WebAssembly;
- 简化渲染流程,使得渲染过程更加直接高效;
- 加大对系统设备特性的支持;
- 提供对复杂 Web 项目开发的支持。
-
浏览器已经逐步演化成了操作系统之上的“操作系统” 。依靠浏览器的网络操作系统。
为什么需要学习浏览器工作原理?
-
准确评估 Web 开发项目的可行性
随着 Web 特性的极大丰富和浏览器性能的提升,越来越多的项目可以用 Web 来开发。了解浏览器是如何工作的,能够让你更加准确地决策是否可以采用 Web 来开发项目。
-
优化web页面的性能
站在用户体验角度来考虑页面性能。几个常见的用户体验指标:页面加载时长、用户交互反馈时长、Web 动画中的帧数。这些指标是由一系列的复杂因素导致的。如果你要开发流畅的页面,或者诊断 Web 页面中的性能问题。
站在更高的维度审视项目,通过全视野快速定位项目中不合理的地方。比如,首屏的显示就涉及了 DNS、HTTP、DOM 解析、CSS 阻塞、JavaScript 阻塞等技术因素,其中一项没处理好就可能导致整个页面的延时。
-
把握技术发展的方向和本质
理解现有的web技术存在的不足,理解未来的web技术的针对这些不足而创造的新技术方案。
Node.js 是前端发展的一个核心推动力。
为什么 Node.js 能如此快速地发展?根本原因还是浏览器功能以及整个前端的开发环境,不足以支撑日益增长的需求。随着脚本执行效率的提高、页面渲染性能的提升和开发工具链的完善,接下来的前端会进入一个相对平稳的阶段。通俗地理解就是:等到核心技术足以支撑核心需求,那么前端生态会进入一个相对稳定的状态。
如果了解了浏览器的工作机制,那么可以梳理出来前端技术的发展脉络,更加深刻地理解当前的技术,同时你也会清楚其不足之处,以及演化方向。
为了不断的解决web技术无法满足开发需要的现实问题,web技术针对它们不断演进。
前端技术演进:
- 首先是脚本执行速度问题。比如针对 JavaScript 设计缺陷和执行效率的问题,可以从以下两个途径去解决:
不断修订和更新语言本身,知道 ES6、ES7、ES8,或者 TypeScript 出现的必要性。
使用新的语言 WebAssembly 。WebAssembly 需要经过编译器编译,所以体积小、执行速度快,使用它能大幅提升语言的执行效率,但是语言本身的完善,和生态的构建都是需要花很长时间来打造的。
- 前端模块化开发。Web 工程的复杂程度越来越高,这就产生了模块化开发的需求,于是相应出现了 WebComponents 标准。
React 和 Vue 都在渐进地适应 WebComponents 标准,同时各种前端框架的最佳实践也会反过来影响 WebComponents 标准的制定。如果理解了浏览器工作原理,那么会对 WebComponents 中涉及的 Shadow DOM、HTML Templates 等技术有更深刻的理解。
- 渲染效率问题。理解浏览器的渲染流程,知道目前页面的渲染依然存在的缺陷,如何避开这些缺陷,开发出更加高效的 Web 应用。与此同时,Chrome 团队也在着手改善这些缺陷,比如正在开发的下一代布局方案 LayoutNG,还有渲染瘦身方案 Slim Paint,其目的都是让渲染变得更加简单和高效。
触发改变的背后因素是当前技术制约了现实的需求。
《webkit技术内幕》—— 朱永盛
宏观视角看浏览器:
- Chrome进程架构
- TCP协议
- HTTP请求流程
- 导航流程
- 渲染流程
浏览器中JavaScript执行机制:
- JS执行顺序(编译和执行)
- 调用栈
- 作用域
- 词法环境和变量环境
- this
V8工作原理:
- 堆栈内存
- 垃圾回收
- 编译器和解释器
事件循环系统:
- 消息队列和事件循环及其代表性API:setTimeout和XMLHttpRequest
- 宏任务和微任务:Promise和async/await
WEB页面的性能优化:
- 利用Chrome做应用性能分析
- 其他性能优化
- js脚本对DOM树的影响
HTTP不同版本:
- HTTP/1
- HTTP/2
- HTTP/3
浏览器安全:
- 同源策略
- 跨站脚本攻击
- 跨站点伪造请求
- 沙盒
- https
前端工程师需要具备哪些核心的基础技能呢?
- 利用UI层来展示一些数据和承载交互
- 前端工程化(node.js)
- 渲染工具:浏览器
- 数据结构与算法
- 图形学(webgl,canvas,glsl)
- 计算机学科基础
目前Chrome的排版引擎是Blink,Blink是从Webkit分支独立出来 的,起初和Webkit基本是一样的,但是随着Google在Blink上的发力,目前的差异已经非常大了。其实站在大的结构层面来看,Blink,WebKit , Gecko三者的渲染流水线基本是类似的,只是一 些术语有些不同。但是落实到具体实现层面来看,差别就很大了,如JS引擎的实现,排版过程,绘制过程等都有很 大差异。
浏览器获取服务端响应的set-cookie 后,浏览器请求里的cookie是调用了浏览器本身内置的方法写进去的吗?
把http响应头看成是服务器和浏览器对话的语言, 响应头中的set-cookie字段就是告诉浏览器:“浏览器,帮我把这段Cookie写到本地去”! 所以浏览器在接收set-cookie后,就会将cookie写到本地!