本文主要内容:

  1. AJAX
  2. GET和POST请求的区别
  3. 同源策略、JSONP、跨域方式
  4. 浏览器架构
  5. 输入一个Url到加载网页的全过程,发生了什么?
  6. 浏览器渲染的步骤
  7. 重绘和回流
  8. 页面渲染优化

AJAX

  • 什么是AJAX?
AJAX即一种异步请求,可以实现页面局部刷新;
  • AJAX实现的步骤:
  1. 创建请求对象
  2. 与服务端创建连接,执行open方法;
  3. 发送请求,执行send方法;
  4. 为请求对象绑定onreadystate事件,当readyState为4 且 status为200时处理数据;
  • AJAX封装
function Ajax(options) {var xhr = null;var params = formsParams(options.data);// 第一步: 创建请求对象if(window.XMLHttpRequest) {xhr = new XMLHttpRequest();} else {// 兼容IE6xhr = new ActiveXObject("Microsoft.XMLHTTP");}// 第二步: 连接,执行open和send方法;if(options.type == 'GET') {xhr.open(options.type, options.url + '?' + params, options.async);xhr.send();} else if(options.type == 'POST') {xhr.open(options.type, options.url, options.async);xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send(params);}// 绑定onreadystatechange事件xhr.onreadystatechange = function() {if(xhr.readyState == 4 && xhr.status == 200) {options.success(xhr.responseText);}}function formsParams(data) {var arr = [];for(var i in data) {arr.push(i + '=' + data[i]);}arr.join('&');}
}
使用方法:
Ajax({type: 'GET',url: 'a.php',async: true,data: {name: 'zhangsan',age: 10},success: function(data) {console.log(data);}
});
  • AJAX的优缺点:
优点:
  1. 实现局部刷新
  2. 减轻服务器端压力
缺点:
  1. 破坏浏览器前进和后退机制;
  2. 一个页面ajax请求过多,会造成页面加载缓慢;
  3. 数据安全问题不太好,可以采用数据加密的方式;
  • readyState状态码:
0 - open方法还没调用
1 - 已经调用send方法,正在发送请求
2 - send方法已经完成,已经接收到全部相应内容
3- 正在解析相应内容
4 - 相应内容解析完成
  • staus状态码:
200 - 成功
404 - 未找到
5** - 服务器错误

GET和POST请求的区别

GET和POST是HTTP请求的两种方式;
  • 区别要点:
get: 缓存/长度受限(2M)/无副作用(不修改资源)/幂等的场景(请求数据与资源无关)
post: 安全/长度无限制/支持更多编码类型(ACII & 二进制)
关于安全方面,其实GET和POST两者都不安全。 虽然POST请求的数据不携带在URL上,但是因为HTTP在网络传输的时候是明文传输的,所以,只要使用抓包工具,能轻而易举的获取数据; 想要安全传输,只有加密,可以前端将传输参数进行加密,也可以才用HTTPS;
  • 区别见下图,来源W3school

同源策略、JSONP、跨域方式

  • 含义:
端口号、域名、协议名,三者必须全部相同才符合同源策略,反之即为跨域;
  • JSONP
原理:动态生成script标签,利用script不受跨域的限制,但是缺点是只支持get请求;
封装JSONP方法:
function jsonp(url, callback, success) {var script = document.createElement('script');script.src = url;script.async = true;script.type = 'text/javascript'; window[callback] = function(data) {success && success(data);}document.body.appendChild(script);
}
  • 跨域的其他方法
  1. 设置 CORS: Access-Control-Allow-Origin:*
2. postMessage
3. WebSocket
4. iframe

浏览器架构

先解释一个概念: 线程(Thread):线程是进程的一部分,并且执行进程中的一部分程序; 进程 (Process):启动一个程序,就会创建一个进程,操作系统为其分配内存,进程中的所有线程中的所有程序状态都保存到该内存中,关闭程序,进程也会消失,内存会释放;
下面这个图很形象:
不同浏览器中的架构不同:
  • 可能是一个有很多线程的进程
  • 也可能是有少量线程的多个进程,通过IPC进行通信
