美文网首页vue面试题前端面试
第二十一天web前端面试题

第二十一天web前端面试题

作者: 小程要谦虚 | 来源:发表于2019-07-31 23:48 被阅读17次

    1,手写promise封装axios

    2,如何解决回调地狱

    首先回调地狱是什么?函数作为参数层层嵌套

    什么是回调函数(一个函数作为参数需要依赖另一个函数执行调用)

    一、拆解function

    function拆分的方式其实仅仅只是拆分代码块,时常会不利于后续维护;

    二、事件发布/监听模式

    发布者订阅者模式是通过保存事件,然后在需要使用的时候直接发布事件,就可以触发保存的回调

    事件发布/监听方式模糊了异步方法之间的流程关系;

    三、Promise

    Promise虽然使得多个嵌套的异步调用能够通过链式的API进行操作,但是过多的then也增加了代码的冗余,也对阅读代码中各阶段的异步任务产生了一定干扰;

    四、Generator

    通过generator虽然能提供较好的语法结构,但是毕竟generator与yield的语境用在这里多少还有些不太贴切。

    五、async/await

    所以就有了async/await语法糖

    内容详细

    3,请详解移动端点透发生场景、原因及解决方案(最优)

    发生场景总结如下:

    1,A/B两个层上下z轴重叠(上下重叠,A盖着B)。

    2,上层的A点击后消失或移开。(这一点很重要)

    3,B元素本身有默认click事件(如a标签) 或 B绑定了click事件。

    原因:

    点透问题出现的原因就是因为我们上边说过的移动端click事件300ms延迟问题,当点击上层元素时,先触发touchstart事件,然后在300ms后会触发click事件,而此时上层元素已经消失,所以下边的元素会触发click事件,这就是点透

    解决方案:

    1,fastclick.js

    fastclick.js既然可以解决click300ms延迟,那必然可以解决点透问题,使用方法如上文所述。

    2,对于B元素本身存在默认click事件的情况,使用touchend代替touchstart事件并阻止掉时A元素touchend的默认行为preventDefault(),因为触发touchend需要200ms,从而阻止click事件的产生。

    3,使用一个(透明)遮罩层,屏蔽所有事件,然后400ms(对于IOS来说是个理想值)后自动隐藏

    4,延迟一定的时间(300ms+)来处理事件

    5,直接使用click事件,不考虑延迟问题

    6,下层避开click事件,如a链接改为span等标签,使用js跳转页面

    4,详述前端性能优化的手段

    我只是总结小点,详细见网址

    一、页面级优化

    1,减少 HTTP请求数  

    主要途径包括:(1). 从设计实现层面简化页面 (2). 合理设置 HTTP缓存 (3). 资源合并与压缩 (4). CSS Sprites (5). Inline Images

    2. 将外部脚本置底(将脚本内容在页面信息内容加载后再加载)

    3. 异步执行 inline脚本(其实原理和上面是一样,保证脚本在页面内容后面加载。)

    4. Lazy Load Javascript(只有在需要加载的时候加载,在一般情况下并不加载信息内容。)

    5. 将 CSS放在 HEAD中

    6. 避免重复的资源请求

    5,浏览器输入网址回车发生了什么

    1,当发送一个 URL 请求时,不管这个 URL 是 Web 页面的 URL 还是 Web 页面上每个资源的 URL,

    浏览器都会开启一个线程来处理这个请求,同时在远程 DNS 服务器上启动一个 DNS 查询。这能使浏览

    器获得请求对应的 IP 地址。

    2,浏览器与远程 Web 服务器通过 TCP 三次握手协商来建立一个 TCP/IP 连接。

    第一次握手: 建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;

    第二次握手: 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

    第三次握手: 客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

    该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在 浏览器和服务器之间传递。该握手首先由客户端

    尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。

    一旦 TCP/IP 连接建立,浏览器会通过该连接向远程服务器发送 HTTP 的 GET 请求。远程服务器找

    3,到资源并使用 HTTP 响应返回该资源,值为 200 的 HTTP 响应状态表示一个正确的响应。

    4/此时,Web 服务器提供资源服务,客户端开始下载资源。

    6,页面的渲染过程

    1,用户输入url地址,浏览器根据域名寻找IP地址

    2,浏览器向服务器发送http请求,如果服务器段返回以301之类的重定向,浏览器根据相应头中的location再次发送请求

    3,服务器端接受请求,处理请求生成html代码,返回给浏览器,这时的html页面代码可能是经过压缩的

    4,浏览器接收服务器响应结果,如果有压缩则首先进行解压处理,紧接着就是页面解析渲染

      解析渲染该过程主要分为以下步骤:

            1,解析HTML

            2,构建DOM树

            3,DOM树与CSS样式进行附着构造呈现树

            4,布局

            5,绘制

    7,列举你知道的浏览器内核

    IE浏览器 :Trident内核

    Firefox(火狐浏览器):Gecko内核

    Safari(苹果浏览器): Webkit内核

    Chrome/opera:Blink内核:是基于Webkit内核的子项目

    8,如何优化SPA首屏加载慢的问题

    1、安装动态懒加载所需插件

    babel-plugin-syntax-dynamic-import

    配置/laravel/.babelrc

    {

      "plugins": ["syntax-dynamic-import"]

    }

    2、去掉.extract()

    它包含需要编译的文件类型,现在vue等静态资源从CDN加速

    3,配置output输出形式

    chunkFilename: 'js/chunk/[name].js?v=[chunkHash]'

    4、配置externals

    它所包含的文件类型将被排除,避免不必要的静态资源包含进来,导致编译出的文件过大

    5、在首页HTML挂载点之前引入静态资源CDN

    6、配置vue路由

    由require()方式修改为() => import()方式

    { path: '/home/wx/auth', component: () => import ('./views/home/wx/Auth')},

    相关文章

      网友评论

        本文标题:第二十一天web前端面试题

        本文链接:https://www.haomeiwen.com/subject/izkxdctx.html