web前端面试高频考点——性能优化篇(手写防抖、手写节流、XXS攻击、XSRF攻击)

简介: web前端面试高频考点——性能优化篇(手写防抖、手写节流、XXS攻击、XSRF攻击)

运行环境

一、在哪里运行

  • 运行环境即浏览器(server 端有nodejs)

二、 网页是如何加载并渲染出来的

1、资源的形式

  • html 代码
  • 媒体文件,如图片、视频等
  • JavaScript CSS

2、加载过程

  • DNS 解析:域名 -> IP 地址
  • 浏览器根据 IP地址向服务端发起 http 请求
  • 服务器处理 http 请求,并返回给浏览器

3、渲染过程

根据 HTML 代码生成 DOM Tree(文档对象模型树)

根据 CSS 代码生成 CSSOM(CSS对象模型)

DOM 树和 CSSOM 可以并行构建

将 DOM Tree 和 CSSOM 整合形成 Render Tree(渲染树)

根据 Render Tree 渲染页面

遇到 <script> 则暂停渲染,优先加载并执行 JS 代码,完成再继续

直至把 Render Tree 渲染完成

4、window.onload 和 DOMContentLoaded 区别

  • window.onload:页面的全部资源加载完才会执行,包括图片、视频等
  • DOMContentLoaded:DOM 渲染完即可执行,此时图片、视频还可能没有加载完
    window.addEventListener('load', function() {
        // 页面的全部资源加载完才会执行,包括图片、视频等
    })
    document.addEventListener('DOMContentLoaded', function() {
        // DOM 渲染完即可执行,此时图片、视频还可能没有加载完
    })

二、性能优化

1、性能优化原则

  • 多使用内存、缓存或其他方法
  • 减少CPU 计算量,减少网络加载耗时
  • 用空间换时间

2、性能优化 — 让加载更快

减少资源体积:压缩代码

减少访问次数:合并代码,SSR 服务器端渲染,缓存

使用更快的网络:CDN(分布在不同区域的边缘节点服务器群组成的分布式网络)

3、性能优化 — 让渲染更快

CSS 放在 head,JS 放在 body 最下面

尽早开始执行 JS,用 DOMContentLoaded 触发

懒加载(图片懒加载,上滑加载更多)

对 DOM 查询进行缓存

频繁 DOM 操作,合并到一起插入 DOM 结构

节流 throttle 防抖 debounce

4、前端性能优化示例

资源合并:

    <script src="a.js"></script>
    <script src="b.js"></script>
    <script src="c.js"></script>
    // 合并为
    <script src="abc.js"></script>

缓存:

  • 静态资源加 hash 后缀,根据文件内容计算 hash(webpack中的配置)
  • 文件内容不变,则 hash 不变,则 url 不变
  • url 和文件不变,则会自动触发 http 缓存机制,返回 304
  • CDN:

SSR:

  • 服务器端渲染:将网页和数据一起加载,一起渲染
  • 非 SSR(前后端分离):先加载网页,再加载数据,再渲染数据
  • 早先的 JSP ASP PHP,现在的 vue react SSR

懒加载:

先给一个容易加载的图片,等加载完成后把真正的图片展现出来

    <img id="img1" src="preview.png" data-realsrc="abc.png">
  let img1 = document.getElementById('img1')
    img1.src = img1.getAttribute('data-realsrc')

缓存 DOM 查询:

5685cfcd9245456991d9bfcf681256f1.png

多个 DOM 操作一起插入到 DOM 结构:

f3c19cf6e99c47f780bbdf26ba9aa19f.png

尽早开始 JS 执行:

    window.addEventListener('load', function() {
        // 页面的全部资源加载完才会执行,包括图片、视频等
    })
    document.addEventListener('DOMContentLoaded', function() {
        // DOM 渲染完即可执行,此时图片、视频还可能没有加载完
    })

5、防抖 debounce

  • 监听一个输入框的,文字变化后触发 change 事件
  • 直接用 keyup 事件,则会频繁触发 change 事件
  • 防抖:用户输入结束或暂停时,才会触发 change 事件

示例:input 框的防抖

    <input type="text" id="input1">
    let input1 = document.getElementById('input1')
    let timer = null
    input1.addEventListener('keyup', function(value) {
        if(timer) {
            clearTimeout(timer)
        }
        timer = setTimeout(() => {
            // 模拟触发 change 事件
            console.log(input1.value) 
            // 清空定时器
            timer = null
        }, 500)
    })

7baf4d4b979e4a49905666dfae4c96d4.png

封装防抖 debounce 函数:

    <input type="text" id="input1">
    let input1 = document.getElementById('input1')
  // 防抖
    function debounce(fn, delay = 500) {
        // timer 是闭包中的
        let timer = null
        return function() {
            if(timer) {
                clearTimeout(timer)
            }
            timer = setTimeout(() => {
                fn.apply(this, arguments)
                timer = null
            }, delay)
        }
    }
    input1.addEventListener('keyup', debounce(() => {
        console.log(input1.value)
    }, 1000))

78391ca6b52f4a539e197faa56a2b906.png

6、节流 throttle

  • 拖拽一个元素时,要随时拿到该元素被拖拽的位置
  • 直接用 drag 事件,则会频繁触发,很容易导致卡顿
  • 节流:无论拖拽速度多快,都会每隔 xxxms 触发一次

示例:拖拽一个 div

    #div1 {
        border: 1px solid #ccc;
        width: 200px;
        height: 100px;
    }
  <div id="div1" draggable="true">可拖拽</div>
  const div1 = document.getElementById('div1')
    let timer = null
    div1.addEventListener('drag', function (event) {
        if(timer) {
            return 
        }
        timer = setTimeout(() => {
            console.log(event.offsetX, event.offsetY)
            timer = null
        }, 100)
    })