Chrome 就是属于多进程之间进行通信,现在是为每个标签创建一个进程,正在尝试为每个站点提供自己的进程;
  • 多进程的好处
  1. 多进程的设计可以使多个标签页面的加载不受其他的影响;
  2. 安全性和沙盒,每个进程有自己独立的存储空间
  • Chrome浏览器的一些机制
  1. 由于每个进程都有自己的存储空间,它通常包含公共基础结构的副本(例如V8引擎),这样会消耗很多内存空间;
Chrome浏览器为了节省内存,对进程的数量做了限制,这个因内存和CPU功率而定;
当达到这个限制的时候,浏览器会在同一进程中运行从同一站点打开的多个选项卡;
2. 当Chrome浏览器遇到更强大的硬件时,会将每个服务拆分成不同的进程,从而提供更高的稳定性;但是如果资源有限的设备上,会将服务整合到一个进程中,从而节省内存。Android上已经实现了服务的整合;
  • 浏览器的组成
  1. 用户界面(User Interface)
  2. 浏览器引擎(browser engine)
  3. 渲染引擎(rendering engine)
  4. 网络(Networking)
  5. 用户界面后段(UI Backend)
  6. JavaScript解析器(JavaScript Interpreter)
  7. 数据存储(Data persistence)
下图形象的展示了浏览器的组成:

输入一个Url到加载网页的全过程,发生了什么?

  1. 域名解析:浏览器将URL解析出相对应的服务器的IP地址(现在本地浏览器的DNS缓存中查找,没有的话,再向浏览器默认的DNS服务器发送查询请求,同时缓存),并从url中解析出端口号
  2. 浏览器与目标服务器建立一条TCP连接(三次握手);
  3. 浏览器向服务器发送一条HTTP请求报文
  4. 服务器返回给浏览器一条HTTP响应报文
  5. 关闭连接,解析文档
  6. 浏览器进行渲染
  7. 如果文档中资源加载就再次建立连接,直至资源全部加载完毕

浏览器渲染的步骤

  1. HTML解析出DOM Tree
  2. CSS解析出Style Rules
  3. 两者关联生成Render Tree
  4. Layout(布局)根据Render Tree 计算每个节点的信息
  5. Painting 根据计算好的信息进行渲染整个页面
浏览器解析文档的过程中, 如果遇到script标签,会立即解析脚本,停止解析文档(因为JS可能会改变DOM和CSS,如果继续解析会造成浪费)。 如果是外部script, 会等待脚本下载完成之后在继续解析文档。现在script标签增加了defer和async属性,脚本解析会将脚本中改变DOM和css的地方解析出来,追加到DOM Tree 和 Style Rules上

重绘和回流

回流(reflow):当页面发生重新布局的过程。元素的几何尺寸发生变化时,需要重新计算节点信息,也就是执行了渲染步骤的第4步;
重绘(repaint):屏幕的一部分需要重新绘制,比如css背影色变化,颜色变化等。
回流比重绘成本高的多得多;
举例说明
$('body').css('color', 'red'); // repaint
$('body').css('margin', '2px'); // reflow, repaintvar bstyle = document.body.style; // cachebstyle.padding = "20px"; // reflow, repaint
bstyle.border = "10px solid red"; //  再一次的 reflow 和 repaintbstyle.color = "blue"; // repaint
bstyle.backgroundColor = "#fad"; // repaintbstyle.fontSize = "2em"; // reflow, repaint// new DOM element - reflow, repaint
document.body.appendChild(document.createTextNode('dude!'));
但是浏览器不会像上边那样,每改一次样式都会重新reflow和repaint一次。一般来说,浏览器会把这样的操作积攒一波,然后reflow一次。

页面渲染优化

基于对渲染过程的了解,推荐一下优化:
  1. HTML文档结构层次尽量少,最好不深于6层
  2. 脚本尽量放后边,避免组织页面加载
  3. 少量首屏样式可以放在便签内
  4. 样式结构层次尽量简单
  5. 脚本减少DOM操作,减少回流,尽量缓存访问DOM的样式信息
  6. 尽量减少JS修改样式,可以通过修改class名的方式解决
  7. 减少DOM查找,缓存DOM查找结果
  8. 动画在屏幕外或页面滚动时,尽量停止

转载于:https://juejin.im/post/5cf7405c6fb9a07eb051afc7

