记录--浏览器渲染15M文本导致崩溃怎么办

这篇具有很好参考价值的文章主要介绍了记录--浏览器渲染15M文本导致崩溃怎么办。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

记录--浏览器渲染15M文本导致崩溃怎么办

最近,我刚刚完成了一个阅读器的txt文件阅读功能,但在处理大文件时,遇到了文本内容过多导致浏览器崩溃的问题。

一般情况下,没有任何样式渲染时不会出现什么问题,15MB的文件大约会有3秒的空白时间。

<div id="content"></div>
fetch('./dp.txt').then(resp => resp.text()).then(text => {
  document.getElementById('content').innerText = text
})

尽管目前还没有严重的问题,但随着文件继续增大,肯定会超过浏览器内存限制而导致崩溃。

在开发阅读器的过程中,我添加了下面的样式,结果导致浏览器直接崩溃:

* {
  margin: 0;
  padding: 0;
}

html,
body {
  width: 100%;
  height: 100%;
  overflow: hidden;
}

body {
  column-fill: auto;
  column-width: 375px;
  overflow-x: auto;
}

预期结果应该是像下面这样分段显示:

记录--浏览器渲染15M文本导致崩溃怎么办

 然而,实际出现了下面的问题:

记录--浏览器渲染15M文本导致崩溃怎么办

因此,文件内容太多会导致浏览器崩溃。即使进行普通的渲染,我们也要考虑这个问题。

如何解决

解决这个问题的方法有点经验的前端开发工程师应该都知道可以使用虚拟滚动,重点是怎么对文本分段分段,最容易的可能就是按照一定数量字符划分,但是这个导致文本衔接不整齐出现文本跳动。如图,橙色和蓝色表示两端文本的衔接,虚拟滚动必然会提前移除橙色那块内容,那么就会导致蓝色文本位置发生改变。

记录--浏览器渲染15M文本导致崩溃怎么办

要解决这个问题,我们需要想办法用某个元素替代原来的位置。当前页橙色部分删除并计算位置,问题会变得复杂并且误差比较大,因此这一部分直接保留,把这部分前面的内容移除,然后用相同长度的元素占据,接下来重点就是怎么获取到橙色部分与前面内容的分界点。

获取分界点可以使用document.createRange()document.createRange()是 JavaScript 中用于创建Range对象的方法。Range对象表示一个包含节点与文本节点之间一定范围的文档片段。这个范围可以横跨单个节点、部分节点或者多个节点。

// 创建 Range 对象
const range = document.createRange();

range.setStart(textNode, 0); // 第一个参数可以是文本节点,第二个参数表示偏移量
range.setEnd(textNode, 1);
const rect = range.getBoundingClientRect(); // 获取第一个字符的位置信息

利用Range对象的特性,我们可以从橙色部分的最后一个字符开始计算,直到找到分界点的位置。

阅读器如果仅仅只是从左往右阅读,按照上面的方法已经可以实现,但是阅读器可能会出现页面直接跳转,跳转之后的文本起点你并不知道,并且页面总页码你也无法知道。因此从一开始就要知道每一页的分界点,也就是需要做预渲染。以下是一个简单的示例:

let text = '...'
const step = 300
let end = Math.min(step, value.length) // 获取结束点

while (text.length > 0) {
  node.innerText = value.substring(0, end) // 取部分插入节点
  const range = document.createRange()
  range.selectNodeContents(node)
  const rect = range.getBoundingClientRect() // 获取当前内容的位置信息

  if (rect.height > boxHeight) {
    // 判断当前内容高度是否会超出显示区域的高度
    // 如果超出,从 end 最后一个字符开始计算,直到不超出范围
    while (bottom > boxHeight) {
      // node.childNodes[0] 表示文本节点
      range.setStart(node.childNodes[0], end - 1)
      range.setEnd(node.childNodes[0], end)
      bottom = range.getBoundingClientRect().bottom
      end--
    }
  } else {
    // 如果没有超出,end 继续增加
    // ...
  }
}

上面只是简单的实现原理,可以达到精确区分每一页的字符,但是计算量有点太大,15MB文本大约500多万字,循环次数估计也在几十万到上百万。在本人的电脑上测试大约需要20秒,每个人设备的性能不同,所需时间也会有所不同。很明显,这种实现方式并不太理想。

后来我对这个方案进行了优化,实际上我们不需要计算每一页的分界点,可以计算出多页的分界点,例如10页、20页、50页等。优化后的代码是将step增大,比如设为10000,然后将不能组成一页的尾部内容去掉。优化后,15MB的文本大约需要4秒左右。需要注意的是,step并不是越大越好,太大会导致渲染页面占用时间过长。

这就是我目前用来解决页面渲染大量文本的方法。如果你有更好的方案,欢迎留言。

本文转载于:

https://juejin.cn/post/7261231729523965989

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 记录--浏览器渲染15M文本导致崩溃怎么办文章来源地址https://www.toymoban.com/news/detail-638009.html

