一、 HTTP的几种请求方法用途
-
GET方法发送一个请求获取服务器上的某一资源
-
POST方法向指定的URL指定的资源提交数据或附加新数据
-
DELETE方法删除服务器上的某个资源
-
PUT方法跟
POST方法很像,也是想服务器提交数据。但是,它们之间有不同。PUT指定了资源在服务器上的位置,而POST没有 -
HEAD方法用来请求页面首部
二、从浏览器地址栏输入url到显示页面的步骤
基础版本:
- 浏览器根据请求
URL交给DNS域名解析,找到真实的IP,向服务器发起请求 - 服务器交给后台处理完成后返回数据,浏览器接收文件(
js、html、css,图像等资源) - 浏览器对获取到的资源进行解析,生成对应的
html页面以及Dom结构 - 载入解析到的资源文件,渲染页面
详细版本:
-
在浏览器地址栏输入URL
-
浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤
- 如果资源未缓存,发起新请求
- 如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证。
- 检验新鲜通常有两个HTTP头进行控制
Expires和Cache-Control- HTTP1.0提供
Expires,值为一个绝对时间表示缓存新鲜日期 - HTTP1.1增加了
Cache-Control:max-age=,值为以秒为单位的最大新鲜时间
- HTTP1.0提供
-
浏览器解析URL获取协议,主机,端口,path
-
浏览器组装一个HTTP(GET)请求报文
-
浏览器获取主机ip地址,过程如下
- 浏览器缓存
- 本机缓存
- hosts文件
- 路由器缓存
- ISP DNS 缓存
- DNS递归查询(可能存在负载均衡导致每次IP不一样)
-
打开一个socket与目标IP地址,端口建立TCP链接,三次握手如下
- 客户端发送一个TCP的SYN=1,Seq=X的包到服务器端口
- 服务器发回SYN=1,ACK=X+1,Seq=Y的响应包
- 客户端发送ACK=Y+1,Seq=Z
-
TCP链接建立后发送HTTP请求
-
服务器接受请求并解析,将请求转发到服务程序,如虚拟主机使用HTTP Host头部判断请求的服务程序
-
服务器检查HTTP请求头是否包含缓存验证信息如果验证缓存新鲜,返回304等对应状态码
-
处理程序读取完整请求并准备HTTP响应,可能需要查询数据库等操作
-
服务器将响应报文通过TCP连接发送回浏览器
-
浏览器接收HTTP响应,然后根据情况选择关闭TCP连接或者保留重用,关闭TCP连接的四次握手如下:
- 主动方发送Fin=1, Ack=Z, Seq= X报文
- 被动方发送ACK=X+1, Seq=Z报文
- 被动方发送Fin=1, ACK=X, Seq=Y报文
- 主动方发送ACK=Y, Seq=X报文
-
浏览器检查响应状态吗:是否为1XX,3XX, 4XX, 5XX,这些情况处理与2XX不同
-
如果资源可缓存,进行缓存
-
对响应进行解码(例如gzip压缩)
-
根据资源类型决定如何处理(假设资源为HTML文档)
-
解析HTML文档,构件DOM树,下载资源,构造CSSOM树,执行js脚本,这些操作没有严格的先后顺序,以下分别解释
-
构建DOM树:
- Tokenizing:根据HTML规范将字符流解析为标记
- Lexing:词法分析将标记转换为对象并定义属性和规则
- DOM construction:根据HTML标记关系将对象组成DOM树
-
解析过程中遇到图片、样式表、js文件,启动下载
-
构建CSSOM树:
- Tokenizing:字符流转换为标记流
- Node:根据标记创建节点
- CSSOM:节点创建CSSOM树
-
根据DOM树和CSSOM树构建渲染树 (opens new window) :
- 从DOM树的根节点遍历所有可见节点,不可见节点包括:1)
script,meta这样本身不可见的标签。2)被css隐藏的节点,如display: none - 对每一个可见节点,找到恰当的CSSOM规则并应用
- 发布可视节点的内容和计算样式
- 从DOM树的根节点遍历所有可见节点,不可见节点包括:1)
-
js解析如下:
- 浏览器创建Document对象并解析HTML,将解析到的元素和文本节点添加到文档中,此时document.readystate为loading
- HTML解析器遇到没有async和defer的script时,将他们添加到文档中,然后执行行内或外部脚本。这些脚本会同步执行,并且在脚本下载和执行时解析器会暂停。这样就可以用document.write()把文本插入到输入流中。同步脚本经常简单定义函数和注册事件处理程序,他们可以遍历和操作script和他们之前的文档内容
- 当解析器遇到设置了async属性的script时,开始下载脚本并继续解析文档。脚本会在它下载完成后尽快执行,但是解析器不会停下来等它下载。异步脚本禁止使用document.write() ,它们可以访问自己script和之前的文档元素
- 当文档完成解析,document.readState变成interactive
- 所有defer脚本会按照在文档出现的顺序执行,延迟脚本能访问完整文档树,禁止使用document.write()
- 浏览器在Document对象上触发DOMContentLoaded事件
- 此时文档完全解析完成,浏览器可能还在等待如图片等内容加载,等这些内容完成载入并且所有异步脚本完成载入和执行,document.readState变为complete,window触发load事件
-
显示页面(HTML解析过程中会逐步显示页面)
详细简版
- 从浏览器接收
url到开启网络请求线程(这一部分可以展开浏览器的机制以及进程与线程之间的关系) - 开启网络线程到发出一个完整的
HTTP请求(这一部分涉及到dns查询,TCP/IP请求,五层因特网协议栈等知识) - 从服务器接收到请求到对应后台接收到请求(这一部分可能涉及到负载均衡,安全拦截以及后台内部的处理等等)
- 后台和前台的
HTTP交互(这一部分包括HTTP头部、响应码、报文结构、cookie等知识,可以提下静态资源的cookie优化,以及编码解码,如gzip压缩等) - 单独拎出来的缓存问题,
HTTP的缓存(这部分包括http缓存头部,ETag,catch-control等) - 浏览器接收到
HTTP数据包后的解析流程(解析html-词法分析然后解析成dom树、解析css生成css规则树、合并成render树,然后layout、painting渲染、复合图层的合成、GPU绘制、外链资源的处理、loaded和DOMContentLoaded等) CSS的可视化格式模型(元素的渲染规则,如包含块,控制框,BFC,IFC等概念)JS引擎解析过程(JS的解释阶段,预处理阶段,执行阶段生成执行上下文,VO,作用域链、回收机制等等)- 其它(可以拓展不同的知识模块,如跨域,web安全,
hybrid模式等等内容)
三、如何进行网站性能优化
conten方面- 减少
HTTP请求:文件合并、CSS精灵、inline Image - 减少
DNS查询:DNS缓存,将资源分布到恰当数量的主机名 - 减少
DOM元素数量
- 减少
Server方面- 使用
CDN - 配置
ETag - 对组件使用
Gzip压缩
- 使用
Cookie方面- 减少
cookie大小
- 减少
css方面- 将样式表放到页面顶部
- 不使用
css表达式 - 使用
<link>不使用@import
Jacascript方面- 将脚本放到页面底部
- 将
javascrpit和css从外部引入 - 压缩
javascrpit和css - 删除不需要的脚本
- 减少
DOM访问
- 图片方面
- 优化图片:根据实际颜色选择色深、压缩
- 优化
css精灵 - 不要在
HTML中拉伸图片 有哪些前端性能优化的方法
- 减少http请求次数: CSS Sperites、JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管、data缓存、图片服务器。
- 前端模板JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量不用请求,减少请求次数
- 用innerHTML代替DOM操作,减少DOM操作次数,优化JavaScript性能
- 当需要设置的样式很多时,设置className而不是直接操作style
- 少用全局变量,缓存DOM节点查找的结果,减少IO读取操作
- 避免使用CSS Expression(css表达式)
- 图片预加载,将样式表放在顶部,脚本放在底部,加上时间戳
- 避免在页面的主体不就中使用table,table要等其中内容完全下载之后才会显示,显示比div+css布局慢 谈谈性能优化问题
- 代码层面:避免使用css表达式,避免使用高级选择器,通配选择器
- 缓存利用:缓存Ajax,使用CDN,使用外部js和css文件以便缓存,添加Expires头,服务端配置Etag,减少DNS查找等
- 请求数量:合并样式和脚本,使用css图片精灵,初始首屏之外的图片资源按需加载,静态资源延迟加载
- 请求带宽:压缩文件,开启GZIP
前端性能优化最佳实践?
- 性能评级工具(PageSpeed 或 YSlow)
- 合理设置 HTTP 缓存:Expires 与 Cache-control
- 静态资源打包,开启 Gzip 压缩(节省响应流量)
- CSS3 模拟图像,图标base64(降低请求数)
- 模块延迟(defer)加载/异步(async)加载
- Cookie 隔离(节省请求流量)
- localStorage(本地存储)
- 使用 CDN 加速(访问最近服务器)
- 启用 HTTP/2(多路复用,并行加载)
- 前端自动化(gulp/webpack)
四、 HTTP状态码及其含义
-
1XX:信息状态码100 Continue继续,一般在发送post请求时,已发送了http header之后服务端将返回此信息,表示确认,之后发送具体参数信息
-
2XX:成功状态码200 OK正常返回信息201 Created请求成功并且服务器创建了新的资源202 Accepted服务器已接受请求,但尚未处理
-
3XX:重定向301 Moved Permanently请求的网页已永久移动到新位置。302 Found临时性重定向。303 See Other临时性重定向,且总是使用GET请求新的URI。304 Not Modified自从上次请求后,请求的网页未修改过。
-
4XX:客户端错误400 Bad Request服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。401 Unauthorized请求未授权。403 Forbidden禁止访问。404 Not Found找不到如何与URI相匹配的资源。
-
5XX:服务器错误500 Internal Server Error最常见的服务器端错误。503 Service Unavailable服务器端暂时无法处理请求(可能是过载或维护)
五、介绍一下你对浏览器内核的理解?
- 主要分成两部分:渲染引擎(
layout engineer或Rendering Engine)和JS引擎 - 渲染引擎:负责取得网页的内容(
HTML、XML、图像等等)、整理讯息(例如加入CSS等),以及计算网页的显示方式,然后会输出至显示器或打印机。浏览器的内核的不同对于网页的语法解释会有不同,所以渲染的效果也不相同。所有网页浏览器、电子邮件客户端以及其它需要编辑、显示网络内容的应用程序都需要内核 JS引擎则:解析和执行javascript来实现网页的动态效果- 最开始渲染引擎和
JS引擎并没有区分的很明确,后来JS引擎越来越独立,内核就倾向于只指渲染引擎
六、 html5有哪些新特性、移除了那些元素?
-
HTML5现在已经不是SGML的子集,主要是关于图像,位置,存储,多任务等功能的增加- 新增选择器
document.querySelector、document.querySelectorAll - 拖拽释放(
Drag and drop) API - 媒体播放的
video和audio - 本地存储
localStorage和sessionStorage - 离线应用
manifest - 桌面通知
Notifications - 语意化标签
article、footer、header、nav、section - 增强表单控件
calendar、date、time、email、url、search - 地理位置
Geolocation - 多任务
webworker - 全双工通信协议
websocket - 历史管理
history - 跨域资源共享(CORS)
Access-Control-Allow-Origin - 页面可见性改变事件
visibilitychange - 跨窗口通信
PostMessage Form Data对象- 绘画
canvas
- 新增选择器
-
移除的元素:
- 纯表现的元素:
basefont、big、center、font、s、strike、tt、u - 对可用性产生负面影响的元素:
frame、frameset、noframes
- 纯表现的元素:
-
支持
HTML5新标签:IE8/IE7/IE6支持通过document.createElement方法产生的标签- 可以利用这一特性让这些浏览器支持
HTML5新标签 - 浏览器支持新标签后,还需要添加标签默认的样式
-
当然也可以直接使用成熟的框架、比如
html5shim
如何区分 HTML 和 HTML5
DOCTYPE声明、新增的结构元素、功能元素
七、html5的离线储存怎么使用,工作原理
- 在用户没有与因特网链接时,可以正常访问站点或应用,在用户与英特网链接时,更新用户机器上的缓存文件
- 原理:
html5的离线存储是基于一个新建的.appcache文件的缓存机制(不是存储技术),通过这个文件上的解析清单离线存储资源,这些资源就会像cookie一样被存储了下来,之后当网络处于离线状态时,浏览器会通过被离线存储的数据进行页面展示 - 如何使用:
- 页面头部加入一个
manifest的属性 - 在
cache.manifest文件的编写离线存储的资源 - 在离线状态时,操作
window.applicationCache进行需求实现
- 页面头部加入一个
CACHE MANIFEST
#v0.11
CACHE:
js/app.js
css/style.css
NETWORK:
resourse/logo.png
FALLBACK:
/offline.html
浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢
- 在线的情况下,浏览器发现
html头部有manifest属性,它会请求manifest文件,如果是第一次访问app,那么浏览器就会根据manifest文件的内容下载相应的资源并且进行离线存储。如果已经访问过app并且资源已经离线存储了,那么浏览器就会使用离线的资源加载页面,然后浏览器会对比新的manifest文件与旧的manifest文件,如果文件没有发生改变,就不做任何操作,如果文件改变了,那么就会重新下载文件中的资源并进行离线存储。 - 离线的情况下,浏览器就直接使用离线存储的资源。
八、cookies 、sessionStorage和localStorage的区别
-
cookie是网站为了标识用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密) -
cookie数据始终在同源的http请求中携带,即会在浏览器和服务器间来回传递 -
sessionStorage和localStorage不会自动把数据发给服务器端,仅在本地保存 -
存储大小:
cookie数据大小不能超过4ksessionStorage和localStorage虽然也有存储大小的限制,但比cookie大的多,可以达到5M或更大
-
有期时间:
localStorage存储持久数据,浏览器关闭后数据不丢失除非主动删除数据sessionStorage数据在当前浏览器窗口关闭后自动删除cookie设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭
八、iframe 的缺点
- iframe 会阻塞页面的
Onload事件 - 搜索引擎的检索程序无法解读这种页面,不利于
SEO iframe和主页面共享连接池,而浏览器对相同域的连接有限制所以会影响页面的并行加载- 使用
iframe之前需要考虑这两个缺点。如果需要使用iframe,最好是通过javascript动态给iframe添加src属性值,这样就可以绕开以上两个问题
九、WEB标准以及W3C标准是什么?
- 标签闭合、标签小写、不乱嵌套、使用外链
css和js、结构行为表现的分离
十、xhtml和html有什么区别?
-
一个是功能上的差别
- 主要是
XHTML可兼容各大浏览器、手机以及PDA,并且浏览器也能快速正确地编译网页
- 主要是
-
另外是书写习惯的差别
XHTML元素必须被正确地嵌套,闭合,区分大小写,文档必须拥有根元素
十一、行内元素、块级元素、 空(void)元素有那些?行内元素和块级元素的区别区别
- 行内元素:
a b span img input select strong - 快级元素:
div ul ol dl dt dd h1 h2 h3 h... p - 空元素:
<br /> <hr> <img> <input> <link> <meta> - 行内元素不可以设置宽高,不独占一行
- 块级元素可以设置宽高,独占一行
-
以下汇总三种行内元素转为块级元素的方法:
- (1)display:block
- (2)float
- (3)position(absolute和fixed)
HTML全局属性(global attribute)有哪些
class:为元素设置类标识data-*: 为元素增加自定义属性draggable: 设置元素是否可拖拽id: 元素id,文档内唯一lang: 元素内容的的语言style: 行内css样式title: 元素相关的建议信息
Canvas和SVG有什么区别?
svg绘制出来的每一个图形的元素都是独立的DOM节点,能够方便的绑定事件或用来修改。canvas输出的是一整幅画布svg输出的图形是矢量图形,后期可以修改参数来自由放大缩小,不会失真和锯齿。而canvas输出标量画布,就像一张图片一样,放大会失真或者锯齿
十二、 如何在页面上实现一个圆形的可点击区域?
svgborder-radius- 纯
js实现 需要求一个点在不在圆上简单算法、获取鼠标坐标等等
viewport
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
// width 设置viewport宽度,为一个正整数,或字符串‘device-width’
// device-width 设备宽度
// height 设置viewport高度,一般设置了宽度,会自动解析出高度,可以不用设置
// initial-scale 默认缩放比例(初始缩放比例),为一个数字,可以带小数
// minimum-scale 允许用户最小缩放比例,为一个数字,可以带小数
// maximum-scale 允许用户最大缩放比例,为一个数字,可以带小数
// user-scalable 是否允许手动缩放
十三、 渐进增强和优雅降级之间的不同
- 渐进增强:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
- 优雅降级:一开始就构建完整的功能,然后再针对低版本浏览器进行兼
十四、web开发中会话跟踪的方法
cookiesessionurl重写- 隐藏
input ip地址
十五、Cookie的弊端
cookie虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但还是有很多局限性的
- 每个特定域名下最多生成
20个cookie IE6或更低版本最多20个cookieIE7和之后的版本最多可以有50个cookieFirefox最多50个cookiechrome和Safari,没有做硬性限制IE和Opera会清理近期最少使用的cookie,Firefox会随机清理cookiecookie的最大大约为4096字节,一般设置不超过4095字节- 如果
cookie被人拦截了,就可以取得所有的sessing信息