前端面试题1234

一、FOUC 是什么


 FOUC即无样式内容闪烁,也可以称为文档样式短暂失效,主要就是指HTML已加载而样式表并未加载,此后样式表再加载而产生的闪烁现象。

  在引用css的过程中,如果方法不当或者位置引用不对,会导致某些页面在windows下的ie出现一些奇怪的现象,以无样式显示页面内容的瞬间闪烁,这种现象称之为文档样式短暂失效,简称FOCU

  原因分析:当样式表晚于结构性 html 加载,当加载到此样式表时,页面将停止之前的渲染。 此样式表被下载和解析后,将重新渲染页面,也就出现了短暂的花屏现象。

二、如何避免FOUC


1、样式表前置

  根据浏览器渲染的顺序,将CSS在<head>中引入或者嵌入,相对于将CSS放到<body>或者页面底部来说,可以使页面渲染速度加快,这对于页面内容比较丰富的网站或者网络链接较慢时相当重要。

  假如将样式表放置于底部,就会导致浏览器还未加载样式表就开始渲染页面,无法渐进式渲染页面而直接从无样式状态立即跳转到有样式状态,就会造成FOUC,用户体验较差;

  此外有些浏览器可能会在CSS下载完成后才开始渲染页面,样式表放在下方会导致页面渲染推迟。

2、尽量使用<link>而避免使用@import

  当HTML文件被加载时,<link>引用的文件会同时被加载,而@import引用的文件则会等页面全部下载完毕再被加载,所以有时候浏览@import加载CSS的页面时会没有样式,会出现FOUC现象,网速慢的时候就比较明显。

  此外当<link>与@import混用可能会对网页性能有负面影响,在一些低版本IE中<link>与@import混用会导致样式表文件逐个加载,破坏并行下载的方式导致页面加载变慢。

  此外无论是哪种浏览器,若在<link>中引入的CSS中继续使用@import加载外部CSS,同样会导致顺序加载而不是并行加载,因为浏览器需要先解析<link>引入的CSS发现@import外部CSS后再次引入外部CSS,这样就导致页面加载变慢。

2,link 和 @import 的区别是

差别1:

本质的差别:link 属于 XHTML 标签,而 @import 完全是 CSS 提供的一种方式。

差别 2:

加载顺序的差别: 当一个页面被加载的时候(就是被浏览者浏览的时候) ,link 引用的 CSS 会同时被加载,而 @import 引用的 CSS 会等到页面全部被下载完再被加载。所以有时候浏览 @import 加载 CSS 的页面时开始会没有样式(就是闪烁),网速慢的时候还挺明显。

差别 3:

兼容性的差别: @import 是 CSS2.1 提出的,所以老的浏览器不支持,@import 只有在 IE5 以上的才能识别,而 link 标签无此问题。

差别 4:

使用 dom(document object model文档对象模型 )控制样式时的差别:当使用 javascript 控制 dom 去改变样式的时候,只能使用 link 标签,因为@import 不是 dom 可以控制的。

三,flux的理解

     Flux同React一样, 都是出自Facebook。Flux的核心思想是利用单向数据流和逻辑单向流来应对MVC架构中出现状态混乱的问题。

        Flux由3部分组成:Dispatcher、Store和View。其中, Dispatcher(分发器) 用于分发事件; Store用于存储应用状态, 同时响应事件并更新数据; View表示视图层, 订阅来自Store的数据, 渲染到页面。

        Flux的核心是单向数据流, 其运作方式是:

                Action ->Dispatcher ->Store ->View

        整个流程如下:

        (1) 创建Action(提供给Dispatcher) 。

        (2) 用户在View层交互(比如单击事件) 去触发Action。

        (3) Dispatcher收到Action, 要求Store进行相应的更新。

        (4) Store更新, 通知View去更新。

        (5) View收到通知, 更新页面。

从上面的流程可以得知, Flux中的数据流向是单向的, 不会发生双向流动的情况, 从而保证了数据流向的清晰脉络。而MVC和MV VM中数据的流向是可以双向的, 状态在Model和View之间来回“震荡”, 很难追踪和预测数据的变化。

深入Flux

         1、Dispatcher简介

             Dispatcher是Flux中的核心概念,它是一个调度中心,管理着所有的数据,所有事件通过它来分发。Dispatcher处理Action(动作)的分发,维护Store之间的依赖关系,负责处理View和Store之间建立Action传递。

        Dispatcher用于将Action分发给Store注册的回调函数,它与普通的发布-订阅模式(pub-sub)有两点不同:

        (1)回调函数不是订阅到某一个特定的事件或频道,每个动作会分发给所有注册的回调函数

        (2)回调函数可以指定在其他回调函数之后调用

        Dispatcher通常是应用级单例,一个应用中只需要一个Dispatcher即可

        2、Action简介

        Action 可以看作是一个交互动作, 改变应用状态或View的更新, 都需要通过触发Act n来实现。Action执行的结果就是调用了Dispatcher来处理相应的事情。Action是所有交互的入口, 改变应用的状态或者有View需要更新时就需要通过Action实现。

Action是一个JavaScript对象, 用来描述一个行为, 里面包含了相关的信息。

       3、Store和View简介

        Store包含应用状态和逻辑, 不同的Store管理不同的应用状态。Store负责保存数据和定义修改数据的逻辑,同时调用Dispatcher的register()方法将自己设为监听器。每当发起一个Action(动作)去触发Dispatcher,Store的监听器就会被调用, 用于执行是否更新数据的操作。 如果更新了, 那么View中将获得最新的状态并更新。

Store在Flux中的特性是, 管理应用所有的数据; 只对外暴露getter方法, 用于获取Store的数据, 而没有暴露setter方法, 这就意味着不能通过Store去修改数据。如果要改Store的数据, 必须通过Action动作去触发Dispatcher实现。

只要Store发生变更,它就会使用emit()方法通知View更新并展示新的数据。

Flux的缺点

        Flux的缺陷主要体现在增加了项目的代码量, 使用Flux会让项目带入大量的概念和文件;单元测试难以进行, 在Flux中, 组件依赖Store等其他依赖, 使得编写单元测试非常复杂。

Flux架构总结

        Flux是一种架构模式, 它的出现可以说是MVC的“替代方案”, 它是于复杂应用中数据流管理的一种方案。

        Flux的核心思想是“单向数据流”, 加之其“中心化控制”特点得以让题据改支源头变得可控, Flux架构追踪数据改变的复杂程度相对于MVC简单许多;Flux让View保持高度整洁, 无须关注太多逻辑, 只需关注传入的数据;Flux的Action提高了系统抽象的程度,对于用户来说,它仅仅就是一个动作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值