H5开发工作经验笔记
发布日期:2021-05-18 05:51:43 浏览次数:18 分类:精选文章

本文共 4664 字,大约阅读时间需要 15 分钟。

性能优化与常见问题处理

在网页开发过程中,性能优化和问题处理是开发者需要不断关注的重点。本文将简要介绍一些实用的解决方案和注意事项。

1. DOM 操作优化

在进行DOM操作时,避免频繁地对DOM结构进行修改,以减少浏览器的重绘次数。以下是一些优化建议:使用documentFragment技术

例如,表格的生成可以通过创建文档碎片的方式来实现,减少对主文档的频繁操作。具体操作如下:

let table = document.getElementById("u-table");let fragment = document.createDocumentFragment();// 使用循环创建行和单元格并加入文档碎片中fragment.appendChild(...); // 将所有行添加到文档碎片中table.appendChild(fragment);

这种方式只会引起一次重绘,相比传统的直接添加方式,减少了对页面的刷新次数,提高了性能。

2. 减少重绘

避免将多次样式改变合并成单次操作。这一点在布局样式设置时尤为重要。例如,将多个样式改动一次性应用至多个元素,而不是逐个应用,可以显著减少重绘次数。

设置为fixed或absolute的元素不会影响其他元素的布局,但由于这些元素脱离文档流,可能会影响外观布局,因此需要谨慎使用。

3. 适当使用CSS Rather than DOM操作

在处理布局和样式变化时,优先使用CSS来完成,而不是直接操纵DOM。CSS操作通常比DOM操作更高效,因为浏览器可以直接.mapper到具备转换后的看待方式,从而减少重绘操作带来的开销。

4. 避免频繁添加格式化的文本元素

使用文本节点的追加操作或文档片段的使用,减少对p标签、span等元素的频繁添加。文本节点更轻且易于处理,可以类似于以下方式实现:

let textNode = document.createTextNode('Hello, World!');alertTextNode sigmoid](...);

5. 处理多个元素的布局问题整体处理,而非逐个处理

例如,可以通过创建一个整体的布局框架,将所有需要调整布局的元素合并到一个内部容器中,每次操作这个内部容器,然后将结果复制到主文档中。这种方式可以减少对外部布局的破坏,提高性能。

6. 避免使用内联样式

在某些情况下,直接使用内联样式可能需要更多的CSS处理,增加了组件化上的复杂性。使用external CSS类名和可扩展结构化的方法,可以提高代码的易维护性和效率。例如,使用类名而非style属性:

这是错误的做法。

这才是正确的做法。非常高效且易于管理的方式。

7. 处理JavaScript错误,及时抛出错误信息

使用try-catch块,处理JavaScript执行过程中可能出现的错误,及时定位代码错误,避免轮空页面的死机。例如:

