七、运行环境
1. 背景
- 运行环境通常是指浏览器(server端有nodejs)(移动端多数是在APP上)
- 下载网页代码,渲染出页面,期间会执行若干JS
- 要保证代码在浏览器中:稳定且高效
2. 网页加载过程
- 加载资源的形式
- html代码
- 媒体文件,如图片、视频等
- JavaScript,css
- 加载资源的过程
- DNS解析:域名 -> IP地址
- 浏览器根据IP地址向服务器发起http请求
- 服务器处理http请求,并返回给浏览器
- 渲染页面的过程
- 根据HTML代码生成DOM Tree
- 根据CSS代码生成CSSOM
- 将DOM Tree和CSSOM整合行程Render Tree
- 根据Render Tree渲染页面
- 遇到
- 直至把Render Tree渲染完成
- 从输入url到渲染出页面的整个过程
- 下载资源:各个资源类型,下载过程
- 渲染页面:结合html css javascript图片等
- window.onload和DOMContentLoaded的区别
- window.onload资源全部加载完后才执行,包括图片
- DOMContentLoaded DOM渲染完成即可,图片可能尚未下载
3. 性能优化
- 性能优化原则
- 多使用内存、缓存或其它方法
- 减少CPU计算量,减少网络加载耗时
- (适用于所有编程的性能优化——空间换时间)
- 从何入手?
-
- 减少资源体积:压缩代码
- 减少访问次数:合并代码,SSR服务器端渲染,缓存
- 使用更快的网络:CDN
-
- CSS放在head,JS放在body最下面
- 尽早开始执行JS,用DOMContentLoaded触发
- 懒加载(图片懒加载,上滑加载更多)
- 对DOM查询进行缓存
- 频繁DOM操作,合并到一起插入DOM结构
- 节流throttle,防抖debounce(让渲染更加流畅)
- 防抖和节流
-
- 监听一个输入框的,文字变化后触发onChange事件
- 直接用keyup事件,则会频繁触发change事件
- 防抖:用户输入结束或暂停时,才会触发change事件
const 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)
}), 600)
-
- 拖拽一个元素时,要随时拿到该元素被拖拽的位置
- 直接用drag事件,则会频繁触发,很容易导致卡顿
- 节流:无论拖拽速度多快,都会每隔100ms触发一次
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(e) {
console.log(e.offsetX, e.offsetY)
},200))
4. 安全
- 常见的web前端攻击方式有哪些
- XSS攻击
- XSS预防
- XSRF攻击(不经常发生)
- 你在购物,看中某个商品,商品id是100,付费接口是xxx.com/pay?id=100,但没有任何验证,我是攻击者,看中了一个商品id是200,我向你发送一封邮件,邮件正文隐藏着<img src=xxx.com/pay?id=200 />,你查看了邮件,邮件中带走了你的cookie信息,这样你就帮我购买了id是200的商品
- XSRF预防
- 使用post接口
- 增加验证,例如密码、短信验证码、指纹等