解析HTML构建DOM树,将他解析成树状解构。(可以想成BST二叉树,这个阶段有一个树状的对象。)
构建渲染树,根据DOM树每个节点,顺序提取计算使用的css规则,并重新计算DOM树解构的样式图,并且生成一个带有样式表述的DOM树。(可以想成BST二叉树,这个阶段在每个节点加上样式,添加style属性,并更具css规则,添加style里面的规则。)
渲染树布局阶段。当渲染树生成结束后,根据每个渲染树节点在页面的位置以及大小。
绘制渲染树。将每个dom元素的背景以及颜色等样式信息渲染到节点上面。
这里要关注的是页面的布局阶段和渲染阶段。dom元素如果位置发生改变,就会发生重排=>重绘,如果位置不变,只是样式改变了,就只会发生重绘。重排消耗了巨大的浏览器性能,所以如果要改变位置,请添加position: absolute;.写成绝对定位,尽量减少重排的影响范围。
另外不要再html内容里面的代码插入script,因为他常常会阻塞html解析
编辑器
理想中编辑器应具备的能力
浏览器调试工具
协议无处不在,访问网页http协议,基于https的协议,以及web如何唤起原生app的协议,以及websock协议,与服务器交互Restful协议。协议无处不在,下面细说。
http1.1 长连接 -- keep-alive等头域 http1.1的长连接通过keep-alive的头域信息来控制,而HTTP1.0中,如果要建立,请求信息中包含Connection: keep-alive头域信息返回,值得注意的是,长连接的请求机制并不会节省传输内容的网络开销。
在http1.1之前,浏览器缓存主要通过http1.0的expires头部来控制实现。我们直到expires只能通过绝对时间来刷新缓存,但是http1.1新加入的Cache-Control头域,可以支持相对时间。另外浏览器可以根据Etag和Last-Modified来判断浏览器是否从缓存中加载文件。浏览器发起请求时候,头部域字段的判断流程如下:
下图就是Cache-Control 和 Etag和Last-Modified请求缓存的主要过程。
部分内容传输优化
accept: application/json
Accept-Encoding: gzip, deflate, br
,是否支持压缩压缩方式application/xml
下一个超文本传输协议,首先了解一下http2,spdy加速,他是google发起的,spdy协议要求必须使用https加密传输协议。所以之前http1.1以下的无法使用spdy加速,,因此最终http2决定以spdy为基础,进行开发。http2较之前http1.1有以下区别:
这里有必要安利一下我们的基础知识,TCP连接复用和HTTP1.1中的keep-alive连接复用的区别:TCP复用传输是发生在传输层的,而keep-alive控制的文件的连接复用是发生在应用层;keep-alive控制的文件的来连接复用是串行的,即一个文件传输完成后,下一个文件才能用这个连接,而TCP连接是帧的多路复用,这就是说,不同文件的传输帧可以在一个TCP连接中一起使用流式传输。
http2支持传输流的优先级和流量控制,HTTP2中每个文件传输流都有自己的传输优先级,并且可以通过服务器改变优先级,动态改变,,例如在未来的服务器,就可以优先保证css优先加载,再加载js文件。
支持服务器推送。服务端能再特定条件下把资源主动推送给客户端,就像浏览器端的资源预加载,例如资源推送可以在HTML文档下载之前就让HTML的JavaScript和CSS文件现行下载,,从而大大缩短页面加载和渲染等待时间。
所以基于这些HTTP2的优势,有人提出推广HTTP2,但是目前来说,如果推广http2,那么之前很多网页针对http1.1优化规则就就无效了,而且支持http2的浏览器本身就少,但是http2终将到来,我们却不能立即享有。但是我真的很想说,这些web服务器早就想到了,例如nginx1.13.12,支持http协议在浏览器不支持http2的情况下自动降级。
web前端安全涵盖很多方面,比如
XXS(Cross Site Script, 跨站脚本攻击) 通常由带有页面解析内容的数据未经过处理直接插入页面导致解析错误值得注意的是,XSS分类3种类型,主要区别就是攻击脚本引入位置
SQL(Structured Query Language, 结构化查询语言) 主要就是因为页面提交数据到服务端后,在服务端未进行数据验证就将数据直接坪街道SQL语句执行,主要方法措施就是在前端输入验证进行严格校验。
CSRF(Cross-site Request Forgery,跨站请求伪造) CSRF是指的非源站按照源站点的数据请求格式提交非法数据给源站服务器的一种攻击方式,非源站点在拿到用户登录验证信息的情况下,可以直接对源站点的某个数据接口进行提交。如果源站点对该提交请求的数据来源未经验证,该请求可能被成功执行,这其实不合理。通常比较安全的是通过token(令牌)提交验证的方式来验证请求是否为源站点页面提交的,来阻止跨站伪请求的发生。为了避免跨站请求伪造,通常我们进行token验证,其中一种形式就是将页面到后台验证Token与session临时保存的Token进行比较就可以实现了。
现在除了正常的前后端脚本安全问题,网络请求劫持的发生也越来越频繁。网络劫持一般指网站资源请求过程中因为人为的攻击导致没有加载到预期的资源内容,网络劫持分为2种:DNS劫持和HTTP劫持。
HTTPS协议就是通过加入SSL(Secure Sockets Layer)层来加密HTTP数据进行安全传输的HTTP协议,同时启动默认的443端口进行数据传输,那么使用HTTPS是怎样保证浏览器和服务器之间的数据安全呢?先说2个概念:公匙和私匙 他们之间是通过一种加密算法得到的密钥对,即一个公钥配一个密钥,公钥是公开部分,用来会话加密,验证数字签名或者加密可以用相应私钥解密的数据,通过这种算法得到的密钥对保证是唯一的,使用这个密钥的时候,如果其中一个密钥加密一段数据,则必须用另一个密钥解密, 例如三次握手,都是携带密钥进行访问的,下面是node的例子:
const http = require('http');
const https = require('https');
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx) => {
ctx.body = '23';
});
http.createServer(app.callback()).listen(3000);
https.createServer(app.callback()).listen(3001);
path/v2/addBook
目前来说,html已经发展到HTML5了,但是在实际开发过程中,html5只有移动端才会用到,虽然出现很多组件开发模式,但是3层结构仍然是基础。
DOCTYPE,就是他的首部标签,
给予搜索引擎更好的理解,最主要的是杜绝全部由div标签嵌套,
<div class="ui-menu-list">
<div class="menu-list-item"></div>
<div class="menu-list-item"></div>
<div class="menu-list-item"></div>
<div class="menu-list-item"></div>
<div class="menu-list-item"></div>
</div>
<ul class="ui-menu-list">
<li class="menu-list-item"></li>
<li class="menu-list-item"></li>
<li class="menu-list-item"></li>
<li class="menu-list-item"></li>
<li class="menu-list-item"></li>
</ul>
推荐使用header+article+footer的套路
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<header>
</header>
<article>
</article>
<footer>
</footer>
</body>
</html>
即使在没有html的情况下,仍然具备良好的阅读性,例如nav一般存放导航栏结构,article一般存放文章,
<a/>, <b/>, <span/>, <img/>,<input/>,<button>,<select>,<strong/>
<div/>,<ul/>,<li/>,<dl/>,h1~h6,<p><table>
<br/>,<hr>,<link><area><base>,<col><command><embed><keygen>
但是这考虑到兼容性问题.
* {
margin: 0;
padding: 0;
}
* {
margin: 5px;
padding: 5px;
}
SASS预处理主要包括模块引用,嵌套,父级选择器,嵌套属性,注释变量,数据类型,运算,圆括号,函数,攥写,变量默认值,规则指令,控制指令,mixin,继承extend,
常见动画方案,也就6种
JavaScript直接实现动画, 容易造成页面重排重绘,,性能差,应该尽量避免使用
svg动画, 比较复杂,自己去看mdn
CSS3transition动画 css3新属性
CSS3animation 然而移动端很卡,所以通常添加 transform: translate3D(0,0,0)或者transform: translateZ(0);来开启移动端动画cpu加速,让动画更加流畅。通常就是@keyframes,想想,css动画脱离js,同时可以让浏览器开启cpu加速,实现复杂动画效果,
Canvas动画 他也可以实现复杂动画。完全通过JavaScript来控制。
requestAnimationFrame 这个不知道
总的来说,pc端,建议直接js动画,或者svg动画实现,移动端建议canvas,css3transition,css3 animation,canvas。
方案一: 可以在nodejs端判断访问pc还是移动,动态发布资源。
方案二: 例如bootstrap的媒介查询,但是这种方案有以下缺点
解决以下问题就好:
如何在判断userAgent
let isMobile = navigator.userAgent.match(/Phone|iPod|Android|iPad/i)
常见优化图片资源,优化,可以选择背景图片的时候,选择不同图分辨率的资源,但是这个不利于seo(Search Engine Optimization )优化,也不能有alt,title等属性,也不能在图片加载失败的时候,显示错误图片,
以 border: 1px; 为例子,在高清屏幕下,会被渲染成2px,可以使用transform: scaleY(1/devicePixelRatio)来实现单方向缩放实现1个像素边框,对于字体,使用transform: scale(.5);来支持小文字。如果页面因为高清屏幕导致显示模糊,那么用 -webkit-font-smoothing: antialiased
来修复。