前端面经 前端优化

news2024/11/25 2:35:53

前端面经 前端优化

文章目录

  • 前端面经 前端优化
    • HTTP/2 Web优化最佳实践
      • DNS与解析
        • 如何使用
      • CDN分发
    • 缓存策略
    • 页面渲染优化
      • 避免CSS、JS阻塞
        • CSS阻塞
        • JS的阻塞
        • 改变JS阻塞的方式
      • 使用字体图标iconfont代替图片图标
      • 降低CSS选择器的复杂性
      • 减少重绘和回流
        • 如何避免
      • 图片资源优化
    • Webpack优化

降低请求量:合并资源,减少 HTTP 请求数,minify / gzip 压缩,webP,lazyLoad。
加快请求速度:预解析 DNS,减少域名数,并行加载,CDN 分发。
缓存:HTTP 协议缓存请求,离线缓存 manifest,离线数据缓存 localStorage。
渲染:JS/CSS 优化,加载顺序,服务端渲染,pipeline。
在这里插入图片描述

HTTP/2 Web优化最佳实践

DNS与解析

DNS 预读取是一项使浏览器主动去执行域名解析的功能,其范围包括文档的所有链接,无论是图片的,CSS 的,还是 JavaScript 等其他用户能够点击的 URL,减少用户点击链接时的延迟。

作用:作用:根据浏览器定义的规则,提前解析之后可能会用到的域名,使解析结果缓存到系统缓存中,缩短DNS解析时间,来提高网站的访问速度

如何使用

  1. 打开和关闭DNS预解析
    希望在HTTPS页面开启自动解析功能,添加如下标记
    <meta http-equiv="x-dns-prefetch-control" content="on">
    
    也可以通过在服务器端发送 X-DNS-Prefetch-Control 报头
  2. 自动解析
    Chromium会自动解析href属性(a标签),该行为与用户浏览网页是并行的。但为了确保安全,HTTPS页面不会自动解析

    Chromium不使用浏览器的网络堆栈,直接使用操作系统的缓存。通过8个异步线程执行预解析,每个线程处理一个队列,来等待域名的响应,最终操作系统会响应一个DNS结果给线程,然后线程丢弃它,等待下一个预解析请求。

  3. 手动添加解析
    <link rel="dns-prefetch" href="http://www.google.com">
    
  4. 在浏览器中设置
    一般来说并不需要去管理预读取,但是可能会有用户希望关闭预读取功能。这时只需要设置 network.dns.disablePrefetch preference 值为 true 就可以了
    默认情况下,通过 HTTPS 加载的页面上内嵌链接的域名并不会执行预加载。在 Firefox 浏览器中,可以通过设置 network.dns.disablePrefetchFromHTTPS 值为 false 来改变这一默认行为。

CDN分发

CDN这个技术其实说起来并不复杂,最初的核心理念,就是将内容缓存在终端用户附近。
内容源不是远么?那么,我们就在靠近用户的地方,建一个缓存服务器,把远端的内容,复制一份,放在这里,不就OK了?请添加图片描述
具体来说,CDN就是采用更多的缓存服务器(CDN边缘节点),布放在用户访问相对集中的地区或网络中。当用户访问网站时,利用全局负载技术,将用户的访问指向距离最近的缓存服务器上,由缓存服务器响应用户请求
请添加图片描述

总结:
我们都知道,当服务器离用户越远时,延迟越高。CDN 就是为了解决这一问题,在多个位置部署服务器,让用户离服务器更近,从而缩短请求时间

缓存策略

参考文章:https://blog.csdn.net/qq_56303170/article/details/127680487

页面渲染优化

Webkit 渲染引擎流程

  1. 处理 HTML 并构建 DOM 树
  2. 处理 CSS 构建 CSS 规则树(CSSOM)
  3. 接着JS 会通过 DOM Api 和 CSSOM Api 来操作 DOM Tree 和 CSS Rule Tree 将 DOM Tree 和 CSSOM Tree 合成一颗渲染树 Render Tree。
  4. 根据渲染树来布局,计算每个节点的位置
  5. 调用 GPU 绘制,合成图层,显示在屏幕上
    请添加图片描述
    请添加图片描述

避免CSS、JS阻塞

CSS阻塞

