整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML面试题

.html5的新特性

文件类型声明(<!DOCTYPE>)仅有一型:<!DOCTYPE HTML>。
新的解析顺序:不再基于SGML。
绘画 canvas;
用于媒介回放的 video 和 audio 元素;
语意化更好的内容元素:article、footer、header、nav、section;
表单控件:calendar、date、time、email、url、search;
input元素的新类型:date, email, url等。
新的技术: webworker, websocket, Geolocation;
新的属性:ping(用于a与area), charset(用于meta), async(用于script)。
全域属性:id, tabindex, repeat。
新的全域属性:contenteditable, contextmenu, draggable, dropzone, hidden, spellcheck。
新应用程序接口:
HTML Geolocation
HTML Drag and Drop
HTML Local Storage
HTML Application Cache
HTML Web Workers
HTML SSE
HTML Canvas/WebGL
HTML Audio/Video
移除的元素:
纯表现的元素:basefont,big,center,font, s,strike,tt,u;
对可用性产生负面影响的元素:frame,frameset,naframes;

2.什么是Retina 显示屏,带来了什么问题?

retina:一种具备超高像素密度的液晶屏,同样大小的屏幕上显示的像素点由1个变为多个,如在同样带下的屏幕上,苹果设备的retina显示屏中,像素点1个变为4个

在高清显示屏中的位图被放大,图片会变得模糊,因此移动端的视觉稿通常会设计为传统PC的2倍
那么,前端的应对方案是:
设计稿切出来的图片长宽保证为偶数,并使用backgroud-size把图片缩小为原来的1/2
//例如图片宽高为:200px*200px,那么写法如下

.css{width:100px;height:100px;background-size:100px 100px;}


其它元素的取值为原来的1/2,例如视觉稿40px的字体,使用样式的写法为20px

.css{font-size:20px}

3.ios系统中元素被触摸时产生的半透明灰色遮罩怎么去掉?

ios用户点击一个链接,会出现一个半透明灰色遮罩, 如果想要禁用,可设置-webkit-tap-highlight-color的alpha值为0,也就是属性值的最后一位设置为0.X就可以去除半透明灰色遮罩
a,button,input,textarea{-webkit-tap-highlight-color: rgba(0,0,0,0.X)}

4.部分android系统中元素被点击时产生的边框怎么去掉

android用户点击一个链接,会出现一个边框或者半透明灰色遮罩, 不同生产商定义出来额效果不一样,可设置-webkit-tap-highlight-color的alpha值为0去除部分机器自带的效果

 a,button,input,textarea{ 
                  -webkit-tap-highlight-color: rgba(0,0,0,0;) 
                  -webkit-user-modify:read-write-plaintext-only; 
            } 

-webkit-user-modify有个副作用,就是输入法不再能够输入多个字符
另外,有些机型去除不了,如小米2
对于按钮类还有个办法,不使用a或者input标签,直接用div标签

5.webkit表单元素的默认外观怎么重置

通用

.css{-webkit-appearance:none;}

伪元素改变number类型input框的默认样式

input[type=number]::-webkit-textfield-decoration-container { 
    background-color: transparent;    
} 
input[type=number]::-webkit-inner-spin-button { 
    -webkit-appearance: none; 
}                      
input[type=number]::-webkit-outer-spin-button { 
    -webkit-appearance: none; 
}

6.webkit表单输入框placeholder的颜色值能改变么

input::-webkit-input-placeholder{color:#AAAAAA;}
input:focus::-webkit-input-placeholder{color:#EEEEEE;}

7.禁止ios 长按时不触发系统的菜单,禁止ios&android长按时下载图片

.css{-webkit-touch-callout: none}


8.禁止ios和android用户选中文字

.css{-webkit-user-select:none}

9.打电话发短信写邮件怎么实现

打电话:<a href="tel:0755-10086">打电话给:0755-10086</a>
发短信,winphone系统无效 <a href="sms:10086">发短信给: 10086</a>
写邮件:<a href=“mailto:peun@foxmail.com">peun@foxmail.com</a>

10.audio元素和video元素在ios和andriod中无法自动播放

应对方案:触屏即播

$('html').one('touchstart',function(){
    audio.play()
})

11.闪屏怎么解决

通过transform的3d属性改去硬件加速可以解决闪屏问题
开启硬件加速
1)解决页面闪白
2)保证动画流畅

.css { 
    -webkit-transform: translate3d(0, 0, 0); 
    -moz-transform: translate3d(0, 0, 0); 
    -ms-transform: translate3d(0, 0, 0); 
    transform: translate3d(0, 0, 0); 
} 

