乐于分享
好东西不私藏

利用 SingleFile 插件实现超长网页手册的完整离线保存

利用 SingleFile 插件实现超长网页手册的完整离线保存

大家好,我是 Layton 。

有用户向我们反馈一个关于用户手册的问题,目前北尔电子官方针对 WebIQ Designer 组态工具仅提供 在线版 的用户手册。为了实现离线查阅,大家会习惯在浏览器里直接将网页另存为 HTML,或者通过浏览器虚拟打印输出 PDF。

但实际操作下来,往往会出现 内容严重截断 的问题,比如很多图片的位置都是空白,后半部分的正文也没有被保存进来。

今天,我们基于 Web 前端渲染的底层逻辑,解释下这里内容截断问题的核心原因,并为大家提供可能的离线保存解决方案,同时也探讨下这个机制在我们 HMI 开发时存在的性能关联影响。

1
为什么页面保存不完整

如果我们把一个保存不全的本地 HTML 页面直接打开,或者丢进代码编辑器,就能观察到几个典型的底层异常:

首先,在文件开头的导航目录里,页面表现得极为正常,包含了全部的章节索引,直到原本手册的最后的一个章节,所有的都在。

然而,我们继续往下滚动正文时,内容却会在比如第 5 章的某一处戛然而止。后面本还有十几个章节的大量内容,在正文中并不存在。

从网页源码里就可以很清楚地定位原因。

按下 F12 或直接查看该文件的源码底端,会发现最后一行代码突然地以 ... 结尾,甚至连 HTML 最基础的表格标签 </td> 和 </tr> 这种都来不及闭合。这在 Web 开发里是一个典型的 断头代码,就意味着浏览器在执行文件写入或者数据传输到一半时,被底层某种机制强行终止了。

即使在被保存下来的正文中,画面里本该显示配图的地方,此时也有一些位置是类似于 破裂样式 的图标。从这些图片的 <img> 标签会发现,它们的 src 属性全部硬编码指向了远程官方服务器的绝对网络路径。理解上,这些图片的抓取与下载线程也是没有执行完成,呈现出来一种资源加载失败的状态。

图例:破碎样式的图标

所以答案很简单,就是我们在执行保存的那一瞬间,整个网页在浏览器的内存堆栈里,是处于没有真正加载完的情况,在只拿到了部分的数据的时候,就被迫执行了落盘保存。

2
核心原因

原因就是现代网页开发为了 优化加载速度 和 提升性能 ,普遍采用了特殊的渲染机制。

最典型的就是 懒加载与滚动触发 。

为了提高首次打开速度,服务器一开始只发送网页的 骨架 和前几屏的内容。剩下的文字和图片,只有当用户向下滚动,可视区域开始接近对应内容时,JavaScript 才会触发请求去下载真实的资源。所以后面的内容在当前的浏览器内存里根本不存在,执行保存自然就没有这些内容。

而类似于 WebIQ 手册这类的大文档页面,现在很多都是单页应用 SPA。

页面看起来内容很丰富,但主要是靠前端 JavaScript 脚本在浏览器后台动态创建出来。没有加载出来的内容,最初就是个静态的 HTML 空壳,抓取到的是未执行或者还未完全执行 JS 的源码快照。变成本地文件后,HTML 文件也就失去了后续异步请求数据的能力,内容也就不能再被动态加载出来。

3
该如何解决超长网页的保存

为了把这类长网页说明书完整留存下来,有三种不同层级的解决办法。

第一种办法:手动滚,等待完全加载再保存

这是最原始、最不需要技术门槛,但也最费手的方法。

打开页面后,不急着点保存。先按住键盘上的 Page Down 键,或者慢速拖动右侧滚动条,从头到尾走一遍。这样做的目的是强迫浏览器的渲染引擎去触发每一个 DOM 节点的加载,确保所有图片、表格和文本都从内存缓冲区里被抓取和加载出来。

完成这套物理加载后,再执行另存为或虚拟打印。

注意:如果输出 PDF,在打印设置里必须勾选 背景图形,否则所有的底色和图标依然会变成一片惨白。

第二种办法:用外挂,控制台代码自动滚动加载

如果说明书极长,自己手动滚的过程中一定是非常费手,可以搞一个 自动化外挂 来替代实现这个滚动过程。

我们可以直接利用浏览器的 Console 控制台 注入一段自动化外挂脚本:

1. 按下 F12 或者在网页空白处右键选择 检查 打开 开发者工具DevTools。

2. 切换到 Console(控制台)标签页。

3. 在控制台输入一段实现自动平滑向下滚动的 JavaScript 代码并回车执行(PS:代码可以请 AI 助手设计)。

图:伪代码示例

4. 这时候就可以看到网页会匀速地自动向下滚动,过程中强迫所有采用了懒加载的图片和文字现出原形。当彻底滚到底部,控制台会自动弹出加载完成确认框。

此时再执行网页保存或打印 PDF,就能得到 100% 完整的状态。

第三种办法:最简单的办法,插件

对这种长页面,其实最简单、最省力、成功率最高的做法,就是直接使用专业的浏览器插件,比如今天我们介绍的 SingleFile 。它能够一键解决所有痛点,是当前看起来最优雅的终极方案。

4
SingleFile 插件的使用