默认情况下,CSS是阻塞的资源。浏览器在构建CSSOM的过程中,不会渲染任何已处理的内容,即便DOM已经解析完毕了

只有当我们开始解析HTML后,解析到link标签或者style标签时,CSS才登场,CSSDOM的构建才开始。 很多时候,DOM不得不等待CSSOM,因此总结:

CSS是阻塞渲染的资源。需要将它尽早、尽快下载到客户端,以便缩短首次渲染的时间。尽早(将CSS放在head标签中)和尽快(启用CDN实现静态资源加载速度的优化)

JS的阻塞

JS的作用在于修改,本质上都是对DOM和CSSOM进行修改。因此JS的执行会阻止CSSOM,在我们不做显示声明的情况下,它也会阻塞DOM

JS 引擎是独立于渲染引擎存在的。我们的 JS 代码在文档的何处插入,就在何处执行。当 HTML 解析器遇到一个 script 标签时,它会暂停渲染过程,将控制权交给 JS 引擎。JS 引擎对内联的 JS 代码会直接执行,对外部 JS 文件还要先获取到脚本、再进行执行。等 JS 引擎运行完毕,浏览器又会把控制权还给渲染引擎,继续 CSSOM 和 DOM 的构建。 因此与其说是 JS 把 CSS 和 HTML 阻塞了,不如说是 JS 引擎抢走了渲染引擎的控制权。

实际使用时,可以遵循下面3个原则:

  • CSS资源优于JavaScript资源引入
  • JS应尽量少影响DOM的构建

改变JS阻塞的方式

defer(延缓)模式

defer方式加载script,不会阻塞HTML,等到DOM生成完毕且script加载完毕再执行JS

<script defer></script>

async(异步)模式

async 属性表示异步执行引入的 JS,加载时不会阻塞 HTML解析,但是加载完成后立马执行,此时仍然会阻塞 load 事件

<script async></script>

请添加图片描述
从应用的角度来说,一般当我们的脚本与 DOM 元素和其它脚本之间的依赖关系不强时,我们会选用 async;当脚本依赖于 DOM 元素和其它脚本的执行结果时,我们会选用defer

使用字体图标iconfont代替图片图标

字体图标就是将图标制作成一个字体,使用时就跟字体一样,可以设置属性,例如 font-size、color 等等,非常方便。并且字体图标是矢量图,不会失真。还有一个优点是生成的文件特别小

降低CSS选择器的复杂性

浏览器读取选择器,遵循的原则是从选择器的右边到左边:

#block .text p {
    color: red;
}
  1. 查找所有 P 元素。
  2. 查找结果 1 中的元素是否有类名为 text 的父元素
  3. 查找结果 2 中的元素是否有 id 为 block 的父元素

总结:

  1. 减少嵌套。后代选择器的开销是最高的,因此我们应该尽量将选择器的深度降到最低(最高不要超过三层),尽可能使用类来关联每一个标签元素
  2. 关注可以通过继承实现的属性,避免重复匹配重复定义
  3. 尽量使用高优先级的选择器,例如 ID 和类选择器。
  4. 避免使用通配符,只对需要用到的元素进行选择

减少重绘和回流

重绘:当页面中元素样式的改变并不影响它在文档流中的位置时(例如:color、background-color、visibility等),浏览器会将新样式赋予给元素并重新绘制它,这个过程称为重绘

回流:当Render Tree中部分或全部元素的尺寸、结构、或某些属性发生改变时,浏览器重新渲染部分或全部文档的过程称为回流。

回流必将引起重绘,重绘不一定会引起回流,回流比重绘的代价更高

如何避免

