快速搞定前端JS面试 -- 第十二章 运行环境 (页面加载、性能优化、安全)

一、页面加载过程

1. 资源的形式

2. 渲染过程

3. 页面加载过程

4. Window.onload和DOMContentLoaded

二、性能优化

1、性能优化原则

2、如何入手性能优化

1. 资源合并

2. 缓存

3. CDN

4. SSR

5. 懒加载

6. 缓存DOM查询

7. 尽早开始JS执行

8. 防抖

9. 节流

三、安全

1. XSS跨站请求攻击

2. XSRF跨站请求伪造

问题解答

1. 从输入url到显示出页面的整个过程

2. Window.onload和DOMContentLoaded区别

3. 为何把css放在<head>中

4. 为何把js放在<body>最后

5. html中css写在前js写在后的优点

6. 如何入手性能优化

7. 防抖节流以及手写代码

8. 常见的Web前端攻击方式有哪些


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

下载页面代码,渲染出页面,期间会执行若干JS

要保证代码在浏览器中:稳定且高效

一、页面加载过程

1. 资源的形式

(1)Html代码

(2)媒体文件,如图片,视频等

(3)JavaScript css

2. 渲染过程

(1)根据HTML代码生成DOM树

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

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

(4)根据Render Tree渲染页面

3. 页面加载过程

(1)根据HTML代码生成DOM树

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

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

(4)根据Render Tree渲染页面

(5)遇到<script>则暂停渲染(因为JS可能会修改DOM结构),优先加载并执行JS代码,完成再继续

(6)直至把Render Tree渲染完成

4. Window.onload和DOMContentLoaded

Window.addEventLiatener(‘load’, function() {
    // 页面的全部资源加载完才会执行,包括图片视频等
})
Document.addEventListener(‘DONContentLoaded’, function() {
   // DOM渲染完成即可执行,此时图片视频可能还没有加载完成
})

二、性能优化

是一个综合问题,没有标准答案,但是要求尽量全面

细节问题:手写防抖、节流

1、性能优化原则

(1)多使用内存、缓存或者其他方法

(2)减少CPU计算量,减少网络加载耗时(空间换时间)

2、如何入手性能优化

加载更快

(1)减少资源体积:压缩代码

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

(3)使用更快的网络:CDN

渲染更快/流畅

(1)CSS放在head,JS放在body最下面

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

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

(4)对DOM查询进行缓存

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

(6)节流throttle和防抖debounce

1. 资源合并

2. 缓存

静态资源加载hash后缀,根据文件内容计算hash

文件内容不变,则hash不变,则url不变

Url和文件不变,则会自动触发http缓存机制,返回304

3. CDN

4. SSR

服务器端渲染:将网页和数据一起加载,一起渲染

非SSR(前后端分离):先加载网页,网页Ajax加载数据,发送请求返回请求,返回之后再渲染数据

早期的JSP ASP PHP 现在的vue React SSR

5. 懒加载

场景:一个较长的新闻列表,有很多张图片,不希望图片一下子就加载完成,随着滑动页面图片逐渐被加载出来。

实现方法:把图片的路径设置为preview.png预览,而把真正的图片地址放在data-realsrc里面。只有当浏览器判断当图片被滑动到露出屏幕时,再去加载图片。

6. 缓存DOM查询

7. 尽早开始JS执行

8. 防抖

场景:监听一个输入框,文字变化后触发change事件。直接用keyup事件,则会频繁触发change事件

防抖:函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时

用户输入结束或者暂停时,才会触发change事件

// 防抖封装
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(function (e) {
    console.log(e.target)
    console.log(input1.value)
}, 600))

9. 节流

场景:拖拽一个元素时,要随时拿到该元素被拖拽的位置

直接使用drag事件则会频繁触发,很容易导致卡顿

节流:函数节流(throttle):当持续触发事件时,保证一定时间段内只调用一次事件处理函数。

无论拖拽速度多快,都会每隔固定事件如100ms触发一次

// 节流函数
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 (e) {
    console.log(e.offsetX, e.offsetY)
}, 200))

三、安全

1. XSS跨站请求攻击

XSS攻击全称跨站脚本攻击,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。结果:窃取cookies,读取目标网站的cookie发送到黑客的服务器上;读取用户未公开的资料,如果:邮件列表或者内容、系统的客户资料,联系人列表等等