封装节流 throttle 函数:

    #div1 {
        border: 1px solid #ccc;
        width: 200px;
        height: 100px;
    }
    <div id="div1" draggable="true">可拖拽</div>
  const div1 = document.getElementById('div1')
    function throttle(fn, delay = 100) {
        let timer = null
        return function() {
            if(timer) {
                return
            }
            timer = setTimeout(() => {
                fn.apply(this, arguments)
                timer = null
            }, delay)
        }
    }
    div1.addEventListener('drag', throttle(function (event) {
        console.log(event.offsetX, event.offsetY)
    },))

三、常见的 web 前端攻击方式

  • XSS 跨站请求攻击
  • XSRF 跨站请求伪造

1、XXS 攻击

  • 一个博客网站,我发表一篇博客,其中嵌入 <script></script> 脚本
  • 脚本内容:获取 cookie,发送到我的服务器(服务器配合跨域)
  • 发表这篇博客,有人查看它,我轻松收割访问者的 cookie

2、XXS 预防

  • 替换特殊字符,如 < 变为 &lt; > 变为 &gt;
  • <script> 变为 &lt;script&gt; 直接显示,而不会作为脚本执行
  • 前端要替换,后端也要替换,都做更保险

示例:脚本不会执行,直接在页面显示

  &lt;script&gt;alert(document.cookie)&lt;script&gt;

2b3aeb91ef3c49c1b8945987b97f48a3.png

3、XSRF 攻击

  • 我向你发送一封电子邮件,邮件标题很吸引人
  • 但邮件正文隐藏着 <img src="xxx.com/pay?id=200" />
  • 你一查看邮件,就帮我购买了 id 是 200 的商品

4、XSRF 预防

  • 使用 post 接口
  • 增加验证,例如密码、短信验证码、指纹等
相关文章
|
12月前
|
安全 网络协议 NoSQL
Web渗透-常见的端口及对其的攻击思路
本文介绍了常见网络服务端口及其安全风险,涵盖FTP、SSH、Telnet、SMTP、DNS、HTTP、SMB、数据库及远程桌面等20余个端口,涉及弱口令爆破、信息泄露、未授权访问、缓冲区溢出等典型漏洞,适用于网络安全学习与渗透测试参考。
1997 59
|
存储 安全 算法
Java 集合面试题 PDF 下载及高频考点解析
本文围绕Java集合面试题展开,详细解析了集合框架的基本概念、常见集合类的特点与应用场景。内容涵盖`ArrayList`与`LinkedList`的区别、`HashSet`与`TreeSet`的对比、`HashMap`与`ConcurrentHashMap`的线程安全性分析等。通过技术方案与应用实例,帮助读者深入理解集合类的特性和使用场景,提升解决实际开发问题的能力。文末附带资源链接,供进一步学习参考。
382 4
|
Java 程序员
Java社招面试中的高频考点:Callable、Future与FutureTask详解
大家好,我是小米。本文主要讲解Java多线程编程中的三个重要概念:Callable、Future和FutureTask。它们在实际开发中帮助我们更灵活、高效地处理多线程任务,尤其适合社招面试场景。通过 Callable 可以定义有返回值且可能抛出异常的任务;Future 用于获取任务结果并提供取消和检查状态的功能;FutureTask 则结合了两者的优势,既可执行任务又可获取结果。掌握这些知识不仅能提升你的编程能力,还能让你在面试中脱颖而出。文中结合实例详细介绍了这三个概念的使用方法及其区别与联系。希望对大家有所帮助!
897 60
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
683 3
|
SQL 存储 安全
Web 常见攻击方式及防御方法
【10月更文挑战第25天】Web 安全是一个复杂而重要的领域,攻击者不断寻找新的攻击方法,我们需要不断加强防御措施,提高安全意识,以保障 Web 应用的安全运行。通过采取多种防御手段的综合运用,我们可以有效地降低 Web 攻击的风险,保护用户的信息和财产安全。同时,随着技术的不断发展,我们也需要持续关注和研究新的安全威胁和防御方法,以应对不断变化的安全形势。
1924 56
|
JavaScript 前端开发 安全
2024年前端开发新趋势:TypeScript、Deno与性能优化
2024年前端开发迎来新趋势:TypeScript 5.0引入装饰器正式支持、const类型参数及枚举改进;Deno 1.42版推出JSR包注册表、增强Node.js兼容性并优化性能;性能优化策略涵盖代码分割、懒加载及现代构建工具的应用。这些变化推动前端开发向更高效率和安全性发展。
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
1235 5
|
Web App开发 网络协议 安全
基于Web攻击的方式发现并攻击物联网设备介绍
基于Web攻击的方式发现并攻击物联网设备介绍
367 4
|
安全 前端开发 Java
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第26天】Web安全是现代软件开发的重要领域,本文深入探讨了XSS和CSRF两种常见攻击的原理及防御策略。针对XSS,介绍了输入验证与转义、使用CSP、WAF、HTTP-only Cookie和代码审查等方法。对于CSRF,提出了启用CSRF保护、设置CSRF Token、使用HTTPS、二次验证和用户教育等措施。通过这些策略,开发者可以构建更安全的Web应用。
1188 4
|
存储 安全 Go
Web安全基础:防范XSS与CSRF攻击的方法
【10月更文挑战第25天】Web安全是互联网应用开发中的重要环节。本文通过具体案例分析了跨站脚本攻击(XSS)和跨站请求伪造(CSRF)的原理及防范方法,包括服务器端数据过滤、使用Content Security Policy (CSP)、添加CSRF令牌等措施,帮助开发者构建更安全的Web应用。
817 3

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1363
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    641
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    501
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    501
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    608
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    790
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1558
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    364
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1277
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    615