在网页中运行环境即浏览器
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 接口
减少验证,例如领取明码、短信验证码、指纹