(1)场景

一个博客网站,发表一篇博客,其中嵌入<script>脚本

脚本内容:获取cookie(含有个人信息),发送到我的服务器(服务器配合跨域)

发布这篇博客,有人查看他,我轻松收割访问者的cookie

(2)预防

替换特殊字符,如 ‘<’ 变为 ‘< ’  ‘>’ 变为 ‘>’

则‘<script>’ 变为 ‘<script>’ ; ‘ ,’ 直接显示,而不会作为脚本执行

前端(显示时)后端(存储时)都需要替换

2. XSRF跨站请求伪造

CSRF(Cross-site request forgery)跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。

(1)场景

你正在购物,看中了某件产品,商品id是100

付费接口是xxx.com/pay?id=100,但是没有验证

我是攻击者,看中了一个商品,id是200

我向你发送一封邮件,邮件标题很吸引人

但是邮件正文隐藏着一个<img src = xxx.com/pay?id=200/>

你一查看邮件,就会购买了id为200的商品

(原因:已经登录网站,img发送的请求是跨域的)

(2)预防

使用post接口

增加验证,例如密码、短信验证码、指纹等

 

问题解答

1. 从输入url到显示出页面的整个过程

(1)下载资源:各个资源类型(包括Html代码;媒体文件,如图片,视频等;JavaScript css)

(2)渲染页面:结合html css javascript图片,渲染过程为:首先根据HTML代码生成DOM树,并且根据CSS代码生成CSSOM(CSS对象模型);之后将DOM树和CSSOM整合形成Render Tree(渲染树);再根据Render Tree渲染页面;当遇到<script>则暂停渲染(因为JS可能会修改DOM结构),优先加载并执行JS代码,完成再继续;直至把Render Tree渲染完成。

2. Window.onload和DOMContentLoaded区别

(1)Window.onload全部资源加载完才会执行,包括图片视频等

(2)DOMContentLoaded DOM渲染完成即可执行,此时图片视频可能还没有加载完成

3. 为何把css放在<head>中?

    假设不放在head中,而是放在body最下面:拿到html代码,会先生成DOM树,由于没有css信息那么就按照默认样式渲染,渲染完成之后发现后面有css,又把css加载完成之后生成了一个CSSOM,然后和当前的DOM树合并,生成Rander tree,这时是一个重复加载的过程。(在感官上可能会出现:本来是默认的字体样式,一下子突然变化)。

    把css放在<head>中是为了在DOM树生成完成之前就把css代码加载,之后DOM树生成完毕之后可以直接和CSS整合形成一个渲染树,一步渲染完成。

4. 为何把js放在<body>最后?

    如果js代码不放在最后,可能出现的情况就是:本然渲染了一部分,突然停止渲染加载js,加载完成之后再去渲染,会导致页面渲染时间比较长。先把html渲染完成之后再执行js代码。

   JS在后:因为js的运行是要占用主线程的,也就是在js运行的时候,页面是不进行解析和渲染的,如果js写在最前面,如果不做特殊处理,除了能提供依赖以外和做一些预处理之外,连dom节点都无法捕捉,导致功能受到了很大的限制

5. html中css写在前js写在后的优点

    CSS一上来就会异步挂载,挂载期间进行dom树的构建,CSS加载完毕DOM也解析完毕后会渲染并绘制,如果CSS未加载完但DOM解析完毕则完会等待CSS,如果CSS加载完成但DOM没有解析完,继续往下解析DOM。

    遇到最下方的JS时,至少所有的DOM节点都已经解析完毕,根据上面CSS+JS组合的结论,你会发现JS会在CSS加载完毕并完成绘制现有DOM节点后才会开始执行,不会出现先加载出来一块再显示另一块的情况。

6. 如何入手性能优化

(1)加载更快

  • 减少资源体积:压缩代码
  • 减少访问次数:合并代码,SSR服务器端渲染,缓存
  • 使用更快的网络:CDN

(2)渲染更快/流畅

  • CSS放在head,JS放在body最下面
  • 尽早开始执行JS,用DOMContentLoaded触发
  • 懒加载(图片懒加载,上滑加更多)
  • 对DOM查询进行缓存
  • 频繁DOM操作,合并到一起插入DOM结构
  • 节流throttle和防抖debounce