12.取消input在ios下,输入的时候英文首字母的默认大写

<input autocapitalize="off" autocorrect="off" />


13.android 上去掉语音输入按钮

input::-webkit-input-speech-button {display: none}

14.设计高性能CSS3动画的几个要素

尽可能地使用合成属性transform和opacity来设计CSS3动画
不使用position的left和top来定位
利用translate3D开启GPU加速

15.fixed bug

ios下fixed元素容易定位出错,软键盘弹出时,影响fixed元素定位
android下fixed表现要比iOS更好,软键盘弹出时,不会影响fixed元素定位
ios4下不支持position:fixed
解决方案
可用isroll.js,暂无完美方案

16.移动H5前端性能优化指南


1)PC优化手段在Mobile侧同样适用
2)在Mobile侧我们提出三秒种渲染完成首屏指标
3)基于第二点,首屏加载3秒完成或使用Loading
4)基于联通3G网络平均338KB/s(2.71Mb/s),所以首屏资源不应超过1014KB
5)Mobile侧因手机配置原因,除加载外渲染速度也是优化重点
6)基于第五点,要合理处理代码减少渲染损耗
7)基于第二、第五点,所有影响首屏加载和渲染的代码应在处理逻辑中后置
8)加载完成后用户交互使用时也需注意性能

优化指南

[加载优化]

加载过程是最为耗时的过程,可能会占到总耗时的80%时间,因此是优化的重点

减少HTTP请求

因为手机浏览器同时响应请求为4个请求(Android支持4个,iOS 5后可支持6个),所以要尽量减少页面的请求数,首次加载同时请求数不能超过4个
a) 合并CSS、JavaScript
b) 合并小图片,使用雪碧图

缓存

使用缓存可以减少向服务器的请求数,节省加载时间,所以所有静态资源都要在服务器端设置缓存,并且尽量使用长Cache(长Cache资源的更新可使用时间戳)
a) 缓存一切可缓存的资源
b) 使用长Cache(使用时间戳更新Cache)
c) 使用外联式引用CSS、JavaScript

压缩HTML、CSS、JavaScript

减少资源大小可以加快网页显示速度,所以要对HTML、CSS、JavaScript等进行代码压缩,并在服务器端设置GZip
a) 压缩(例如,多余的空格、换行符和缩进)
b) 启用GZip

无阻塞

写在HTML头部的JavaScript(无异步),和写在HTML标签中的Style会阻塞页面的渲染,因此CSS放在页面头部并使用Link方式引入,避免在HTML标签中写Style,JavaScript放在页面尾
部或使用异步方式加载

使用首屏加载

首屏的快速显示,可以大大提升用户对页面速度的感知,因此应尽量针对首屏的快速显示做优化

按需加载

将不影响首屏的资源和当前屏幕资源不用的资源放到用户需要时才加载,可以大大提升重要资源的显示速度和降低总体流量
PS:按需加载会导致大量重绘,影响渲染性能
a) LazyLoad
b) 滚屏加载
c) 通过Media Query加载

预加载

大型重资源页面(如游戏)可使用增加Loading的方法,资源加载完成后再显示页面。但Loading时间过长,会造成用户流失
对用户行为分析,可以在当前页加载下一页资源,提升速度
a) 可感知Loading(如进入空间游戏的Loading)
b) 不可感知的Loading(如提前加载下一页)

压缩图片

图片是最占流量的资源,因此尽量避免使用他,使用时选择最合适的格式(实现需求的前提下,以大小判断),合适的大小,然后使用智图压缩,同时在代码中用Srcset来按需显示
PS:过度压缩图片大小影响图片显示效果
a) 使用智图( http://zhitu.isux.us/ )
b) 使用其它方式代替图片(1. 使用CSS3 2. 使用SVG 3. 使用IconFont)
c) 使用Srcset
d) 选择合适的图片(1. webP优于JPG 2. PNG8优于GIF)
e) 选择合适的大小(1. 首次加载不大于1014KB 2. 不宽于640(基于手机屏幕一般宽度))

减少Cookie

Cookie会影响加载速度,所以静态资源域名不使用Cookie

避免重定向

重定向会影响加载速度,所以在服务器正确设置避免重定向

异步加载第三方资源

第三方资源不可控会影响页面的加载和显示,因此要异步加载第三方资源

[脚本执行优化]


处理不当会阻塞页面加载、渲染,因此在使用时需当注意
CSS写在头部,JavaScript写在尾部或异步
避免图片和iFrame等的空Src
空Src会重新加载当前页面,影响速度和效率

