当前位置: 首页 > news >正文

WHAT - HTMLRewriter 介绍(页面优化、SEO、广告注入)

文章目录

  • 一、概念
  • 二、典型应用场景
  • 三、基本用法(Cloudflare Workers 示例)
  • 四、Handler 可用方法
    • 1. element(element)
    • 2. text(textChunk)
  • 五、局限性
  • 六、简单对比

一、概念

HTMLRewriter 是一种 流式 HTML 解析与重写工具

它常见于 Cloudflare Workers 等边缘计算平台,用来在 HTML 文档传输过程中,对响应内容进行实时解析、修改或增强,而无需等到整个文档下载完成再操作。

它的特点是:

  • 流式解析:逐块读取并处理 HTML,适合边缘和大规模场景,内存占用低。
  • 选择器 API:类似于浏览器的 querySelector / querySelectorAll,可以匹配元素。
  • 事件驱动:对匹配到的 HTML 元素执行回调,比如修改属性、替换文本、插入内容。
  • 高性能:适合对大体量 HTML 文档做轻量变更。

二、典型应用场景

  1. 页面注入

    • 动态插入广告、统计代码、AB 实验脚本。
  2. 内容替换

    • 修改 HTML 中的文字、替换图片地址。
  3. SEO 优化

    • 在页面返回时,动态调整 meta 标签。
  4. 多语言支持

    • 根据请求头语言,替换部分文案。
  5. 隐私与安全

    • 自动清理敏感信息或过滤危险标签。

三、基本用法(Cloudflare Workers 示例)

export default {async fetch(request, env, ctx) {const response = await fetch("https://example.com")return new HTMLRewriter().on("title", new TitleHandler()).on("a", new LinkHandler()).transform(response)},
}class TitleHandler {element(element) {element.setInnerContent("新的标题")  // 替换 <title>}
}class LinkHandler {element(element) {element.setAttribute("target", "_blank") // 修改 <a> 标签属性}
}

说明:

  • new HTMLRewriter() 创建重写器实例。
  • .on(selector, handler) 注册处理器,对匹配到的元素进行修改。
  • handler 是一个对象,可以定义多个方法(如 element()text())。
  • .transform(response) 返回修改过的 Response

四、Handler 可用方法

1. element(element)

当解析器遇到匹配的 HTML 元素时触发。
常见 API:

  • element.setInnerContent(content, options) → 替换内容
  • element.append(content, options) → 追加内容
  • element.prepend(content, options) → 前置内容
  • element.remove() → 移除元素
  • element.setAttribute(name, value) → 设置属性
  • element.removeAttribute(name) → 删除属性

2. text(textChunk)

当匹配的元素内部有 文本节点 时触发(会被分块调用)。
常见 API:

  • textChunk.text → 获取文本
  • textChunk.replace(content) → 替换文本

五、局限性

  • 不能执行 JavaScript(只改 HTML 结构)。
  • 不能像 DOM API 那样完整支持所有操作(它是流式处理)。
  • 主要用于 服务端/边缘侧的 HTML 重写,而非浏览器端动态修改。

六、简单对比

工具运行位置特点
HTMLRewriter边缘/服务端流式解析,低内存,实时修改 HTML 响应
DOMParser浏览器端需要完整加载 HTML,内存占用高
cheerioNode.js类 jQuery API,需完整 DOM 构建

👉 总结一句:HTMLRewriter 是边缘计算环境下的流式 HTML 修改工具,可以在响应传输过程中实时替换标签、属性和内容,非常适合性能敏感的页面优化、SEO、广告注入等场景。


文章转载自:

http://2Tx18HEw.bpmns.cn
http://r0CCkIyn.bpmns.cn
http://Wiet2Mpx.bpmns.cn
http://y7VWzS4u.bpmns.cn
http://Q8GYwv8e.bpmns.cn
http://omdbHoKE.bpmns.cn
http://q4sqnyWC.bpmns.cn
http://K0csT6Cl.bpmns.cn
http://vXzJGSe0.bpmns.cn
http://DjhYGuIt.bpmns.cn
http://lizFjgi2.bpmns.cn
http://afA7r0fB.bpmns.cn
http://4to5sfpg.bpmns.cn
http://8lKiTiBu.bpmns.cn
http://yg8vHNh5.bpmns.cn
http://0LBzrOmV.bpmns.cn
http://OjpvRd9u.bpmns.cn
http://D0nDglvj.bpmns.cn
http://NdwNV9tX.bpmns.cn
http://610yhN5n.bpmns.cn
http://8EmJNtpE.bpmns.cn
http://3WQdvbGA.bpmns.cn
http://0SdcKjeN.bpmns.cn
http://CvuCf6qh.bpmns.cn
http://SbZhyl5T.bpmns.cn
http://W2NWT444.bpmns.cn
http://yo94PPra.bpmns.cn
http://7srbNksX.bpmns.cn
http://JhLFztnH.bpmns.cn
http://JWlQsbhO.bpmns.cn
http://www.dtcms.com/a/363175.html

相关文章:

  • C++入门自学Day17-- 模版进阶知识
  • 从程序员到「认识罕见病 DAO」发起人,他用 Web3 承载爱与责任
  • C# 简述委托,Func与Action委托。 他们之前有什么区别?
  • MCU上跑AI—实时目标检测算法探索
  • 将css中的线性渐变,径向渐变,锥心渐变,转成canvas中的渐变
  • 【高并发内存池】三、线程缓存的设计
  • SpringBoot3中使用Caffeine缓存组件
  • Ruoyi-vue-plus-5.x第三篇Redis缓存与分布式技术:3.2 缓存注解与使用
  • 悬停头部的实现方式之一 css: position: sticky
  • SQL Server-查询事务日志
  • 血缘元数据采集开放标准:OpenLineage Guides 在 Spark 中使用 OpenLineage
  • B2B营销面临的一些主要问题
  • 3025. 人员站位的方案数 I
  • HDI线路板与普通板有何区别?厂家生产难度在哪?
  • 【leetcode】236. 二叉树的最近公共祖先
  • 《“人工智能+”行动意见》深度解析:从智能红利到产业落地,直播SDK的技术价值与应用路径
  • Kafka:Java开发的消息神器,你真的懂了吗?
  • 货运系统源码 货运物流小程序 货运平台搭建 货运软件开发
  • 深度学习——基于卷积神经网络实现食物图像分类【4】(使用最优模型)
  • Directus搜索功能:全文检索和高级过滤的技术实现
  • LeetCode22生成括号算法
  • 【开题答辩全过程】以 基于PHP的蔬菜食杂购物系统为例,包含答辩的问题和答案
  • 完全背包|dfs
  • qt安装FFmpeg后编译遇到error: collect2.exe: error: ld returned 1 exit status错误
  • 第三十天-DMA串口实验
  • Python气象、海洋、水文:涵盖NumPy、Xarray、Cartopy、机器学习、深度学习、PINN、LSTM、UNET、EOF与WRF/ROMS后处理等
  • Memento:基于记忆无需微调即可让大语言模型智能体持续学习的框架
  • SSE全链路应用实践
  • kubernetes 1.31 节点之间(1个master ,多个worker)使用了哪些端口及防火墙设置
  • 软件测试面试题【内附超详细面试宝典】