- 减少DOM元素数量
- 不使用表格布局:因为标签多、易重排
- 善用语义化标签
<details><summary>Details</summary>Something small enough to escape casual notice.</details>
- 善用伪元素
- 尽量减少iframe的使用
- 优点:加载第三方资源、可并行下载脚本
- 缺点:加载代价高、阻塞页面
- 减少http请求
- 合并文件
- 雪碧图
- 行内图片(base64图片)
- 图标字体
- 避免404
- 避免图片src为空:浏览器仍然会向服务器发起一个HTTP请求
- 避免重定向:重定时内页面空白,会影响用户体验
301
/302
window.location.href
<meta http-equiv="refresh" content="3;url=http://www.mozilla.org/">
- 减少DNS查询
- 减少主机名 = 减少并行下载数量
- 减少并行下载数据 = 增加相应时间
- 折中方案:一般设置2-4个主机名
- 划分内容到不同域名:增加并发下载数量
- 缓存Ajax请求
- 延迟加载
- 非首屏数据、样式、脚本、图片
- 交互时才显示的内容
- 预加载
- 无条件预加载:页面load后,立马获取其他资源
- 有条件预加载:根据用户的行为来加载可能用到的资源
- 使用CDN:减少资源下载时间
- 启用Gzip
- 添加Expires或Cache-Control响应头(Last-Modified/If-Modified-Since)
- 配置 Etag(Etag/If-None-Match)
- Ajax请求使用GET方法:POST请求时分成两步,先发送Http Header,再发送data。而GET只使用一个TCP数据包(Http Header与data)发送数据
- 减少cookie大小
- 去除不必要的 Cookie
- 尽量压缩 Cookie 大小
- 设置合适的过期时间
- 静态资源使用无Cookie域名
- 样式放头部:尽早呈现视觉反馈
- 把脚本放在页面底部
- defer
- async
- 使用外部JavaScript和CSS
- 压缩JavaScript和CSS
- 移除重复脚本
- 减少DOM操作:JavaScript 操作 DOM 很慢,尤其是 DOM 节点很多时
- 缓存已经访问过的元素
- 使用DocumentFragment暂存DOM,整理好以后再插入DOM树
- 操作className,而不是多次读写style
- 避免使用JavaScript修复布局
- 使用高效的事件处理
- 使用事件委托
- 尽早处理事件,在DOMContentLoaded即可进行,不用等到load以后
- 压缩图片大小
- 图片格式
- 雪碧图
- webp格式
- 图标字体
- 行内图片(base64)
- 使用适当大小的图片
- 使用体积小、可缓存的favicon.ico:Favicon.ico一般存放在网站根目录下,无论是否在页面中设置,浏览器都会尝试请求这个文件
- 存在(避免 404)
- 尽量小,最好小于 1K
- 设置较长的过期时间
- script
- defer:异步下载,DOMContentLoaded前顺序执行
- async:异步下载,下载完乱序执行
- link
- preload:提高加载优先级
<link rel="preload" href="style.css" as="style">
||<link rel="preload" href="main.js" as="script">
- prefetch:浏览器空闲时间加载
- prerender:指定加载一个页面的所有资源
<link rel="prerender" href="/result.html"/>
- dns-prefetch:dns预解析
<link rel="dns-prefetch" href="//www.xx.com">
- preload:提高加载优先级
- img
- srcset:根据dpr来匹配不同分辨率的图片
- mate
- x-dns-prefetch-control:浏览器空闲时间将dns预解析(
<meta http-equiv="x-dns-prefetch-control" content="on">
)
- x-dns-prefetch-control:浏览器空闲时间将dns预解析(
- 优化css选择器
- 动画
- 脱离文档流布局
- css3硬件加速:opacity、translate3d
- 骨架屏
- Base64图片
- css占位
- 第三方插件:react-content-loader
- 懒加载:不重要部分延迟渲染
- ajax请求渲染
- setTimeout渲染
- requestAnimationFrame分片执行
- web worker多线程
- service worker
- 后台消息传递
- 网络代理,转发请求,伪造响应
- 离线缓存
- 消息推送
- 算法时间复杂度优化
- 使用文件hash让缓存最大化
- 合理的分包策略:基础库、公共模块
- 路由按需加载
- react-loadable(React16.6以前)
- react.lazy + react.Suspense(React16.6以以后)
- 组建按需加载
- react-loadable(React16.6以前)
- react.lazy + react.Suspense(React16.6以以后)
- 组建预加载:例如图表组建,假如按需加载则有个时间差,可以鼠标移动到元素时开始预加载
- 优先渲染骨架(antd 内置的骨架图Skeleton方案)
- 服务器渲染
- 缩小文件范围
- test、include、exclude
- resolve.modules:去哪些目录下寻找第三方模块(node_modules)
- module.noParse:忽略对部分没采用模块化的文件的递归解析处理(例如:jquery)
- DllPlugin:一些第三方不常变动的库编译一次即可(例如:react、react-dom)
- HappyPack:多进程处理打包
- js压缩:可开启多进程和缓存(ParallelUglifyPlugin || TerserJSPlugin)
- 区分环境(压缩文件、去除日志、接口环境等)
- css压缩
- 文件hash和资源文件指向CDN服务器
- Tree Shaking
- 提取公共代码
- 分割代码按需加载
- 作用域提升(Scope Hoisting)
- 输出分析