尽量避免重设图片大小

重设图片大小是指在页面、CSS、JavaScript等中多次重置图片大小,多次重设图片大小会引发图片的多次重绘,影响性能

图片尽量避免使用DataURL

DataURL图片没有使用图片的压缩算法文件会变大,并且要解码后再渲染,加载慢耗时长

[CSS优化]


* 尽量避免写在HTML标签中写Style属性
* 避免CSS表达式
CSS表达式的执行需跳出CSS树的渲染,因此请避免CSS表达式
* 移除空的CSS规则
空的CSS规则增加了CSS文件的大小,且影响CSS树的执行,所以需移除空的CSS规则
* 正确使用Display的属性
Display属性会影响页面的渲染,因此请合理使用
a) display:inline后不应该再使用width、height、margin、padding以及float
b) display:inline-block后不应该再使用float
c) display:block后不应该再使用vertical-align
d) display:table-*后不应该再使用margin或者float
* 不滥用Float
Float在渲染时计算量比较大,尽量减少使用
* 不滥用Web字体
Web字体需要下载,解析,重绘当前页面,尽量减少使用
* 不声明过多的Font-size
过多的Font-size引发CSS树的效率
* 值为0时不需要任何单位
为了浏览器的兼容性和性能,值为0时不要带单位
* 标准化各种浏览器前缀
a) 无前缀应放在最后
b) CSS动画只用 (-webkit- 无前缀)两种即可
c) 其它前缀为 -webkit- -moz- -ms- 无前缀 四种,(-o-Opera浏览器改用blink内核,所以淘汰)
* 避免让选择符看起来像正则表达式 高级选择器执行耗时长且不易读懂,避免使用

[JavaScript执行优化]


* 减少重绘和回流
a) 避免不必要的Dom操作
b) 尽量改变Class而不是Style,使用classList代替className
c) 避免使用document.write
d) 减少drawImage
* 缓存Dom选择与计算
每次Dom选择都要计算,缓存他
* 缓存列表.length
每次.length都要计算,用一个变量保存这个值
* 尽量使用事件代理,避免批量绑定事件
* 尽量使用ID选择器
ID选择器是最快的
* TOUCH事件优化
使用touchstart、touchend代替click,因快影响速度快。但应注意Touch响应过快,易引发误操作

[渲染优化]

* HTML使用Viewport
Viewport可以加速页面的渲染,请使用以下代码
<meta name=”viewport” content=”width=device-width, initial-scale=1″>
* 减少Dom节点
Dom节点太多影响页面的渲染,应尽量减少Dom节点
* 动画优化
a) 尽量使用CSS3动画
b) 合理使用requestAnimationFrame动画代替setTimeout
c) 适当使用Canvas动画 5个元素以内使用css动画,5个以上使用Canvas动画(iOS8可使用webGL)

* 高频事件优化
Touchmove、Scroll 事件可导致多次渲染
a) 使用requestAnimationFrame监听帧变化,使得在正确的时间进行渲染
b) 增加响应变化的时间间隔,减少重绘次数

* GPU加速
CSS中以下属性(CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video)来触发GPU渲染,请合理使用(PS:过渡使用会引发手机过耗电增加)

17.CSS动画与Canvas动画性能优劣分析

a、CSS动画更为流畅、但内存占用过高,动画元素在5个以内更为推荐;
b、Canvas动画存在丢帧现象,这一现象在android中低端手机中表现更为明显;
c、5个以内动画元素,选用CSS动画,80%的设备帧频可达80以上。

18.移动端怎么自适应?

移动自适应的话一般我用的话就是rem,通过rem单位配合媒体查询来完成几个屏幕的适配,以iphone6位标准,向上适配plus,向下适配5,不做过多的适配,有时候有要求的话也用js来控制rem的大小达到适配效果,rem是相对单位,相对html元素的font-size值的属性,比如font-size:100px; 的话1rem就得100px,这样我子需要通过改变html的font-size就可以达到适配效果

19.如何开启gpu加速?

为动画DOM元素添加CSS3样式-webkit-transform:transition3d(0,0,0)或-webkit-transform:translateZ(0);,这两个属性都会开启GPU硬件加速模式,从而让浏览器在渲染动画时从CPU转向GPU

通过-webkit-transform:transition3d/translateZ开启GPU硬件加速之后,有些时候可能会导致浏览器频繁闪烁或抖动,可以尝试以下办法解决之:
-webkit-backface-visibility:hidden;
-webkit-perspective:1000;