CSS:

  • 避免使用table布局
  • 尽可能在DOM树的最末端改变class
  • 避免设置多层内联样式
  • 将动画效果应用到position属性为absolutefixed的元素上
  • 避免使用CSS表达式(例如:calc()

JS:

  • 避免频繁操作样式,最好一次性重写style属性,或者将样式列表定义为class并一次性更改class属性。
  • 避免频繁操作DOM,创建一个documentFragment,在它上面应用所有DOM操作,最后再把它添加到文档中。
  • 也可以先为元素设置display: none,操作结束后再把它显示出来。因为在display属性为none的元素上进行的DOM操作不会引发回流和重绘。
  • 避免频繁读取会引发回流/重绘的属性,如果确实需要多次使用,就用一个变量缓存起来。
  • 对具有复杂动画的元素使用绝对定位,使它脱离文档流,否则会引起父元素及后续元素频繁回流

图片资源优化

  1. 使用雪碧图:
    雪碧图的作用就是减少请求数,而且多张图片合在一起后的体积会少于多张图片的体积和,这也是比较通用的图片压缩方案

  2. 降低图片质量:
    压缩方法有两种,一是通过在线网站进行压缩,二是通过 webpack 插件 image-webpack-loader

  3. 图片懒加载
    在页面中,先不给图片设置路径,只有当图片出现在浏览器的可视区域时,才去加载真正的图片,这就时延迟加载。对于图片较多的网站来说,一次性加载全部的图片,会对用户体验造成很大的影响

Webpack优化

参考文章:https://blog.csdn.net/qq_56303170/article/details/126452385

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】VueCLI 的使用和单文件组件(1)

学习内容&#xff1a; 1&#xff09;了解一下 Vue 的脚手架工具&#xff1b; 2) 认识一下 Vue 里面的单文件组件。‍‍ 在真正开发大型项目的时候&#xff0c;实际上我们并不能通过一个这样的index点html的方式去编写一个比较大型的项目&#xff0c;‍‍ 所以我们要学习使用 V…

JavaScript 69 JavaScript Web API 69.3 Web History API

JavaScript 文章目录JavaScript69 JavaScript Web API69.3 Web History API69.3.1 History back() 方法69.3.2 History go() 方法69.3.3 History 对象属性69.3.4 History 对象方法69 JavaScript Web API 69.3 Web History API Web History API 提供了访问 windows.history 对…

Linux进程与操作系统详解

文章目录一&#xff1a;冯诺依曼体系二&#xff1a;操作系统三&#xff1a;进程和PCB四&#xff1a;进程相关的指令五&#xff1a;getpid和getppid系统调用六&#xff1a;fork系统调用七&#xff1a;进程状态八&#xff1a;Linux下进程状态大全8.1&#xff1a;R(running)8.2&am…

Hive3 - HiveSQL 特征及操作

一、HiveSQL特征 Hive SQL&#xff08;HQL&#xff09;与SQL的语法大同小异&#xff0c;基本上是相通的&#xff0c;对SQL掌握的可以非常快的上手使用Hive SQL。不过在一些细节上需要特别注意Hive自己特有的语法知识点&#xff0c;下面分别进行介绍。 1. 字段数据类型 Hive数…

【附源码】Python计算机毕业设计烹饪课程预约系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

电脑重装系统c盘如何备份资料

现在越来越多的用户都喜欢重装自己所喜欢的电脑系统&#xff0c;但需要在重新安装系统之前备份自己的电脑。因此有很多用户问重装系统c盘如何备份的文件。今天小编就教下大家重装系统c盘如何备份的教程。 工具/原料&#xff1a; 系统版本&#xff1a;windows7系统 品牌型号&…

多目标应用:非支配排序的鲸鱼优化算法NSWOA优化RBF神经网络实现数据预测(RBF隐藏层神经元个数可以自行设定)

一、非支配排序的鲸鱼优化算法 非支配排序的鲸鱼优化算法&#xff08;Non-Dominated Sorting Whale Optimization Algorithm&#xff0c;NSWOA&#xff09;由Pradeep Jangir和 Narottam Jangir于2017年提出。 NSWOA算法流程如下&#xff1a; 二、RBF神经网络 1988年&#xf…

Spring-Aop面向切面编程

文章目录一、简介1、作用2、AOP核心概念3、五种&#xff08;增强&#xff09;通知类型二、AOP入门小案例&#xff08;注解版&#xff09;1.导入坐标(pom.xml)2.制作连接点(原始操作&#xff0c;Dao接口与实现类)3:定义通知类和通知4:定义切入点5:制作切面6:将通知类配给容器并标…

Linux操作系统

Linux 基础入门 Linux操作系统 操作系统 首先&#xff0c;我们需要知道什么是操作系统&#xff1a; 操作系统是应用程序运行的基础支撑环境操作系统作用是管理与控制计算机系统硬件与软件资源&#xff08;软件与硬件的中间层&#xff09;Intel X86 架构上的常见的操作系统&…

linux基本指令(上)

文章目录1.whomai指令2. pwd指令3. ls 指令1. ls指令2. ls -l指令3.ls -la指令1. cd .2. cd . .4. ls -ld指令5. ls -i指令1. windows 与linux标识文件之间的区别6. ls -R指令4. cd指令1.cd 指令2. cd ~ 指令3.cd -指令5. 根目录1.绝对路径2.相对路径例判断相对路径是否唯一6. …

leetcode-每日一题-119-杨辉三角2(简单,dp)

今天这道题是一道简单的dp题说实话很好想到解法&#xff0c;就是用两个dp来回倒换即可解除&#xff0c;然后也没啥难度所以就不解释了&#xff0c;养成一个好习惯就是设置数组的时候需要malloc动态获取即可&#xff0c;然后使用memset进行初始化&#xff0c;注意memset只能进行…

期货行权(期货行权日)

​ 期权如何行权&#xff1f;期货到期了如何进行实物交割&#xff1f; 期权到期日 Expiration Date&#xff1a;到期日即是指期权合约所规定的&#xff0c;期权购买者可以实际执行该期权的最后日期。 对欧式期权而言&#xff0c;为期权合约可以行权的唯一一天&#xff1b;对…

[附源码]计算机毕业设计JAVAjsp心理测评系统

[附源码]计算机毕业设计JAVAjsp心理测评系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis…

经典图割算法中图的构建及实现:Graph-Cut

经典图割算法中图的:Graph-Cut一&#xff0e;graph-cut&#xff1a;准则函数二&#xff0e;Graph-cut&#xff1a;图的建立1.术语&#xff1a;2.图的建立3. 头文件4. 源文件5. 测试图像讲解目前典型的3种图割算法&#xff1a;graph-cut、grab-but、one-cut。本文主要讲解graph-…

【IEEE2014】EET:基于采样的机器人运动规划中的平衡勘探与开发

EET&#xff1a;基于采样的机器人运动规划中的平衡勘探与开发 摘要&#xff1a; 本文提出了一种用于运动规划的探索/利用树&#xff08;EET&#xff09;算法。EET规划者故意用概率的完整性来换取计算效率。这种权衡使EET规划器能够比最先进的基于采样的规划器多三个数量级。我们…

【蓝桥杯真题练习】STEMA科技素养练习题库 答案版013 持续更新中~

1、人工神经网络是一种模仿动物神经系统设计的机器学习方法,它被用于解决各种传统编程无法解决的问题。“神经网络”一词在英文中是( )。 A.Neural Network B.Neural Engine C.Machine Learning D.Machine Network 答案:A 2、中央处理器(CPU)是手机,电脑…

第五章 Docker 自定义镜像

5-1 认识 Dockerfile 文件 Dockerfile 用于构建 Docker 镜像&#xff0c;Dockerfile 文件是由一行行命令语句组 成 &#xff0c; 基于 这些命 令 即 可以构建一 个镜 像&#xff0c; 比如下面 就 是一 个 Dockefile 文件样例&#xff1a; FROM XXX/jdk:8 MAINTAINER docker_us…

大一学生《Web编程基础》期末网页制作 HTML+CSS+JavaScript 企业网页设计实例

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【紧急情况】:回宿舍放下书包的我,花了20分钟敲了一个抢购脚本

文章目录情况紧急 ⁉️抢❗️抢❗️抢❗️开抢时间说明&#x1f4a8;开抢过程&#x1f4a5;Get_cookie.py开抢结束语&#x1f631;情况紧急 ⁉️ 不管你信不信&#xff0c;这就是俺刚瞧出的代码&#xff01;&#xff01;&#xff01; 现在离20&#xff1a;00还有38分钟&#xf…

持久与速度 鱼和熊掌 MySQL怎么去兼得

前言 我们都知道 MySQL 有一个特性就是持久化储存到磁盘中 我们存进去就要取出来这也是MySQL的速度为什么比不上Redis。但是MySQL 并不是完全就摆烂每次都进行 Select update 的时候都重新去磁盘IO 这样MySQL肯定会更慢 速度快 和 持久化 MySQL 表示我都要 但是两者都要肯定没…