在网页中运行环境即浏览器
1、JS上线之后在什么中央运行?
下载网页代码、渲染出页面,期间会执行若干js
代码在浏览器中稳固且高效
网页加载过程
性能优化
平安
2、网页是如何渲染进去的?
从输出url到渲染出页面的整个过程
DNS解析: 域名->IP地址、浏览器依据IP地址向服务器发动http申请、服务器解决http申请
并返回给浏览器
加载资源的模式、加载资源的过程、页面渲染的过程
渲染过程?
依据html生成DOM Tree
依据css代码生成CSSOM
将DOM Tree和CSSOM整合造成Render Tree
依据Render Tree渲染页面
遇到script则暂停渲染,优先加载并执行js代码,实现再持续
为何把link css放在head中?
为何把script js放在最初?
window.onload和DOMContentLoaded的区别:
window.onload:页面的全副资源加载实现才会执行,包含图片、视频等
DOMContentLoaded: DOM渲染实现即可执行,此时图片、视频还可能没加载实现
3、前端性能优化
多应用内存、缓存或其余办法
缩小CPU计算量,缩小网络加载耗时(空间换工夫)
让加载更快
缩小资源体积: 压缩代码
缩小拜访次数: 合并代码、SSR渲染、缓存
让渲染更快
尽快执行js
图片懒加载
DOM进行缓存
频繁操作DOM,合并一起插入DOM构造
节流throttle和防抖debounce
4、防抖debounce
监听一个输入框的,文字变动后触发change事件
间接用keyup事件,则会频繁触发change事件
防抖就是用户输出完结或暂停时,才会触发change事件
<input type="text" id="input1"> <script> let input1 = document.getElementById('input1') function debounce(fn, delay = 500) { let timer = null return function(){ if(timer){ clearTimeout(timer) } timer = setTimeout(() => { fn.apply(this, arguments) timer = null }, delay) } } input1.addEventListener("keyup", debounce(function(){ console.log(input1.value) }, 500)) </script>
5、节流throttle
拖拽一个元素时,要随时拿到该元素拖拽的地位
间接用drag事件,则会频繁触发,很容易卡顿
节流:无论拖拽速度多快,都会每隔100ms触发一次
<div id="div1" draggable="true">能够拖拽</div> <script> 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((e) => { console.log(e.offsetX) }, 100)) </script>
6、如何预防xss攻打
xss跨站申请攻打
场景:
一个博客网站,我发表一篇博客,其中嵌入script脚本
脚本内容:获取cookie,发送到我的服务器(服务器配合跨域)
公布这篇博客,有人查看他,我就轻松收割访问者的cookie
替换特殊字符,如<用<、 >用>,或者用npmjs中的xss做预防。
7、XSRF攻打(跨站申请伪造)
场景:
你正在购物,看中了某个商品,商品id为100 付费接口为xxx.com/pay?id=100,然而没有任何验证 我是攻击者,我看中了一个商品,id为200 我向你发送一封电子邮件 然而邮件注释暗藏着<img src=xxx.com/pay?id=200> 你一查看邮件,就帮我购买了商品id为200的商品
预防:
应用post接口 减少验证,例如领取明码、短信验证码、指纹