通过-webkit-transform:transition3d/translateZ开启GPU硬件加速的适用范围:
使用很多大尺寸图片(尤其是PNG24图)进行动画的页面。
页面有很多大尺寸图片并且进行了css缩放处理,页面可以滚动时。
使用background-size:cover设置大尺寸背景图,并且页面可以滚动时
编写大量DOM元素进行CSS3动画时(transition/transform/keyframes/absTop&Left)
使用很多PNG图片拼接成CSS Sprite时

20.物理1像素怎么实现

可以使用after插入的形式将宽度设置为200%,然后通过css transfrom 的scale 缩放0.5倍;

21.响应式布局的原理

Meta标签定义

使用 viewport meta 标签在手机浏览器上控制布局

<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1" />

通过快捷方式打开时全屏显示

<meta name="apple-mobile-web-app-capable" content="yes" />

隐藏状态栏

<meta name="apple-mobile-web-app-status-bar-style" content="blank" />
iPhone会将看起来像电话号码的数字添加电话连接,应当关闭
<meta name="format-detection" content="telephone=no" />
使用Media Queries适配对应样式

常用于布局的CSS Media Queries有以下几种:

设备类型(media type):

all所有设备;
screen 电脑显示器;
print打印用纸或打印预览视图;
handheld便携设备;
tv电视机类型的设备;
speech语意和音频盒成器;
braille盲人用点字法触觉回馈设备;
embossed盲文打印机;
projection各种投影设备;
tty使用固定密度字母栅格的媒介,比如电传打字机和终端。

设备特性(media feature):

width浏览器宽度;
height浏览器高度;
device-width设备屏幕分辨率的宽度值;
device-height设备屏幕分辨率的高度值;
orientation浏览器窗口的方向纵向还是横向,当窗口的高度值大于等于宽度时该特性值为portrait,否则为landscape;
aspect-ratio比例值,浏览器的纵横比;
device-aspect-ratio比例值,屏幕的纵横比。

设置多种视图宽度

@media only screen and (min-width:768px)and(max-width:1024px){}
@media only screen and (width:320px)and (width:768px){}

百分比布局

宽度不固定,可以使用百分比

#head{width:100%;}
#content{width:50%;}

响应式图片

#wrap img{
  max-width:100%;
  height:auto;
}

字体设置

一个响应式的字体应关联它的父容器的宽度,这样才能适应客户端屏幕。css3引入了新的单位叫做rem,和em类似但对于Html元素,rem更方便使用。em是相对于根元素的,需重置根元素字体大小:

html{font-size:100%;}

完成后,可以定义响应式字体:

@media (min-width:640px){body{font-size:1rem;}}
@media (min-width:960px){body{font-size:1.2rem;}}
@media (min-width:1200px){body{font-size:2rem;}}

22.常见dpr

ip6 2、ip6+ 3、nexus5 3

23.移动端适配

1) 自适应方式
2) viewport方式
3) rem方式
4) scale()方式缩放

24.常用meta

IE相关

避免IE使用兼容模式 <meta http-equiv="X-UA-Compatible" content="IE=edge" />
为不支持viewport的IE Mobile设定宽度 <meta name="MobileOptimized" content="320" />
是否对手持设备友好 <meta name="HandheldFriendly" content="true" />

UC浏览器

强制竖屏 <meta name="screen-orientation" content="portrait" />
强制全屏 <meta name="full-screen" content="yes" />
应用模式 <meta name="browsermode" content="application" />

X5浏览器

强制竖屏 <meta name="x5-orientation" content="portrait" />
强制全屏 <meta name="x5-fullscreen" content="yes" />
应用模式 <meta name="x5-page-mode" content="app" />

360

开启极速模式 <meta name="renderer" content="webkit" />

iphone相关

启动webapp功能 删除工具栏和菜单栏 <meta name="apple-mobile-web-app-capable" content="yes">
控制状态栏颜色 <meta name="apple-mobile-web-app-status-bar-style" content="black" />
开启号码或邮箱检测 <meta name="format-detection" content="telephone=no" />
添加主屏幕icon <link rel="apple-touch-icon" href="touch-icon-iphone.png”>

25.html5的新api

重力感应 DeviceOrientation
手机加速传感器 DeviceMotion

history 详细

以Pjax方式实现SPA history.pushState history.replaceState 解决ajax不能后退前进问题
储存
客户端储存:localStorage sessionStorage>只存在一个会话周期内
跨域
postMessage

26.你们怎么嵌套h5页面的

