Js相干
实行环节和作用域
实行环节定义了函数或许变量能够接见的别的数据,决议了他们各自的行动。
每一个实行环境都有一个与之关联的变量对象,在环境中定义的一切变量和函数都保存在这个变量中,而且是我们没法接见。
每一个函数都有本身的实行环境,当实行流进入一个函数的时刻,就把函数的实行环境压入实行环境栈,实行终了后,再将环境推出,把掌握权交给之前的实行环境。
当代码在一个环境中实行的时刻,会竖立变量对象的作用域链,作用域链的用途是保证对实行环境有权接见的一切变量和函数的有序接见。
作用域链的前端,一直都是当前实行代码地点环境的变量对象.假如这个环境是函数,则将其运动对象作为变量对象.作用域链中的下一个变量对象来自包含环境,终究到全局对象window.
延伸作用域链 try catch 和 with语句.
渣滓接纳机制
- 标记消灭 (比较常常运用)
渣滓收集器在运转的时刻会给存储在内存中的一切变量都加上标记,然后,他会去掉环境中的变量以及被环境中变量援用的变量的标记.
而在此之后有标记的变量将被视为预备删除的变量.
- 援用计数.
跟踪纪录每一个值被援用的次数 ,经由历程援用来适当增添他的援用次数,当援用计数为0时,表明该变量能够被消灭.
typeof 操纵符
undefiend/变量未定义 boolean/布尔值 string/字符串 number/数值 object对象或许null function/函数 symbol/Symbol
相称(==)划定规矩
- 假如有一个操纵数为布尔值,则先转为数值(false 0 true 1);
- 假如一个操纵数为字符串,另一个为数值,将字符串转换为数值
- 假如一个操纵数为对象,另一个不是,挪用对象的valurOf要领,用获得的原始值挪用之前的划定规矩比较;
[注重]:
- null和 undefiend是相称的;
- 比较之前,不能见null和undefined转换为其他任何值;
- 假如有一个操纵数为NaN,返回false,纵然两个NaN比较也是false
- 假如两个都是对象,比较是不是是同一个对象,假如两个操纵数指向同一个对象,返回true.
全等(===)划定规矩
全等比较前不会转换操纵数,其他状态一样.
浏览器缓存
能够分为 强缓存和协商缓存
1.强缓存:不会向效劳器发送请求,直接从缓存中读取资本,在chrome掌握台的network选项中能够看到该请求返回200的状态码,而且size显现from disk cache或from memory cache;
2.协商缓存:向效劳器发送请求,效劳器会依据这个请求的request header的一些参数来推断是不是掷中协商缓存,假如掷中,则返回304状态码并带上新的response header关照浏览器从缓存中读取资本;
3.二者的共同点是,都是从客户端缓存中读取资本;区分是强缓存不会发请求,协商缓存会发请求
强缓存
Expires:response header里的逾期时候,浏览器再次加载资本时,假如在这个逾期时候内,则掷中强缓存。
Cache-Control:当值设为max-age=300时,则代表在这个请求准确返回时候(浏览器也会纪录下来)的5分钟内再次加载资本,就会掷中强缓存。
Expires和Cache-Control:max-age=* 的作用是差不多的,区分就在于 Expires 是http1.0的产品,Cache-Control是http1.1的产品,二者同时存在的话,Cache-Control优先级高于Expires;在某些不支撑HTTP1.1的环境下,Expires就会发挥用途。所以Expires现实上是过期的产品,现阶段它的存在只是一种兼容性的写法
协商缓存
ETag和If-None-Match:这两个要一同说。Etag是上一次加载资本时,效劳器返回的response header,是对该资本的一种唯一标识,只需资本有变化,Etag就会从新天生。浏览器鄙人一次加载资本向效劳器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,效劳器接收到If-None-Match的值后,会拿来跟该资本文件的Etag值做比较,假如雷同,则示意资本文件没有发作转变,掷中协商缓存。
Last-Modified和If-Modified-Since:这两个也要一同说。Last-Modified是该资本文件末了一次变动时候,效劳器会在response header里返回,同时浏览器会将这个值保存起来,鄙人一次发送请求时,放到request header里的If-Modified-Since里,效劳器在吸收到后也会做比对,假如雷同则掷中协商缓存。
区分
起首在准确度上,Etag要优于Last-Modified。Last-Modified的时候单元是秒,假如某个文件在1秒内转变了屡次,那末他们的Last-Modified实在并没有表现出来修正,然则Etag每次都邑转变确保了精度;假如是负载均衡的效劳器,各个效劳器天生的Last-Modified也有能够不一致。
第二在机能上,Etag要逊于Last-Modified,毕竟Last-Modified只须要纪录时候,而Etag须要效劳器经由历程算法来盘算出一个hash值。
第三在优先级上,效劳器校验优先斟酌Etag。
浏览器缓存历程
浏览器第一次加载资本,效劳器返回200,浏览器将资本文件从效劳器上请求下载下来,并把response header及该请求的返回时候一并缓存;
下一次加载资本时,先比较当前时候和上一次返回200时的时候差,假如没有凌驾cache-control设置的max-age,则没有逾期,掷中强缓存,不发请求直接从当地缓存读取该文件(假如浏览器不支撑HTTP1.1,则用expires推断是不是逾期);假如时候逾期,则向效劳器发送header带有If-None-Match和If-Modified-Since 的请求;
效劳器收到请求后,优先依据Etag的值推断被请求的文件有无做修正,Etag值一致则没有修正,掷中协商缓存,返回304;假如不一致则有修改,直接返回新的资本文件带上新的Etag值并返回 200;
假如效劳器收到的请求没有Etag值,则将If-Modified-Since和被请求文件的末了修正时候做比对,一致则掷中协商缓存,返回304;不一致则返回新的last-modified和文件并返回 200;
用户行动对浏览器缓存的掌握
地点栏接见,链接跳转是正常常运用户行动,将会触发浏览器缓存机制;
F5革新,浏览器会设置max-age=0,跳过强缓存推断,会举行协商缓存推断;
ctrl+F5革新,跳过强缓存和协商缓存,直接从效劳器拉取资本。
跨域
什么是跨域
说到跨域,起首就要提到一个前端的平安观点,即浏览器的同源战略.
简朴来讲,就是浏览器为了保证用户信息的平安,防备歹意的网站盗取数据,只许可同源的js剧本操纵本页面。
那假如我们须要在同一个页面中请求非同源的数据怎么办呢?这个就涉及到跨域问题了。
什么是同源
同源须要同时满足以下三个前提:
- 协定雷同
- 域名雷同
- 端口雷同
注重:父域名一样,子域名不一样也是非同源的。
同源限定
假如非同源,以下三种行动将受到限定:
(1) Cookie、LocalStorage 和 IndexDB 没法读取。
(2) DOM 没法获得。
(3) AJAX 请求不能发送。
跨域要领
- JSONP
这是一种最常常运用也是支撑度比较高的跨域体式格局,其道理动态插进去script
标签,经由历程script
标签引入一个js
文件,这个js文件载入胜利后会实行我们在url参数中指定的函数,而且会把我们须要的json
数据作为参数传入。
长处是兼容性好,简朴易用,支撑浏览器与效劳器双向通讯。瑕玷是只支撑GET请求。
- CORS
效劳器端关于CORS
的支撑,重要就是经由历程设置Access-Control-Allow-Origin
来举行的。假如浏览器检测到相应的设置,就可以够许可Ajax
举行跨域的接见。
以上两种体式格局重要用来跟背景数据交互.
- 经由历程修正document.domain来跨子域
将子域和主域的document.domain
设为同一个主域.前提前提:这两个域名必需属于同一个基础域名!而且所用的协定,端口都要一致,不然没法运用document.domain
举行跨域
主域雷同的运用document.domain
此要领能够用来处置惩罚跨域cookie当地存储的跨域接见,LocalStorage 和 IndexDB 没法经由历程这类要领,躲避同源政策,而要运用下文引见的PostMessage API。
- 运用window.name来举行跨域
window
对象有个name
属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的一切的页面都是同享一个window.name
的,每一个页面临window.name
都有读写的权限,window.name
是耐久存在一个窗口载入过的一切页面中的
以上两种重要用在 运用`iframe来完成页面组织的页面.完成DOM之间的跨域交互.
- 运用HTML5中新引进的
window.postMessage
要领来跨域传送数据
该要领许可跨窗口通讯,不论这两个窗口是不是同源。
要领的第一个参数是详细的信息内容,第二个参数是吸收音讯的窗口的源(origin),即”协定 + 域名 + 端口”。也能够设为*,示意不限定域名,向一切窗口发送。
postMessage/addEventListener 基础类似于一个全局的事宜管理器.能够经由历程这两个接口来发送/监听 事宜,从而完成信息交互.
撙节
不论怎么触发,都是根据指定的距离来实行,一样给个基础版。
请输入代码function throttle(func, wait) {
var timer
return function() {
var context = this
var args = arguments
if (!timer) {
timer = setTimeout(function () {
timer = null
func.apply(context, args)
}, wait)
}
}
}
防抖
不论你触发多少次,都比及你末了触发后过一段你指定的时候才触发。根据这个诠释,写一个基础版的。
function debounce(func, wait) {
var timer
return function() {
var context = this
var args = arguments
clearTimeout(timer)
timer = setTimeout(function() {
func.apply(context, args)
}, wait)
}
}
HTMl&Css
元素程度居中
- 假如须要居中的元素为通例流中inline元素,为父元素设置
text-align: center;
即可完成 - 假如须要居中的元素为通例流中block元素,1)为元素设置宽度,2)设置摆布margin为auto。3)IE6下需在父元素上设置
text-align: center;
,再给子元素恢复须要的值 - 假如须要居中的元素为浮动元素,1)为元素设置宽度,2)
position: relative;
,3)浮动方向偏移量(left或许right)设置为50%,4)浮动方向上的margin设置为元素宽度一半乘以-1 - 假如须要居中的元素为相对定位元素,1)为元素设置宽度,2)偏移量设置为50%,3)偏移方向外边距设置为元素宽度一半乘以-1
- 假如须要居中的元素为相对定位元素,1)为元素设置宽度,2)设置摆布偏移量都为0,3)设置摆布外边距都为auto
元素竖直居中
- 须要居中元素为单行文本,为包含文本的元素设置大于
font-size
的line-height
:
如块级格式化上下文
(block formatting context),
竖立划定规矩:
- 根元素(html)
- 浮动元素(
float
不是none
) - 相对定位元素(
position
取值为absolute
或fixed
) -
display
取值为inline-block
,table-cell
,table-caption
,flex
,inline-flex
之一的元素 -
overflow
不是visible
的元素
作用:
- 能够包含浮动元素
- 不被浮动元素掩盖
- 阻挠父子元素的margin摺叠
CSS元素婚配
依据css rules 与dom tree 天生render tree。浏览器先发作一个元素鸠合,这个鸠合每每由末了一个部份的索引发作(假如没有索引就是一切元素的鸠合)。
然后向上婚配,假如不相符上一个部份,就把元素从鸠合中删除,直到端的挑选器都婚配完,还在鸠合中的元素就婚配这个挑选器了。
举个例子,有挑选器:
body.ready #wrapper > .lol233
先把一切 class 中有 lol233 的元素拿出来构成一个鸠合,然后上一层,对每一个鸠合中的元素,假如元素的 parent id 不为 #wrapper 则把元素从鸠合中删去。 再向上,从这个元素的父元素最先向上找,没有找到一个 tagName 为 body 且 class 中有 ready 的元素,就把本来的元素从鸠合中删去。至此这个挑选器婚配完毕,一切还在鸠合中的元素满足。
为何从后往前婚配因为效力和文档流的剖析方向。
1)效力,找元素的父亲和之前的兄弟比遍历一切儿子快而且轻易。
2)关于文档流的剖析方向,是因为如今的 CSS,一个元素只需肯定了这个元素在文档流之前涌现过的一切元素,就可以肯定他的婚配状态。运用在纵然 html 没有载入完成,浏览器也能依据已载入的这一部份信息完全肯定涌现过的元素的属性。
为何是用鸠合
重要也照样效力。
基于 CSS Rule 数量远远小于元素数量的假定和索引的运用,遍历每一条 CSS Rule 经由历程鸠合挑选,比遍历每一个元素再遍历每一条 Rule 婚配要快很多。
position四个值的区分
先看下各个属性值的定义:
1、static:默认值。没有定位,元素出如今平常的流中(疏忽 top, bottom, left, right 或许 z-index 声明)。
2、relative:天生相对定位的元素,经由历程top,bottom,left,right的设置相关于其平常位置举行定位。可经由历程z-index举行条理分级。
3、absolute:天生相对定位的元素,相关于 static 定位之外的第一个父元素举行定位。元素的位置经由历程 “left”, “top”, “right” 以及 “bottom” 属性举行划定。可经由历程z-index举行条理分级。
4、fixed:天生相对定位的元素,相关于浏览器窗口举行定位。元素的位置经由历程 “left”, “top”, “right” 以及 “bottom” 属性举行划定。可经由历程z-index举行条理分级。
static与fixed的定位体式格局较好明白,在此不做剖析。下面临运用的较多的relative和absolute举行剖析:
1、relative。定位为relative的元素离开平常的文本流中,但其在文本流中的位置依旧存在,依旧占领本来的位置,背面的元素没法向前补充。
2、absolute。定位为absolute的层离开平常文本流,但与relative的区分是其在平常流中的位置不在存在,相当于被提升到另一个层面去了,背面的元素会补占它的位置。
relative与absolute的重要区分:
起首,是上面已提到过的在平常流中的位置存在与否。
其次,relative定位的层老是相关于其近来的父元素,absolute定位的层老是相关于其近来的定义为absolute或 relative的父层,而这个父层并不一定是其直接父层。假如其父层中都未定义absolute或relative,则其将相对body举行定位。
fixed:天生相对定位的元素,相关于浏览器窗口举行定位。
相应式设想和自适应设想
自适应规划(Adaptive Layout)
自适应规划(Adaptive)的特征是离别为差别的屏幕分辨率定义规划。规划切换时页面元素发作转变,但在每一个规划中,页面元素不随窗口大小的调解发作变化。
就是说你看到的页面,内里元素的位置会变化而大小不会变化;你能够把自适应规划看做是静态规划的一个系列。
流式规划(Liquid Layout)
流式规划(Liquid)的特征(也叫”Fluid”) 是页面元素的宽度根据屏幕举行适配调解,重要的问题是假如屏幕标准跨度太大,那末在相对其原始设想而言太小或过大的屏幕上不能平常显现。
相应式规划(Responsive Layout)
离别为差别的屏幕分辨率定义规划,同时,在每一个规划中,运用流式规划的理念,即页面元素宽度跟着窗口调解而自动适配。
能够把相应式规划看做是流式规划和自适应规划设想理念的融会。
别的
HTTP状态码及其寄义
1XX 提醒信息 – 示意请求已被胜利吸收,继承处置惩罚
100 (继承) 请求者应该继承提出请求。 效劳器返回此代码示意已收到请求的第一部份,正在守候其余部份。
101 (切换协定) 请求者已请求效劳器切换协定,效劳器已确认并预备切换。
2XX 胜利 – 示意请求已被胜利吸收,明白,接收
200 (胜利) 效劳器已胜利处置惩罚了请求。 平常,这示意效劳器供应了请求的网页。
201 (已竖立) 请求胜利而且效劳器竖立了新的资本。
3XX 重定向 – 要完成请求必需举行更进一步的处置惩罚
304 (未修正) 自从上次请求后,请求的网页未修正过。 效劳器返回此相应时,不会返回网页内容。
4XX 客户端毛病 – 请求有语法毛病或请求没法完成
400 (毛病请求) 效劳器不明白请求的语法。
401 (未受权) 请求请求身份考证。 关于须要登录的网页,效劳器能够返回此相应。
403 (制止) 效劳器拒绝请求。
404 (未找到) 效劳器找不到请求的网页。
5XX 效劳器端毛病 – 效劳器未能完成正当的请求
500 (效劳器内部毛病) 效劳器碰到毛病,没法完成请求。
501 (还没有实行) 效劳器不具备完成请求的功用。 比方,效劳器没法辨认请求要领时能够会返回此代码。
502 (毛病网关) 效劳器作为网关或代办,从上游效劳器收到无效相应。
503 (效劳不可用) 效劳器现在没法运用(因为超载或停机保护)。 平常,这只是临时状态。
504 (网关超时) 效劳器作为网关或代办,然则没有实时从上游效劳器收到请求。
505 (HTTP 版本不受支撑) 效劳器不支撑请求中所用的 HTTP 协定版本。
sessionStorage,localStorage,cookie区分
- 都邑在浏览器端保存,有大小限定,同源限定
- cookie会在请求时发送到效劳器,作为会话标识,效劳器可修正cookie;web storage不会发送到效劳器
- cookie有path观点,子途径能够接见父途径cookie,父途径不能接见子途径cookie
- 有用期:cookie在设置的有用期内有用,默以为浏览器封闭;sessionStorage在窗口封闭前有用,localStorage长期有用,直到用户删除
- 同享:sessionStorage不能同享,localStorage在同源文档之间同享,cookie在同源且相符path划定规矩的文档之间同享
- localStorage的修正会促发其他文档窗口的update事宜
- cookie有secure属性请求HTTPS传输
- 浏览器不能保存凌驾300个cookie,单个效劳器不能凌驾20个,每一个cookie不能凌驾4k。web storage大小支撑能到达5M
网站优化
content方面
- 削减HTTP请求:兼并文件、CSS精灵、inline Image
- 削减DNS查询:DNS查询完成之前浏览器不能从这个主机下载任何任何文件。要领:DNS缓存、将资本散布到适当数量的主机名,均衡并行下载和DNS查询
- 防止重定向:过剩的中心接见
- 使Ajax可缓存
- 非必需组件耽误加载
- 将来所需组件预加载
- 削减DOM元素数量
- 将资本放到差别的域下:浏览器同时从一个域下载资本的数量有限,增添域能够进步并行下载量
- 削减iframe数量
- 不要404
Server方面
- 运用CDN
- 增加Expires或许Cache-Control相应头
- 对组件运用Gzip紧缩
- 设置ETag
- Flush Buffer Early
- Ajax运用GET举行请求
- 防止空src的img标签
Cookie方面
- 减小cookie大小
- 引入资本的域名不要包含cookie
css方面
- 将款式表放到页面顶部
- 不运用CSS表达式
- 运用<link>不运用@import
- 不运用IE的Filter
Javascript方面
- 将剧本放到页面底部
- 将javascript和css从外部引入
- 紧缩javascript和css
- 删除不须要的剧本
- 削减DOM接见
- 合理设想事宜监听器
图片方面
- 优化图片:依据现实色彩须要挑选色深、紧缩
- 优化css精灵
- 不要在HTML中拉伸图片
- 保证favicon.ico小而且可缓存
挪动方面
- 保证组件小于25k
- Pack Components into a Multipart Document
- 文件兼并, 削减挪用其他页面、文件的数量。
- 文件最小化/文件紧缩
行将须要传输的内容紧缩后传输到客户端再解压,如许在收集上传输的 数据量就会大幅减小。平常在效劳器上的Apache、Nginx能够直接开启这个设置,也能够从代码角度直接设置传输文件头,增添gzip的设置,也能够 从 负载均衡装备直接设置。不过须要注意的是,这个设置会稍微增添效劳器的累赘。提议效劳器机能不是很好的网站,要慎重斟酌。
- 运用 CDN 托管
CDN的全称是Content Delivery Network,即内容分发收集。其基础思路是尽量避开互联网上有能够影响数据传输速率和稳固性的瓶颈和环节,使内容传输的更快、更稳固。其目的是运用户可就近获得所需内容,处置惩罚 Internet收集拥堵的状态,进步用户接见网站的相应速率。
- 缓存的运用
Ajax挪用都采用缓存挪用体式格局,平常采用附加特征参数体式格局完成,注重个中的<script src=”xxx.js?{VERHASH}”,{VERHASH}就是特征参数,这个参数不变化就运用缓存文件,假如发作变化则从新下载新文件或更新信息。
- css文件安排在head,js安排在文档尾部
- 在效劳器端设置control-cache last-modify-date
- 在效劳器设置Entity-Tag if-none-match
- 可再连系H5新特征里的预加载,图片优化方面,可对图片举行紧缩,JPG的引荐jpegmin这个软件,png的引荐https://tinypng.com/,前面这两个是紧缩后不会失真的,gif的引荐GIF Optimizer,但能够会有毛边。
从浏览器地点栏输入url到显现页面的步骤(以HTTP为例)
- 在浏览器地点栏输入URL
浏览器检察缓存,假如请求资本在缓存中而且新颖,跳转到转码步骤
- 假如资本未缓存,提议新请求
- 假如已缓存,磨练是不是充足新颖,充足新颖直接供应给客户端,不然与效劳器举行考证。
磨练新颖平常有两个HTTP头举行掌握
Expires
和Cache-Control
:- HTTP1.0供应Expires,值为一个相对时候示意缓存新颖日期
- HTTP1.1增添了Cache-Control: max-age=,值为以秒为单元的最大新颖时候
- 浏览器剖析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树的根节点遍历一切可见节点,不可见节点包含: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剖析历程当中会逐渐显现页面)
什么是web语义化,有什么优点
web语义化是指经由历程HTML标记示意页面包含的信息,包含了HTML标签的语义化和css定名的语义化。
HTML标签的语义化是指:经由历程运用包含语义的标签(如h1-h6)适当地示意文档组织
css定名的语义化是指:为html标签增加有意义的class,id补充未表达的语义,如Microformat经由历程增加相符划定规矩的class形貌信息
为何须要语义化:
- 去掉款式后页面显现清楚的组织
- 瞽者运用读屏器更好地浏览
- 搜索引擎更好地明白页面,有利于收录
- 便团队项目的可延续运作及保护
Cmd和amd
模块化是软件体系的属性,这个体系被分解为一组高内聚,低耦合的模块。
那末在抱负状态下我们只须要完成本身部份的中心营业逻辑代码,其他方面的依靠能够经由历程直接加载被人已写好模块举行运用即可。
起首,既然是模块化设想,那末作为一个模块化体系所必需的才能:
1. 定义封装的模块。
2. 定义新模块对其他模块的依靠。
3. 可对其他模块的引入支撑。
差别之处
二者的重要区分以下:
- 定位有差别。
RequireJS 想成为浏览器端的模块加载器,同时也想成为 Rhino / Node 等环境的模块加载器。
Sea.js 则专注于 Web 浏览器端,同时经由历程 Node 扩大的体式格局能够很轻易跑在 Node 环境中。
- 遵照的范例差别。
RequireJS 遵照 AMD(异步模块定义)范例,S
ea.js 遵照 CMD (通用模块定义)范例。
范例的差别,致使了二者 API 差别。Sea.js 更切近 CommonJS Modules/1.1 和 Node Modules 范例。 - CMD 推重依靠就近,AMD 推重依靠前置。看代码:
- 推行理念有差别。RequireJS 在尝试让第三方类库修正本身来支撑 RequireJS,现在只要少数社区采用。Sea.js 不强推,采用自立封装的体式格局来“海纳百川”,现在已有较成熟的封装战略。
- 对开辟调试的支撑有差别。Sea.js 异常关注代码的开辟调试,有 nocache、debug 等用于调试的插件。RequireJS 无这方面的显著支撑。
- 插件机制差别。RequireJS 采用的是在源码中预留接口的情势,插件范例比较单一。Sea.js 采用的是通用事宜机制,插件范例更雄厚。