7. 防抖节流以及手写代码

防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延。代码如上

节流(throttle):当持续触发事件时,保证一定时间段内只调用一次事件处理函数。代码如上

8. 常见的Web前端攻击方式有哪些

(1)XSS跨站请求攻击(解决方法:替换特殊字符,如 ‘<’ 变为 ‘< ’  ‘>’ 变为 ‘>’则‘<script>’ 变为 ‘<script>’ ; ‘ ,’ 直接显示,而不会作为脚本执行,并且前端(显示时)后端(存储时)都需要替换)

(2)XSRF跨站请求伪造(解决方法:使用post接口;增加验证,例如密码、短信验证码、指纹等)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: JavaScript作为一种强大的脚本语言,可以快速搞定前端技术。在前端开发中,JavaScript可以用来实现交互效果、动画效果、表单验证、页面布局等各种功能。同时,JavaScript也可以与HTML、CSS紧密结合,使页面功能更加丰富。 为了快速搞定前端技术,需要熟练掌握JavaScript的基本语法和常用API,例如DOM操作、事件处理、定时器、Ajax等。掌握这些知识不仅可以提高开发效率,还能够让你在前端开发中发挥更大的创造性。 除了学习JavaScript的基本语法和API之外,还要多进行实战练习,掌握实际应用技巧。可以参考优秀的前端开源项目和博客,了解不同的开发思路和技术实现方法,同时也可以积累更多的经验。 最后,在进行前端开发的过程中,可以使用比较成熟的JavaScript框架和库,比如jQuery、AngularJS、React等,能够更好地提高开发效率,并且有助于让你的应用达到较好的性能和用户体验。 总之,通过深入学习JavaScript,结合实际开发实践,应用成熟的JavaScript框架和库,可以快速搞定前端技术,使自己更加成为一名优秀的前端开发工程师。 ### 回答2: JavaScript是一种高级编程语言,用于在网页上创建交互式效果。它可以被用于快速搞定前端技术一面。 JavaScript的主要优点之一是它易于学习和使用。它被广泛使用,因为它不仅简单易懂,更可以用于许多场景。JavaScript可以用于DOM操作、事件处理、动画、表单验证等多种场景,这些都是前端技术中的核心部分。 对于想要迅速入门前端技术的人来说,建议从JavaScript开始学习。有很多在线资源,比如MDN文档,可以帮助你开始认识JavaScript的基础知识和语法。同时,有很多JavaScript框架,如React、Vue、Angular等,可以让你更有效地构建大型应用程序。 另外,要想在前端技术领域获得成功,还需要学习HTML和CSS。它们是构建网页的基础。但是,通过JavaScript,你可以使这些基础更加强大。例如,你可以使用JavaScript操作HTML元素,并对其添加样式,使网页更加交互和美观。 因此,如果你想快速搞定前端技术一面,请开始学习JavaScript吧。你会发现这是一门动态、有趣且实用的编程语言,可以帮助你构建高度可交互的网页体验。 ### 回答3: JavaScript是一门运行在浏览器端的编程语言,是前端开发必备的技术之一。在JavaScript中,可以使用HTML和CSS来操作和控制页面的交互和显示效果,同时也可以通过JavaScript来实现一些复杂的功能和逻辑操作。 要快速搞定前端技术中的JavaScript,需要掌握以下几个方面: 1. 基础语法:JavaScript的基础语法包括变量、数据类型、运算符、流程控制语句等,需要掌握这些基本概念,才能编写出简单的程序。 2. DOM操作:DOM是文档对象模型的缩写,用于操作HTML和CSS。掌握DOM操作能够使前端开发更为得心应手,可以快速处理页面的展示效果。 3. AJAX:AJAX是异步JavaScript和XML的缩写,是一种用于创建快速动态网页的技术。它可以通过JavaScript异步请求数据,可以将页面刷新的时间和流量大大降低。 4. 框架和库:JavaScript拥有众多框架和库,这些工具包可以帮助前端开发者更快速地完成开发工作。例如,React、Vue.js等框架可以将前端开发极大地简化,加速前端开发效率。 总而言之,想要快速搞定前端技术中的JavaScript,需要不断学习掌握基础语法、DOM操作、AJAX等技术,同时了解一些常用的库和框架,这样便可以更好地适应前端开发的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白Rachel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值