一般都是我前端这边开发好h5页面给安卓和ios一个地址,然后告诉他们我有哪些方法,然后在做一些安卓ios的接口调用,安卓和ios会吧他们的方法提供一个接口给我,我直接调用就好,一般都是调用一些分享,跳转之类的方法

27.webapp你主要做的是哪个模块,是页面布局做的多还是交互做的多

webapp部分基本都是我自己负责开发,页面交互都做,因为当时刚去公司的时候公司也刚往这个方向发展,让我也一直就负责移动业务这块的内容

28.bootstrap用吗?

用,bootstrap组要就是用一些他的样式组件,还有最强大的就是他的删格化系统了,做响应式的网站,我们公司的官网就是用的bootstrap做的,后台管理系统也是,当时也是我负责给我们公司的后台分享如何使用bootstrap的

章先介绍一些HTML最基础的考点,很多大长面试官喜欢由浅入深地考察知识。而对于一些基础问题的回答,很多同学反而因组织不好语言而给面试官留下不好的印象。本章节我们就带大家一一整理和回顾。

1.1 DOCTYPE的作用

面试官:我们现在写HTML代码第一行通常是 !<DOCTYPE HTML>,请介绍一下DOCTYPE的作用(基础题)

DOCTYPE标签是一种标准通用标记语言的文档类型声明,且必须声明在文档的第一行,来告知浏览器用何种文档标准来解析这个网页,不同的渲染模式会影响浏览器对CSS和JavaScript的解析标准。

面试官:浏览器解析文档有哪几种解析模式呢?(拓展题)

文档的解析模式目前主要有 *两种(注意:还有一种“准标准模式”只在IE8浏览器里,目前主流浏览器已无需考虑):

  1. 怪异模式(quirks mode):此种模式会模拟更旧的浏览器的行为。如果没有声明DOCTYPE,浏览器默认会以这种模式解析文档。
  2. 标准模式(standards mode):浏览器使用W3C的标准解析渲染页面。

面试官:如何快速检查页面的解析模式?(发散题)

HTML文档对象有个 compatMode 属性,用于记录页面的解析模式:

  • 如果文档处于“混杂模式”,则该属性值为 BackCompat
  • 如果文档处于“标准模式”或者“准标准模式(almost standards mode)”,则该属性为 CSS1Compat
const mode = document.compatMode; // 页面的解析模式
if (mode === "BackCompat") {
  // 渲染模式为混杂模式
}

1.2 HTML的语义化

面试官:什么是HTML语义化,语义化的作用是什么?(基础题)

语义化是指使用恰当语义的html标签,让页面具有良好的结构与含义;比如<p>标签就代表段落,<article>代表正文内容等等。语义化的作用有两点:

  • 开发者友好:使用语义类标签增强代码的可读性,开发者也能够清晰地看出网页的结构,易维护;
  • 机器友好:带有语义的标签适合搜索引擎的爬虫爬取有效信息,能快速生成网页骨架或文章提纲,SEO友好。

面试官:你平时有哪些语义化的建议或最佳实践?(发散题)

根据语义化的优点,对于富文本内容类的网站(如门户、新闻网站),语义化利于SEO,对网站内容的传播有很大帮助,此类网站应该重视和实践语义化标准。而对于一些系统类网站的搭建,语义化就没有那没重要了,甚至刻意做语义化反而会影响开发者的效率,此类网站可以对页面骨架做语义化,至于模块的交互组件和表单等则无需刻意做语义化。

1.3 HTML5新增内容考察

面试官:你知道HTML5有哪些新增的东西吗?(基础题)

HTML5新增的内容确实不少,面试官不会要求你全部记下来,我们可以挑重要的东西来回答:

  • 新的文档解析顺序:不再基于 *SGML;
  • 全面支持CSS3:
  • 加了一些语义化元素:<header><mainer><footer><section><nav>
  • 删了一些样式类元素:<font><big><center>
  • 表单能力加强:<input>的新类型(date、email、url等)、新属性(autocomplete、autofocus等)
  • 新的属性:ping(用于a与area)、charset(用于meta)、async(用于script)等
  • 定位能力:navigator.geolocation
  • 多媒体支持:<video>(视频)、<audio>(音频)等
  • 2D/3D 制图支持:支持svg、canvas绘图和动画等
  • 新的缓存策略:Localstorage、SessionStorage、IndexedDB等
  • 新的网络协议:WebSocket
  • 新的跨域通信方案:XHTMLHttpRequest2、PostMessage......