到了这里,关于记录--浏览器渲染15M文本导致崩溃怎么办的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端面试:【浏览器与渲染引擎】工作原理与渲染流程

    嗨,亲爱的读者!你是否曾经好奇过当你在浏览器中输入URL并按下回车时,网页是如何显示在你的屏幕上的?这背后涉及了复杂的浏览器工作原理和渲染流程。本文将带你深入了解浏览器如何工作以及网页如何被渲染出来。 1. 浏览器的工作原理: 当你输入URL并按下回车时,

    2024年02月11日
    浏览(67)
  • 前端性能优化之浏览器渲染优化

    在当今互联网高速发展的时代,用户对于网页加载速度和性能的要求越来越高。作为前端开发者,我们需要关注并致力于提升网页的加载和渲染性能,以提供更好的用户体验。而浏览器渲染优化正是我们实现这个目标的关键。在本文中,我们将探讨一些关于浏览器渲染优化的

    2024年02月11日
    浏览(40)
  • 前端秘法进阶篇----这还是我们熟悉的浏览器吗?(浏览器的渲染原理)

    目录 一.浏览器渲染原理 二.渲染时间点 三.渲染流水线 1.解析html(Parse HTML) 1.1解析成DOM树(document object model) 1.2解析成CSSOM树(css object model) 2.样式计算(Recalculate Style) 3.布局(Layout) 4.分层(Layer) 5. 绘制(Paint) 6.分块(Tiling) 7. 光栅化(Raster) 8. 画(Draw) 四.附加面试题 1.什么是 reflow? 2.什

    2024年02月21日
    浏览(41)
  • 【autodesk】浏览器中渲染rvt模型

    Forge是什么 为什么能够渲染出来rvt模型 Forge是由Autodesk开发的一套云端开发平台和工具集。 在Forge平台中,有一个名为\\\"Model Derivative\\\"的服务,它可以将包括RVT(Revit)在内的多种BIM(Building Information Modeling)文件格式转换为可在Web上浏览和渲染的格式。 具体来说,\\\"Model Derivat

    2024年02月09日
    浏览(40)
  • 浏览器基础原理-安全: 渲染进程-安全沙盒

    由于渲染进程需要执行 DOM 解析、CSS 解析、网络图片解码等操作,如果渲染进程中存在系统级别的漏洞,那么以上操作就有可能让恶意的站点获取到渲染进程的控制权限,进而又获取操作系统的控制权限,这对于用户来说是非常危险的。所以我们需要引入安全沙盒。 安全沙盒

    2024年02月11日
    浏览(50)
  • JavaScript高级序列(一)–深入浏览器渲染原理

    1.1. 网页被下载的过程 一个网页URL从输入到浏览器中,到显示经历过怎么样的解析过程呢?  网页被下载的过程 整个过程我先做一个简单的概括: 下载 HTML 文件 当用户在浏览器中输入网址时,浏览器会向服务器发送请求,请求下载网站的 HTML 文件。 解析 HTML 文件 下载完成

    2024年04月10日
    浏览(42)
  • 渡一大师课笔记(重点:事件循环、浏览器渲染原理)

    响应式原理(渡一) 什么是数据响应式? 函数与数据的关联(重要) 数据变化后,会自动重新运行依赖该数据的函数(重要) 被监控的函数 render、computed回调、watch、watchEffect 函数运行期间用到了响应式数据(响应式数据一定是个对象) 响应式数据变化会导致函数重新运行

    2024年02月15日
    浏览(47)
  • 从浏览器输入地址到页面渲染都经历了哪些过程

    这是一道比较综合的面试题,答案也不是固定的,从浏览器输入地址到页面渲染经过了很多的过程,且每个过程都可以深挖出很多知识点,面试官可以用这一道题区分出不同面试者的水平。下面我们就来具体学习下本道面试题。 构建请求 1.查找强缓存 浏览器会先检查是否存

    2023年04月09日
    浏览(50)
  • 面试:浏览器从输入url到渲染页面,发生了什么

    用户输入阶段 合成 URL :浏览区会判断用户输入是合法 URL,比如用户输入的是搜索的,默认的搜索引擎会合成新的,如果符合url规则会根据url协议,在这段内容加上协议合成合法的url      查找缓存 网络进程获取到 URL,先去本地缓存中查找是否有缓存资源,如果有则

    2024年02月06日
    浏览(50)
  • 解决浏览器自动将http跳转至https导致无法访问的问题

    目录 解决方式 Chrome浏览器 Safari浏览器 Edge浏览器 注意事项 什么是HSTS? 写在最后         最近在宝塔面板申请免费的SSL证书后,部署证书的80端口下的网站可以通过https正常访问,但其他未部署证书的端口也被强制跳转至https请求,导致浏览器提示不安全从而无法访问。

    2024年02月03日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包