前端面试准备---浏览器和网络篇(一)相关推荐

  1. 前端面试中浏览器相关问题(二):回流与重绘

    前端面试中浏览器相关问题(二):回流与重绘 文章目录 前端面试中浏览器相关问题(二):回流与重绘 浏览器的渲染过程 生成渲染树 回流 重绘 何时发生回流重绘 浏览器的优化机制 减少回流和重绘 最小化重 ...

  2. 前端面试八股—浏览器(一)

    文章目录 前端安全 CSRF XSS 网络劫持 前端存储 缓存 强制缓存 协商缓存 点击刷新或按F5.按Ctrl+F5强制刷新.地址栏回车的区别 存储方式 cookie cookie.session. ...

  3. 前端面试之浏览器原理篇

    一.浏览器安全 1. 什么是 XSS 攻击? (1)概念 XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击.攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cookie ...

  4. 前端面试-主流浏览器以及其内核

    前端开发当然要了解你做测试的浏览器,而且在面试的时候也会经常问到这方面的问题. 现在国内常见的浏览器有:IE.Firefox.Safari.Opera.Google Chome.QQ浏览器.搜狗浏览器 ...

  5. 第 7 节:前端面试指南 — 微信小程序篇(附面试题答案)

    这周很多读者朋友都在「微信小程序」的视频了. 前 6 期没看的同学,建议先看完再来看这一期的,传送门: 第 1 期:「简历篇」含简历模板文件 第 2 期:「HTML篇」含面试题&答案 第 3 ...

  6. 前端面试之移动端适配篇(转载)

    文章目录 关于像素,括号中为别名 设备像素(物理像素) 设备无关像素(设备独立像素) 设备无关像素与CSS像素之间的关系 -- 页面缩放比 设备像素与设备无关像素之间的关系 -- DPR 设备像素与C ...

  7. 前端面试系列-浏览器缓存机制

    缓存位置 从缓存位置上来说分为四种,并且各自有优先级,当依次查找缓存且都没有命中的时候,才会去请求网络 Service Worker Memory Cache Disk Cache Push Cach ...

  8. 前端面试题目搜集——理论知识篇

    一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起TCP的3次握手 c. 建立TCP连接后发起http请求 d. 服务器端响应http请求,浏览器 ...

  9. 前端面试之浏览器内核

    目前主流浏览器内核主要有以下几种: 1. Chromium/Blink:由谷歌开发的内核,是目前最为流行的浏览器内核,包括谷歌Chrome.Microsoft Edge.Opera等. 2. Geck ...

最新文章

  1. CF5A Chat Server's Outgoing Traffic(字符串模拟,find函数的应用)难度⭐
  2. Internet Explorer 8 使用技巧(3):安全上网
  3. vue动态切换css文件_如何在vue组件中动态的引入css文件?
  4. Python 5 运算符
  5. 程序员未来前景如何?大龄程序员出路在哪里?
  6. 17.2 无监督数据增强——UDA
  7. tomcat乱码问题解决
  8. 初步探索python
  9. BlueCoat ProxySG性能问题分析--ICAP排队现象
  10. ant下载与本地配置
  11. 一度智信开网店靠谱吗
  12. 什么是强化学习呢,来涨波知识
  13. iframe父页面子页面相互调用方法
  14. homeassistant mysql_学习笔记 篇三:HomeAssistant学习笔记docker安装的ha更换数据库
  15. 洛谷P1233 木棍加工
  16. 手动在百度云服务器上安装Mysql8.0
  17. Android英语词典案例
  18. 小女孩和父亲的爆笑对话
  19. 前端学习-DOM:清空输入框,输入框内容的显示与隐藏,双色球(获取不重复的随机数)
  20. minecraft_使用MCDungeon将地牢,废墟和寻宝游戏添加到您的Minecraft世界中

热门文章

  1. 吴恩达机器学习7——支持向量机SVM
  2. LeetCode 545. Boundary of Binary Tree 二叉树边界
  3. python接口自动化(五)--接口测试用例和接口测试报告模板(详解)
  4. android开发app初始化,Android 的 Application 初始化
  5. php学到什么程度可以学thinkphp,thinkphp学习一
  6. 1.1 版本控管与Git
  7. [码海拾贝 之Perl]获取日期以及日期的加减
  8. 安装mysql会有驱动吗_kettle 安装mysql 驱动
  9. 一杯水怎么测试_怎么测家里自然水的水质情况?
  10. linux常用内核端口,基于Linux下的/O端口和I/O内存详解