拓展:什么是SGML

  • SGML 即Standard Globalized Markup Language 是用来定义标准的标记语言,简单的说,就是定义文档的元语言。
  • HTML 是基于SGML 的超链接语言,可以用于创建Web页面。在DTD 内部定义了标签的规则,DTD就是使用SGML 语言创建的。
  • HTML5不是基于SGML 语言的,因此不需要DTD ,它是一种全新的标记语言,有自己的解析规则,HTML5的语法规则与之前版本有很大的差别,可以称的上是一种全新的语言

1.4 meta标签

面试官:介绍一下<meta>标签的用途 (基础题)

meta标签由namecontent两个属性来定义,来描述一个HTML网页文档的元信息,例如作者、日期和时间、网页描述、关键词、页面刷新等,除了一些http标准规定了一些name作为大家使用的共识,开发者也可以自定义name

面试官:移动端适配的viewpoint,能否手写一下?(拓展题)

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

1.5 src和href的区别

面试官:介绍一下srchref的区别(基础题)

  • src是指向外部资源的位置,指向的内容会嵌入到文档中当前标签所在的位置,在请求src资源时会将其指向的资源下载并应用到文档内,如JS脚本,img图片和frame等元素。当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,所以一般JS脚本会放在底部而不是头部。

  • href是指向网络资源所在位置(的超链接),用来建立和当前元素或文档之间的连接,当浏览器识别到它他指向的文件时,就会并行下载资源,不会停止对当前文档的处理

1.6 img标签的srcset

面试官:介绍一下<img>标签的srcsetsizes属性的作用(基础题)

可以设计响应式图片,我们可以使用两个新的属性srcsetsizes来提供更多额外的资源图像和提示,帮助浏览器选择正确的一个资源

  • srcset 定义了我们允许浏览器选择的图像集,以及每个图像的大小

  • sizes 定义了一组媒体条件(例如屏幕宽度)并且指明当某些媒体条件为真时,什么样的图片尺寸是最佳选择

所以,有了这些属性,浏览器会:

  • 查看设备宽度
  • 检查 sizes 列表中哪个媒体条件是第一个为真
  • 查看给予该媒体查询的槽大小
  • 加载 srcset 列表中引用的最接近所选的槽大小的图像
  • srcset提供了根据屏幕条件选取图片的能力
<img src="clock-demo-thumb-200.png"
     alt="Clock"
     srcset="clock-demo-thumb-200.png 200w, clock-demo-thumb-400.png 400w"
     sizes="(min-width: 600px) 200px, 50vw"
/>

1.7 script标签的defer和async

面试官:介绍一下<script>标签的deferasync的作用(基础题)

  • defer:浏览器指示脚本在文档被解析后执行,<script>被异步加载后并不会立刻执行,而是等待文档被解析完毕后执行

  • async:同样是异步加载脚本,区别是脚本加载完毕后立即执行,这导致async属性下的脚本是乱序的,对于<script>有先后依赖关系的情况,并不适用

    如下图:蓝色线代表网络读取,红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析

1.8 前端数据存储的方式

面试官:前端有哪几种数据存储方式?(基础题)

主要的存储方式有Cookie、LocalStorage、SessionStorage、IndexedDB、WebSQL,它们的优缺点如下:

  • Cookie:在HTML5标准前本地储存的主要方式
    • 优点是兼容性好,请求头自带cookie方便可以和服务端进行交互
    • 缺点是大小只有4k,请求头携带cookie浪费流量,每个domain限制20个cookie,JS无法直接操作,需要自行封装
  • LocalStorage:以键值对为标准的数据存储方式
    • 优点是操作方便,永久性储存(除非手动删除)大小为5M
    • 缺点是兼容IE8+
  • SessionStorage:与localStorage基本类似,区别是**sessionStorage当页面关闭后会被清理
    • 优点是会话级随存随取,不占用本地空间,操作方便
    • 缺点是不能在所有同源窗口中共享,是会话级别的储存方式,兼容IE8+
  • IndexedDB:是被正式纳入HTML5标准的数据库储存方案,它是NoSQL数据库,用键值对进行储存,可以进行快速读取操作
    • 优点是存储量更大,非常适合web场景,同时支持JS进行操作,非常方便
    • 缺点是兼容性IE8+
  • WebSQL:类似SQLite,是真正意义上的关系型数据库,用sql进行操作
    • 优点是关系型数据库,适合大型的离线web应用
    • 缺点是JS需要通过transaction操作sql,火狐浏览器不支持

拓展:如何操作webSql

// WebSql操作实例
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
var msg;