try {    // 你的业务逻辑} catch (error) {    console.error('发生错误:', error.toString());    // 处理错误,可能弹出提示等}

8. 大量文本的处理,采用分段处理的方式

对于大量文本内容,可以采用分段处理的方式,避免一次性加载大块文本,降低内存占用和处理开销。例如,使用JavaScript生成多个text节点并逐一追加。

9. 减少不必要的DOM遍历

减少不必要的DOM查询和遍历操作,这会显著提高DOM的性能。可以使用缓存存储重复使用的元素和属性查询结果,减少查询次数。例如,创建一个缓存对象保存常用元素查询结果:

const elementCache = {};function getElementById(id) {    if (elementCache[id] !== undefined) {        return elementCache[id];    }    const element = document.getElementById(id);    elementCache[id] = element;    return element;}

10. 处理微任务队列

在单线程模型中,需要正确处理微任务队列,避免长时间的回调延迟影响用户体验。对于多个微任务,可以合理安排执行顺序,或者分批次处理,例如使用offsetTopाकर将任务分为多批,逐步处理。例如:

function BulkProcessMicrotasks(taskList, batchSize) {    // 分批处理,确保每次处理不超过batchSize个任务    let index = 0;    while (index < taskList.length) {        const batch = taskList.slice(index, index + batchSize);        index += batch.length;        // 执行批次        batch.forEach(task => task());        // 提前计算预计完成时间    }}

11. 处理特定元素的样式操作避免重复

使用CSS类名和命名空间的方式,对多个元素进行样式操作,可以减少重复代码并提高效率。例如:

// 可以通过样式表达为:.class1, .class2 { /* styles */}

12. 事件绑定优化

使用事件委派的方式,减少对同一元素多次绑定事件的操作,提高内存占用效率。例如,在父元素上绑定事件,然后在事件处理函数中查找涉及到的子元素。如果无法实现,使用removeEventListener确保绑定解除,释放资源。例如:

// 事件委派绑定document.getElementById('parentElement').addEventListener('click', function(event) {    const elem = event.findElement('.childElement');    if (elem) {        elem.preventDefault();        // 处理逻辑    }});

13. 避免不必要的布局重新计算

在布局计算过程中,对于不需要参与集合的元素,确保不进行多余的布局计算,以提高性能。例如,固定布局的child nodes不需要重新计算父布局的完整属性。浏览器内部会自动处理,所以在大多数情况下不需要介入。

2. 常见问题解决方案

很多开发者在日常工作中会遇到一些常见问题,以下是一些解决方案。

a. 表单验证中的阻止表单默认行为

使用e.preventDefault()来阻止表单的默认提交行为,可以避免不必要的页面跳转和数据丢失。比如:

b. 弹出层不影响滚动

在移动端,弹出层可能会影响页面的滚动,导致用户在弹窗打开时仍然可以滑动浏览页面。以下是一种解决方案:

function bodyScroll(event) {    event.preventDefault();}// 在触发弹窗时禁用滚动document.body.addEventListener('touchmove', bodyScroll, false);// 当弹窗被关闭时,恢复滚动document.body.removeEventListener('touchmove', bodyScroll, false);// 关闭弹窗时启用初始布局document.body.style.position = 'initial';document.body.style.height = 'auto';

c. 插入大量的空格

添加大量空格会影响布局和性能,避免使用多个空格使用空格字符,而是使用css中的multiple whitespace控制。例如,使用white-space: pre;可以保留空格,使用white-space: normal;来系统处理文本。这将节省内存并提高布局效率。可以看具体案例来决定使用哪种方式。例如:

测试这行的处理方式如何处理多个空格

3. 学习注意事项

在日常的开发中,保持 declarative thinking(声明式思维)是非常重要的。尽量少地进行 DOM操作,除非绝对必要。以下是一些常见注意事项:

1. CSS 盗 filtrate

尽量减少重绘次数,减少对固定位置布局的使用。在不需要千分之一级精确布局时,使用absolute和fixed布局,将增加回流和重画,影响性能。建议优先使用flexbox和grid布局,这样可以减少因布局计算而产生的复杂性和开销。例如:

父元素设置为display: flex,并使用合理的基数点,将子元素整齐排列。这样可以减少布局递归问题,提高性能。

2. 行高和垂直对齐基线设置

给出合理的行高和垂直对齐基线值,尤其是在使用inline-block和float布局时,能够确保元素的内容排列是正确和一致的。如果处理不当,可能会引发多次回流和重新绘制,进而影响性能。

3. 一次性操作

将尽可能多的一次性操作集中到同一个周期中,避免多次频繁调用函数。比如,创建了一组元素之后,直接将它们添加到文档中,而不是逐个添加可以减少对文档流的影响,并减少DOM操作次数。预先准备好一个文档碎片,然后一次性复制到目标位置是更好的选择。这样只会增加一个绘图操作是主页内容的元素和新内容的组合,这四次绘制的次数被大大减少了好的建议来减少重绘次数。

4. 处理多层级的 DOM 树结构的一次插入

在构建复杂的DOM结构后,尽量一次性插入到某个位置,而不是分步骤添加。充分利用文档碎片技术,将所有子节点一次性添加到父节点中,这样对主文档只触发一次重绘(即将所有节点复制到新的文档碎片中,然后一次性添加到父节点中)。这样操作的效率远高于逐个添加旧节点的操作,减少的单次重整次数将减少多达许多倍的操作次数。而不需要对parent节点进行多次回流操作,提升了性能表现。这种方式的代码示例可能类似于下面的代码块:

// 创建源文档碎片let parent = document.getElementById('parent');let fragment = document.createDocumentFragment();// 添加新节点到碎片fragment.appendChild(newElement);// 将碎片编入父节点parent.appendChild(fragment);

这样操作只会对父节点的布局进行一次绘制(将两个文档碎片整合到主文档中),而不是对父节点的每个子节点进行多次绘制。这种方法弱打破了最坏情况下减少了会导致的重绘次数并节省了循环时间,还可以确保无事件绑定在这些新添加的节点上,这对于性能至关重要。

5. 设定元素访问的大小临界点

知道页面的总面积是怎样分布的,决定了大小哪些元素会被渲染到页面中,较大元素被视图频繁访问,从而影响性能。通过合理规划布局结构,可以减少大型元素对你除了内存占用外还有渲染开销带来的负面影响

上一篇:python列表的使用
下一篇:Android与iOS系统默认的一些样式差异

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年05月03日 04时12分12秒