0%
Linux 课后练习题
发表于 分类于 Linux
本文字数: 21k 阅读时长 ≈ 19 分钟
动态规划算法详解
发表于 分类于 算法
本文字数: 9.9k 阅读时长 ≈ 9 分钟
动态规划(Dynamic Programming,DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。它的核心思想是利用历史记录避免重复计算。本文将从基础到进阶,全面讲解动态规划。
分治算法详解
发表于 分类于 算法
本文字数: 17k 阅读时长 ≈ 15 分钟
分治算法(Divide and Conquer)是一种重要的算法设计思想,它将一个复杂的问题分解成若干个相同或相似的子问题,递归地解决这些子问题,然后将子问题的解合并成原问题的解。本文将从概念到实践,全面讲解分治算法的思想、适用场景及常见题型。
服务端基础(前端视角)
发表于 分类于 后端
本文字数: 1.1k 阅读时长 ≈ 1 分钟
部署与运维入门 — Docker / CI-CD / Nginx
发表于 分类于 后端
本文字数: 2.3k 阅读时长 ≈ 2 分钟
DOM 渲染优化
发表于 分类于 性能优化
本文字数: 3.1k 阅读时长 ≈ 3 分钟
一、避免频繁读写 DOM
缓存 DOM 引用
1 | var dom = document.querySelector('element'); |
缓存读取的属性
1 | // ❌ 每次循环都读取 dom.style.left(触发回流) |
合并多次写操作
1 | // ❌ 每次循环都修改 innerHTML |
使用 DocumentFragment
1 | const fragment = document.createDocumentFragment(); |
二、CSS 避免重排重绘
基本原则
- 使用
className替代多次style操作 - 使用
visibility:hidden替代display:none(前者只触发重绘,后者触发重排) - 避免使用
table布局 - 对动画元素使用
absolute/fixed - 对 resize 事件做防抖节流处理
开启 GPU 渲染动画
以下属性可以避免主线程频繁操作:
transform:不触发 Layout,只触发 Compositeopacity:不触发 Layout,只触发 Compositewill-change:提前告知浏览器优化
transform
1 | /* ❌ 触发 Layout */ |
opacity 优化阴影动画
通过伪元素配合 opacity 过渡替代 box-shadow 过渡:
1 | div::before { |
will-change
1 | .animate { |
使用原则:
- 不要应用到太多元素上
- 在变化前通过 JS 添加,变化完成后移除
- 给浏览器足够的时间做优化准备
三、JS 避免重排重绘
引起回流的属性
读取以下属性会强制触发回流:
1 | offsetTop / offsetLeft / offsetWidth / offsetHeight |
读写分离
1 | // ❌ 每次修改都触发强制回流 |
使用 display:none 离线操作
对于需要多次操作的 DOM 元素,先设置为 display:none,操作完毕再显示:
1 | el.style.display = 'none'; |
使用 cloneNode
1 | const clone = el.cloneNode(true); |
四、简化 DOM 结构
DOM 结构越深,内部元素变化引发的祖先重排越多。对于大量数据表格的展示,使用分页而非一次性渲染数万个 DOM。
五、DOM 事件优化
事件委托
1 | // 在父容器绑定一个事件,通过 target 分发 |
节流
1 | function throttle(func, wait) { |
防抖
1 | function debounce(func, wait) { |
JavaScript 执行优化
发表于 分类于 性能优化
本文字数: 1.5k 阅读时长 ≈ 1 分钟
React 性能优化
发表于 分类于 性能优化
本文字数: 5.2k 阅读时长 ≈ 5 分钟