// 建表 => 插入 => 删除
db.transaction(function (tx) {
  tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
  tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "菜鸟教程")');
  tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "www.runoob.com")');
  tx.executeSql('DELETE FROM LOGS  WHERE id=1');
  msg = '<p>数据表已创建,且插入了两条数据,然后又删除了第一条。</p>';
  document.querySelector('#status').innerHTML =  msg;
});

1.9 WebSocket考点

面试官:介绍一下webSocket的特点和作用(基础题)

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。它允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送

本文由博客一文多发平台 OpenWrite 发布!

venBridge 集成概述

EventBridge 是阿里云所推出了一款无服务器事件总线,其目标是拓展事件生态,打破系统间的数据孤岛,建立事件集成生态。提供统一的事件标准化接入及管理能力,完善集成与被集成通路,帮助客户快速实现事件驱动的核心原子功能,可将 EventBridge 快速集成至 BPM、RPA、CRM 等系统。

EventBridge 通过事件标准化,接入标准化,组件标准化三个方向作为支点拓展 EventBridge 事件生态:

  • 事件标准化:拥抱 CloudEvents 1.0 开源社区标准协议,原生支持 CloudEvents 社区 SDK 和 API,全面拥抱开源社区事件标准生态;
  • 接入标准化:提供标准事件推送协议 PutEvent,并支持 Pull 和 Push 两种事件接入模型,可有效降低事件接入难度,提供云上完善的事件接入标准化流程;
  • 组件标准化:封装标准的事件下游组件工具链体系,包括 Schema 注册、事件分析、事件检索、事件仪表盘等。提供完善的事件工具链生态。

在集成领域 EventBridge 重点打造事件集成和数据集成两类核心场景,下面将围绕这两类场景具体展开描述。

事件集成

目前 EventBridge 已经拥有 80+ 云产品的事件源,800+ 种事件类型。整个事件生态还正在逐步丰富中。

那么,EventBridge 如何实现云产品的事件集成呢?

  • 首先在 EventBridge 控制台可以看见一个名为 default 的事件总线,云产品的事件都会投递到这个总线;

  • 然后点击创建规则,就可以选择所关心的云产品以及它的相关事件进行事件的监听和投递。

下面以两个例子为例,来看下 EventBridge 事件集成的方式。

OSS 事件集成

以 OSS 事件源为例,来讲解一下如何集成 OSS 事件。

OSS 事件现在主要分为 4 类,操作审计相关、云监控相关、配置审计相关、以及云产品相关的事件例如 PutObject 上传文件等等。其他的云产品的事件源也类似,基本都可以分为这几个类型的事件。

下面演示一下事件驱动的在线文件解压服务:

  • 在 OSS Bucket 下面会有一个 zip 文件夹存放需要解压的文件,一个 unzip 文件夹存放解压后的文件;
  • 当上传文件到 OSS Bucket 之后,会触发文件上传的事件并投递到 EventBridge 的云服务专用总线;
  • 然后会使用一个事件规则过滤 zip 这个 bucket 的事件并投递到解压服务的 HTTP Endpoint;
  • 解压服务会在收到事件之后,根据事件里面的文件路径从 OSS 下载文件解压,并在解压之后将文件传到 unzip 目录下;
  • 同时,还会有一个事件规则,监听 unzip 目录的文件上传事件,并将事件转换后推送到钉钉群。

一起来看下是如何实现的:

前往下方链接查看视频:https://www.bilibili.com/video/BV1s44y1g7dk/

1)首先创建一个 bucket,下面有一个 zip 目录用于存放上传的压缩文件,一个 unzip 目录用于存放解压后的文件。

2) 部署解压服务,并且暴露公网访问的地址。

解压服务的源码地址为:

https://github.com/AliyunContainerService/serverless-k8s-examples/tree/master/oss-unzip?spm=a2c6h.12873639.article-detail.15.5a585d52apSWbk

也可以使用 ASK 直接部署,yaml 文件地址为:

https://github.com/AliyunContainerService/serverless-k8s-examples/blob/master/oss-unzip/hack/oss-unzip.yaml

3)创建一个事件规则监听 zip 目录下的上传文件的事件,并投递到解压服务的 HTTP Endpoint。

这里使用 subject,匹配 zip 目录。

4)再创建一个事件规则监听 unzip 目录的事件,投递解压事件到钉钉群。

这里同样使用 subject,匹配 unzip 目录。

对于变量和模板的配置可以参考官方文档 :

https://help.aliyun.com/document_detail/181429.html

