CDN(Content Delivery Network, 内容分发网络) 是指一种通过互联网互相连接的电脑网络系统,利用最靠近每位用户的服务器,更快、更可靠地将音乐、图片、视频、应用程序以及其他文件发送给用户,来提供高性能、可扩展性及低成本的网络内容传递给用户。
CDN的作用
(1) 在性能方法,引入CDN的作用在于
(2) 在安全方面,CDN有助于防御DDos、MITM等网络攻击
除此之外,CDN作为一种基础的云服务,同样具有资源托管、按需扩展(能够应对流量高峰) 等方面的优势。
回流与重绘的概念及触发条件
(1) 回流
当渲染树种部分或者全部元素的尺寸、构造或者属性发生变化时,浏览器会重新渲染部分或者全部
文档的过程就称为回流。下面这些操作会导致回流:
在触发回流的时候,由于浏览器渲染页面是基于流式布局,所以当触发回流时,会导致周围的DOM元素重新排列,它的影响范围有两种:
全局范围:从根节点开始,对整个渲染树进行重新布局
局部范围:对渲染树的某部分或者一个渲染对象进行重新布局
(2) 重绘
当页面中某些元素的样式发生变化,但是不会影响其在文档流中的位置时,浏览器就会对元素进行重新绘制,这个过程就是重绘。下面这些操作会导致回流:
color、background相关属性:background-image等
outline相关属性:outline-color outline-width text-decoration
border-radius、visibility、 box-shadow
注意:当触发回流时,一定会触发重绘,但是重绘不一定会引发回流
操作DOM时,尽量在低层级的DOM节点进行操作
不要使用table布局,一个小的改动可能会使整个table进行重新布局
使用CSS的表达式
不要频繁操作DOM,可以创建一个文档片段documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档这种
将元素先设置display:none 操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM的操作不会引发回流和重绘
将DOM的多个读操作(或者写操作)放在一起,而不是读写操作穿件插着写。这得益于浏览器的渲染队列机制。
浏览器针对页面的回流与重绘,进行了自身的优化--渲染队列
浏览器会将所有的回流、重绘的操作放在一个队列中,当队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会对队列进行批处理。这样就会让多次的回流、重绘变成一次回流重绘。
如何优化动画
对于如何优化动画,我们知道,一般情况下。动画需要频繁的操作DOM,就会导致页面的性能问题,我们可以将动画的position属性设置为absolute或者fixed,将动画脱离文档流,这样他的回流就不会影响到页面了
documentFragment是什么?用它跟直接操作DOM的区别是什么?
当我们把一个DocumentFRagment节点插入文档树时,插入的不是DocumentFragment自身,而是它的所有子孙节点。在频繁的DOM操作时,我们就可以将DOM元素插入DocumentFragment,之后一次性的将所有的子孙节点插入文档中,和直接操作DOM相比,将DocumentFragment节点插入DOM树时,不会触发页面的重绘,这样就大大提高了页面的性能。
对节流与防抖的理解
防抖节流函数的应用场景
防抖
节流
实现节流函数和防抖函数
函数防抖的实现
函数节流的实现
防抖+节流
防抖有时候因为触发太过频繁, 导致一次响应都没有。所以希望固定的事件必定给用户一个响应,于是就有了防抖+节点的操作
如何对项目中的图片进行优化
不用图片。很多时候会使用很多修饰类图片,其实这类修饰图片完全可以用CSS去代替
对于移动端来说,屏幕宽度就那么点,完全没有必要去加载原图浪费带宽。一般图片都用CDN加载,可以计算出适配屏幕的宽度,然后去请求相应裁剪好的图片。
小图使用base64格式
将多个图标文件整合到一张图片中(雪碧图)
选择正确的图片格式:
对于能够显示WebP格式的浏览器尽量使用WebP格式。因为WebP格式具有更好的图像压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量,缺点就是兼容性并不好
小图使用PNG其实对于大部分图标这类图片,完全可以使用SVG代替
照片使用JPEG
如何提高webpack的打包速度
优化Loader
对于Loader来说,影响打包效率首当其冲必属Babel。因为Babel会将代码转为字符串生成AST,然后对AST继续进行转变最后再生成新的代码,代码越大,转换代码越多,效率就越低。
首先我们优化Loader的文件搜索范围
对于Babel来说,希望只作用在JS代码上的,然后node_modules中使用的代码都是编译过的,所以完全没有必要再去处理一遍。
当然这样做还不够,还可以将Babel编译过的文件缓存起来,下次只需要编译更改过的代码文件即可,这样可以大幅度加快打包时间
HappyPack
受限于Node是单线程运行的,所以Webpack在打包的过程中也是单线程的,特别是在执行Loader的时候,长时间编译的任务很多,这样就会导致等待的情况。
HappyPack 可以将Lader的同步执行转换为并行的,这样就能充分利用系统资源来加快打包效率了
DIIPlugin
DIIPligin 可以将特定的类库提前打包然后引入。这种方式可以极大的减少打包类库的次数,只有当类库更新版本才有需要重新打包,并且也实现了将公共代码抽离成单独文件的优化方案。DIIPlugin的使用方法如下:
然后需要执行这个配置文件生成依赖文件,接下来需要使用DllReferencePlugin将依赖文件引入项目中
代码压缩
在webpack3中,一般使用UglifyJS来压缩代码,但是这个是单线运行的,为了加快效率,可以使用webpack-parllel-uglify-plugin来并行运行UglifyJS,从而提高效率。
在webpack4中,不需要以上这些操作了,只需要将mode设置为production就可以默认开始以上功能。代码压缩也是我们必做的性能优化方案,当然我们不止可以压缩JS代码,还可以压缩HTML、CSS代码,并且在压缩JS代码的过程中,我们还可以通过配置实现比如删除console.log这类代码的功能。
其他
可以通过一些小的优化点来加快打包速度
resolve.extensions: 用来表面文件后缀列表,默认查找顺序是['.js','.json'], 如果你的导入文件没有添加后缀就会按照这顺序查找文件。我们应该尽可能减少后缀列表长度,然后将出现频率高德后缀排在前面
resolve.alias: 可以通过别名的方式来映射一个路径,能让Webpack更快找到路径
module.noParse: 如果你确定一个文件下没有其他依赖,就可以使用该属性让Webpack不扫描该文件,这种方式对于大型的类库很有帮助
如何减少Webpack打包体积
在开发SPA项目的时候,项目中都会存在很多路由界面。如果将这些页面全部打包进一个JS文件的话,虽然将 多个请求合并了,但是同样也加载了很多并不需要的代码,耗费了更长的时间。那么为了页面能更快地呈现给用户,希望首页能加载的文件体积越小越好,这时候就可以按需加载,将每个路由页面单独打包为一个文件。当然不仅仅路由可以按需加载,对于loadash这种大型类型同样可以使用这个功能。
按需加载的代码实现这里就不详细展开了,因为鉴于用的框架不同,实现起来都是不一样的。当然了,虽然他们的用法可能不同,但是底层的机制都是一样的。都是当使用的时候再去下载对应文件,返回一个Promise,当Promise成功以后执行回调。
Scope Hoisting 会分析出模板之间的依赖关系,尽可能的把打包出来的模块合并到一个函数中去。
如果在webpack4中你希望开启这个功能,只需要启用optimization.concatenateMudules 就可以了
Tree Shaking
Tree Shaking 可以实现删除项目中未被引用的代码,比如:
对于以上情况, test 文件中的变量b如果没有在项目中使用到的话,就不会被打包到文件中。如果使用Webpack4的话,开启生产环境就会自动启动这个优化功能。
如何用webpack来优化前端性能?
用webpack优化前端性能是值优化webpack的输出结果,让打包的最终结果在浏览器运行快速高校
如何提高webpack的构建速度