SingleFile 是一个强大的开源浏览器扩展,能打破浏览器的默认落盘限制,支持几乎所有主流浏览器。以下是针对 Edge/Chrome 离线保存 WebIQ 手册的快速通关流程:

1. 安装插件: 在 Edge 扩展商店或 Chrome Web Store 中搜索 SingleFile(认准原作者 gildas-lormeau 的正版版本),一键添加至浏览器。

2. 核心配置: 安装完成后,将插件图标固定到工具栏。

3. 一键保存 WebIQ 手册: 此时,再打开 WebIQ Designer 的超长在线说明书页面。不需要手动滚动,也不需要开控制台注入代码,直接点一下工具栏上的 SingleFile 图标就行。

插件会在网页顶部或者底部拉起一条进度条。它的底层机制会自动在后台对整个页面的 DOM 树进行深度扫描、自动触发滚动、并将所有远程图片资源打成 Base64 编码直接内嵌。

稍等几秒钟,它就会把整个宏大的文档打包成一个单一的、完全离线的、排版和原本几乎没有差异的 .html 文件下载到本地电脑。

以我们这次测试的 WebIQ 完整手册为例,打包出来的最终本地 HTML 文件大约在 115 MB 左右,当然也可以继续转换为 PDF 版本。有了这个单文件,无论是本地查看,还是以后喂给 AI 知识库学习做 Agent,都会更加方便。

5
凭什么 SingleFile 能做到完美保存

SingleFile 的底层逻辑和普通浏览器的 另存为 功能完全不同。

传统的保存方式就是去重新向服务器请求一份最原始的 HTML 源码。但在现代前端架构下,初始 HTML 往往只是一个空壳。

SingleFile 不依赖初始源码。它的探针会直接切入浏览器的内存堆栈,读取当前已经被 JavaScript 脚本跑完渲染完的最终状态 DOM 树,所以可以从源头上堵住 代码未闭合 或 内容截断 的发生,从根本上保证动态数据的完整性。

类似于刚才说的外挂,SingleFile 可以自动化触发懒加载过程,自动模拟极速向下滚屏的动作。它会等到整个页面的元素包括图片全部被 下载并注入到内存缓冲区之后,才真正执行保存的动作。

还有,它能把文件打包成 115 MB 一个单一大文件的核心原因在于其 基于 Base64 编码资源的内联化。为了彻底断绝网页对外部网络以及文件的依赖,SingleFile 会把网页引用的所有外部分离资源,包括各类图片,CSS 样式表,甚至特殊的字体,全部通过算法转化为 Data URL / Base64 编码的超长文本字符串。这意味着,所有的需要的元素都被物理缝合进了 HTML 的 骨架代码 内部。它就会是一个单一的文件。

SingleFile 还有一个好处,就是它还会 清洗代码,包括移除可能在离线状态下导致异常的第三方广告拦截和追踪脚本。

6
弱配 HMI 硬件的懒加载机制

在工业级 Web 开发与 HMI 组态中,我们也面临着极其相似、甚至更加严酷的底层挑战。

以 X3 这类 HMI 或物联网终端设备为例,即便它们的硬件性能已经大幅跃升,但其物理内存与 CPU 算力,依然无法与普通 PC 相提并论。

假设一个基于 Web 构建的 HMI 单页工程,里面塞满了大量的 Web 元素,比如复杂的矢量图表、动态仪表盘,还有各类历史曲线。如果系统在启动时,要求浏览器把所有页面的 DOM 节点全部一次性加载并常驻内存,浏览器可能就会因为内存暴涨而直接卡死、闪退或崩溃。

所以为了保证性能的绝对可控,诸如 WebIQ 这类高级 Web HMI 引擎都会采用 组件级的懒加载与内存释放策略:

当操作员在屏幕上点击切换到其他画面时,系统会立刻对非活动视图执行强行销毁。通过将非当前可视区域的 HTML 结构与绑定的 JavaScript 上下文彻底从内存堆栈中抹去,来释放出硬件资源。

这也是目前前端性能优化在工业可视化领域的必要做法,只渲染当前屏幕看得见的数据,不给系统增添任何不必要的负担。

虽然用户下次切回该画面时,浏览器重新获取数据并激活 DOM 树需要一点点时间,但这几百毫秒的 按需懒加载 带来的微小渲染延迟,换来的却是 弱配硬件系统更高的稳定与抗崩溃上限。

7
写在最后

技术往往都有一体两面的双面性。懒加载机制,对于前端开发来说是应对性能问题的重要手段,但对于需要离线保存网页的用户,包括习惯了传统爬虫的工程师却会带来一些麻烦。

然而正是这样,技术的生态环境才得以不断进化,比如 SingleFile,比如更加高级的面对更复杂的动态交互与深层沙盒阻碍的 Puppeteer 自动化抓取。

也正是因为有了懒加载的加持,包含数万条历史事件的工业大报表才得以在现代网页上丝滑滚动,而搭载在弱配硬件终端上的现代工业 Web HMI 网页,也才能够在严苛的性能环境下稳定地长效运行。

8
写在最后的最后

例行免责声明

为了让大家更专注地了解北尔电子的产品特性,本文仅就其技术方案进行纯粹的技术探讨与经验分享,旨在为用户提供参考。我们尊重行业内所有品牌的技术路径,因此文中不会涉及、亦不对任何其他友商竞品的功能差异进行对比或评判。感谢您的理解与支持,希望能为您带来实质性的技术启发。