EventBridge 会通过 JSONPath 的方式从事件中提取参数,然后把这些值放到变量中,最后通过模板的定义渲染出最终的输出投递到事件目标。OSS 事件源的事件格式也可以参考官方文档 :

https://help.aliyun.com/document_detail/205739.html#section-g8i-7p9-xpk ,并根据实际的业务需要使用 JSONPath 定义变量。5)最后,通过 oss 控制台上传一个文件进行验证。

可以看到刚刚上传的 eventbridge.zip 已经解压到并上传上来了,也可以在钉钉群里面,收到解压完成的通知。此外,还可以在事件追踪这边查看事件的内容已经投递的轨迹。

可以看到有两个上传事件:一个是通过控制台上传的事件,一个是解压文件后上传的事件。

可以查看轨迹,都成功投递到了解压服务的 HTTP Endpoint 以及钉钉机器人。

以自定义事件源以及云产品事件目标的方式集成云产品

刚才演示的 demo 是集成云服务的事件源,下面再通过一个 demo 看一下如何通过以自定义事件源以及云产品事件目标的方式集成云产品。

前往下方链接查看视频:https://www.bilibili.com/video/BV1QF411M7xv/

这个 demo 的最终效果是通过 EventBridge 自动进行数据的清洗,并投递到 RDS 中去。事件内容是一个 JSON,拥有两个字段一个名字一个年龄,现在希望将把大于 10 岁的用户过滤出来并存储到 RDS 中。

整体的架构如图所示,使用一个 MNS Queue 作为自定义事件源,并通过 EventBridge 过滤并转换事件最终直接输出到 RDS 中去。

1)首先已经创建好了一个 MNS Queue,创建好一个 RDS 实例以及数据库表,表结构如下所示:

2)创建一个自定事件总线,选择事件提供方为 MNS,队列为提前创建好的队列;

创建好了之后,我们就可以在事件源这里看见一个已经正在运行中的事件源;

3)接下来创建规则投递到 RDS

配置的事件模式内容如下:

{
    "source": [
        "my.user"
    ],
    "data": {
        "messageBody": {
            "age": [
                {
                    "numeric": [
                        ">",
                        10
                    ]
                }
            ]
        }
    }
}

数值匹配可以参考官方文档:https://help.aliyun.com/document_detail/181432.html#section-dgh-5cq-w6c

4) 点击下一步,选择事件目标为数据库,填写数据库信息,配置转化规则,完成创建。

5)最后,先用 MNS Queue 发送一个消息,这个的 age 是大于 10 的。

可以看见这条事件就输出到了 RDS 里面了。

下面再发一个小于 10 的消息到 MNS Queue。

这条事件就被过滤掉了,没有输出到 RDS。

也可通过事件追踪查看事件:

可以看到一条事件成功投递到了 RDS,一条事件被过滤掉了,没有进行投递。

数据集成

事件流是 EventBridge 为数据集成提供的一个更为轻量化、实时的端到端的事件流试的通道,主要目标是将事件在两个端点之间进行数据同步,同时提供过滤和转换的功能。目前已经支持阿里云各消息产品之间的事件流转。

不同于事件总线模型,在事件流中,并不需要事件总线,其 1:1 的模型更加的轻量,直接到目标的方式也让事件更加的实时;通过事件流,我们可以实现不同系统之间的协议转换,数据同步,跨地域备份的能力。


下面将通过一个例子讲解如何使用事件流,将 RocketMQ 的消息路由到 MNS Queue,将两个产品集成起来。

整体的结构如图所示,通过EventBridge 将 RocketMQ 中 TAG 为 MNS 的消息路由到 MNQ Queue。

一起看下怎么实现:

前往下方链接查看视频:https://www.bilibili.com/video/BV1D44y1G7GK/

  • 首先创建一个事件流,选择源 RocketMQ 实例,填写 Tag 为 mns。

  • 事件模式内容留空表示匹配所有。

  • 目标选择 MNS,选择目标队列完成创建。

  • 完成创建之后,点击启动,启动事件流任务。

事件流启动完成之后,我们就可以通过控制台或者 SDK 发送消息到源 RocketMQ Topic 里面。当有 Tag 为 mns 的时候,我们可以看见消息路由到了 mns;当有 Tag 不为 mns 的时候,消息就不会路由到 mns。

总结

本篇文章主要向大家分享了通过 EventBridge 如何集成云产品事件源,如何集成云产品事件目标以及通过事件流如何集成消息产品~

作者:李凯(凯易)

原文链接:http://click.aliyun.com/m/1000337391/

本文为阿里云原创内容,未经允许不得转载。