晓晓的个人博客Logo
晓晓的个人博客
《说说 Jest 的 --bail 参数与场景应用》封面
说说 Jest 的 --bail 参数与场景应用
本文围绕 Jest 的 --bail 参数展开,介绍其功能、工作原理及应用场景。--bail 是 Jest 命令行参数,能在测试文件失败时快速停止整个测试套件运行,配置支持布尔值和数字,默认为 0 。其工作原理是在文件级别,Jest 扫描测试文件并并行执行,文件内 it 块失败时,该文件内其他 it 块仍执行完,--bail 会触发信号终止所有运行的 worker 进程,不再启动其他测试文件。典型应用场景包括快速失败模式节省时间,如在 CI/CD 流水线中避免无意义测试浪费时间;还可用于调试特定测试,配合 --testPathPattern 等快速定位问题。总之,理解并应用 --bail 可提升测试流程效率。
215
0
2025-09-17 22:17
《为什么 page.waitForResponse 只适合“短时间内返回响应”的场景?》封面
为什么 page.waitForResponse 只适合“短时间内返回响应”的场景?
page.waitForResponse () 旨在为可预测、短时完成的网络请求提供简洁等待方案,其实现机制与之契合。一是 “一次性” 等待模式,返回 Promise,找到首个符合条件响应即 resolve 并停止监听,适用于 “只关心第一个” 场景。二是严格超时限制,默认 30 秒,超时则 Promise 被 reject 并抛 TimeoutError,避免资源耗尽或程序卡死。所以该方法适合明确且短时间返回的请求,若需长时间监控或捕获多个响应,使用事件监听器如 page.on ('response', fn) 更佳。
93
0
2025-09-12 23:19
《page.waitForResponse 的竞态条件与最佳实践》封面
page.waitForResponse 的竞态条件与最佳实践
尽管官方文档未详细阐述 page.waitForResponse 的竞态条件,但从官方代码示例、github issue 讨论及实际使用可知存在时间序列竞态和匹配条件竞态两种情况。时间序列竞态是因 waitForResponse 作为事件监听器,在注册前无法监听事件,而触发网络请求的操作延迟不定,在触发操作与监听器实际注册间的短暂窗口内,若请求完成,响应将无法被捕获,导致等待超时。匹配条件竞态是由于 waitForResponse 接受的判断函数若匹配条件宽泛,会匹配到多个响应,仅返回首个匹配的,可能并非期望的响应。文中分别给出了两种竞态的正确使用姿势,还强调出于性能考虑,不要在判断函数中进行如 response.json () 这样的繁重操作,应先快速过滤,再按需读取。
250
0
2025-09-11 22:28
《page.waitForResponse 执行环境:页面还是 Node.js?》封面
page.waitForResponse 执行环境:页面还是 Node.js?
文章聚焦 Puppeteer 中page.waitForResponse方法,指出该方法虽监听页面网络请求,但执行上下文环境是 Node.js 环境。接着详细剖析其底层原理,从 Node.js 层设置监听开始,到获取符合条件的HttpResponse对象,历经多步流程。包括启动浏览器时创建与 Chromium 的 WebSocket 通信通道,设置page.waitForResponse方法时,Puppeteer 先确认是否已开启网络监控,未开启则通过 WebSocket 向 Chromium 发送Network.enable消息(CDP 命令)启用网络监控并返回 Promise;Chromium 接收网络原始数据后,通过 WebSocket 发送Network.responseReceived CDP 事件;Puppeteer 将原始数据封装成HttpResponse对象并传递给 Node.js 层的predicate函数判断,符合条件则page.waitForResponse的 Promise 被 resolve,返回HttpResponse对象,同时停止监听并清理内部消息处理程序
262
1
2025-09-11 00:01
《被源网站风控的应对方案之破解相关(二)》封面
被源网站风控的应对方案之破解相关(二)
本文聚焦于 Chrome Extension 中请求头的动态设置。开篇指出 “JS 逆向工程” 能力虽能定位源网站风控关键点,但获取关键请求头部参数后,设置请求头是重要环节。官方提供 dynamic、session、static 三种请求头设置方案,鉴于业务扩展灵活性,作者倾向于前两者,本文着重阐述 dynamic 方案。文中详细介绍了 dynamic 方案实现代码,包括生成唯一规则 ID、检查规则是否存在、设置和清除更新规则等函数,同时说明 session 方案代码与之类似,但设计更复杂,设置时机为插件启动时。此外,还点明了如 'referer'、'origin' 等几个与风控相关且直接设置在 fetch 头部无效、需特别设置的请求头。最后,作者总结知识点,强调在合法合规前提下获取和运用数据,维护网络秩序。
999+
1
2025-06-05 12:02
《Defer 脚本会延迟 DOMContentLoaded 的触发时机吗?》封面
Defer 脚本会延迟 DOMContentLoaded 的触发时机吗?
本文围绕多个 defer 脚本对 DOMContentLoaded 事件触发的影响展开。当多个 defer 脚本下载与执行时,若有脚本下载缓慢或执行耗时,会阻塞延迟该事件触发,因浏览器遵循所有 defer 脚本执行完才触发此事件的规则。defer 脚本下载异步但执行同步,按顺序依次执行,任一脚本慢都会影响后续。DOMContentLoaded 事件延迟触发,会导致用户体验变差,页面交互功能无法工作,同时使 DOMContentLoaded 时间这一性能指标变差,影响性能测评分数。解决方案包括保持 defer 脚本轻量,避免重量级操作;进行代码拆分与合并,减少请求数与调度,拆分大脚本非关键逻辑到事件后执行。最后强调前端工程师应保证 defer 脚本轻量,且 defer 对页面内联 script 标签无效。
275
0
2025-09-02 21:13
《Defer 与 Web Component 协同应用的最佳抓取时机》封面
Defer 与 Web Component 协同应用的最佳抓取时机
文章聚焦于在 “服务端生成的 HTML 页面 + JS 以 defer 加载”,特别是 “SSR/SSG + Web Component + defer 加载 script 脚本” 场景下,探讨页面初始数据的最佳抓取时机。现代 Web 应用常采用此类技术组合,以兼顾 SEO 和用户交互体验。defer 不仅不阻塞 HTML 解析,还在 DOM 树构建完成后、DOMContentLoaded 执行前执行,Web Component 从定义到可用历经解析、注册升级两阶段。解析阶段创建 DOM 实例并设置属性,但此时无行为和样式,也无法获取私有属性初始值;注册升级阶段,defer 脚本执行 customElements.define,浏览器遍历 DOM 树升级组件,触发相关回调,使组件功能完整,此时可获取所有属性初始值。综上,DOMContentLoaded 事件触发后是抓取初始数据的最佳时机,此时标准 DOM 元素和 Web Component 实例创建且私有属性初始化完毕,可安全访问。
87
1
2025-09-01 23:27
《有关Service Worker的一些小事(本文持续更新)》封面
有关Service Worker的一些小事(本文持续更新)
本文围绕 Chrome Extension 中 Service Worker 展开,强调其对 Chrome Extension 应用的重要性,并记录关于它的一些关键细节点。指出每个 Chrome Extension 仅有一个 Service Worker,manifest 文件里设置的 js 文件在 Service Worker 每次启动及休眠后重启时执行,执行该文件若需设置持久性数据,要做好唯一性校验。还表明 Service Worker 休眠后,内存变量(全局变量)、特定监听函数及动态请求头设置规则会被清除,开发者应适时采用持久性缓存方案。同时说明多个插件的 Service Worker 环境相互隔离,一个插件内 Content 与 Service Worker 是 N - 1 关系,Content 触发 Service Worker 操作要做好唯一性校验,且建立长链接通信能唤醒休眠的 Service Worker,最佳实践是监听断联时机并重建长链接,以确保插件随时可用。最后表示内容基于实践测试,期待指正并会持续更新
999+
0
2025-06-03 16:22
《源网站数据采集方案之解析DOM(四)》封面
源网站数据采集方案之解析DOM(四)
本文介绍源网站数据采集方案,采用 Chrome Extension 实现,流程为 “打开 TAB 页 ->Dom 解析”。解析 Dom 有两种方案,本文先探讨不借助第三方库、由 Content 层用 DOM API 提取数据的方案,涉及服务端、插件端 Content 层和 Service Worker 层交互,还展示了获取百度首页搜索按钮文字的代码实现,最后提及该方案价值及后续将介绍的 “cheerio + chrome.scripting” 方案。
999+
0
2025-06-25 22:53
《被源网站风控的应对方案之请求重放(三)》封面
被源网站风控的应对方案之请求重放(三)
本文围绕在特定数据采集场景下,Chrome Extension 中 “请求重放” 方案的应用展开。当采集数据源于源网站 API,请求接口与用户地址栏存在唯一关键值且短时间难以突破风控关键点时,“请求重放” 方案登场。该方案基于用户正常打开源网站请求可通过风控系统这一现实依据,通过 Chrome Extension 实现请求及参数的获取与重放。文章详细阐述了获取请求内容和请求重放的具体实现过程,包括在 replayRequestUtil.js 和 service-worker.js 等文件中编写代码,利用 chrome.webRequest.onBeforeSendHeaders.addListener 监听请求,通过fetch等 API 重放请求。同时给出了本地交互 Demo 的测试流程,并强调方案未涉及持久化存储的原因,一是源网站风控可能检测请求时间,长时间存储的请求易失效;二是重放请求参数一致易被拦截,应控制重放次数。最后表明该方案仅适用于 API 数据获取,呼吁合法合规获取数据。
145
0
2025-06-10 23:49
1 页 / 共 2