Vite 插件如何用 transformIndexHtml 转换 HTML?

发布时间:2026/11/4 8:57:07

Vite 插件如何用 transformIndexHtml 转换 HTML? Vite 插件如何用 transformIndexHtml 转换 HTML【免费下载链接】viteNext generation frontend tooling. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vi/vite如果你的需求是在构建或开发过程中程序化地改写 HTML 入口文件——比如替换title、按构建状态向head注入script或link标签——就需要在 Vite 插件里实现transformIndexHtml钩子。这是 Vite 独有的插件钩子Rollup 会忽略它会在 dev 和 build 两种场景下自动作用于 HTML 入口文件如index.html。钩子是async、sequential调用的属于 per-environment 钩子。什么时候需要写这个钩子Vite 内置了简单的 HTML 常量替换任何import.meta.env中的属性都可以用%CONST_NAME%语法写进 HTML见 env-and-mode.mdh1Vite is running in %MODE%/h1 pUsing data from %VITE_API_URL%/p但 Vite 对条件分支这类复杂替换是刻意保持不干预的。当简单替换不够用时文档给出的扩展方式就是使用社区现成的转换类插件或自己写一个实现transformIndexHtml钩子 的自定义插件。两个前置结论先说明插件可以直接内联在vite.config.js里不需要为此新建一个包见 using-plugins.md。如果你使用的框架自己接管了入口文件文档以 SvelteKit 为例这个钩子不会被调用写之前先确认项目是否属于这种情况。最短主路径返回替换后的 HTML 字符串钩子接收当前 HTML 字符串和一个转换上下文最简单的写法是直接返回替换后的字符串以下示例来自 api-plugin.md 的官方示例const htmlPlugin () { return { name: html-transform, transformIndexHtml(html) { return html.replace( /title(.*?)\/title/, titleTitle replaced!/title, ) }, } }把它注册到vite.config.js的plugins数组即可import { defineConfig } from vite export default defineConfig({ plugins: [htmlPlugin()], })plugins中的 falsy 项会被忽略所以可以用条件表达式方便地启用/停用插件。三种返回值改字符串、注入标签、两者同时做钩子可以返回以下三者之一转换后的 HTML 字符串——上面的标题替换例子标签描述对象数组{ tag, attrs, children }——注入到现有 HTML 中每个标签可单独指定注入位置默认注入到head的开头同时包含两者的对象{ html, tags }。标签描述符的完整类型如下来自文档的 Full Hook Signaturetype IndexHtmlTransformHook ( html: string, ctx: { path: string filename: string server?: ViteDevServer bundle?: import(rolldown).OutputBundle chunk?: import(rolldown).OutputChunk originalUrl?: string }, ) IndexHtmlTransformResult | void | PromiseIndexHtmlTransformResult | void type IndexHtmlTransformResult | string | HtmlTagDescriptor[] | { html: string tags: HtmlTagDescriptor[] } interface HtmlTagDescriptor { tag: string /** * attribute values will be escaped automatically if needed */ attrs?: Recordstring, string | boolean children?: string | HtmlTagDescriptor[] /** * default: head-prepend */ injectTo?: head | body | head-prepend | body-prepend }其中attrs的值在需要时会被自动转义。第二个参数ctx在 dev 时暴露ViteDevServer实例在 build 时暴露输出 bundle——也就是说同一个钩子函数可以按运行阶段读取不同的上下文信息完整类型声明见 api-plugin.md。用order控制钩子的执行时机钩子也可以写成对象形式IndexHtmlTransformHook | { order?: pre | post, handler: IndexHtmlTransformHook }。默认order为undefined钩子在 HTML 已被转换之后应用order: pre在 Vite 处理 HTML 之前应用文档明确给出的用途是注入需要经过 Vite 插件流水线的 scriptorder: post在所有order为 undefined 的钩子之后应用。const myPlugin () ({ name: inject-pre-script, transformIndexHtml: { order: pre, handler(html) { return [{ tag: script, attrs: { src: /entry.js } }] }, }, })注意这和插件级的enforce: pre | post调整整个插件相对 Vite 核心插件的位置是两回事见 api-plugin.md 的 Plugin Ordering 一节。如何验证转换生效钩子在 dev 和 build 下都会被调用Vite 插件的默认行为是两种场景都执行所以验证分两条dev启动开发服务器后直接访问入口 HTML 页面检查渲染出的title、注入的标签是否按预期出现order: pre注入的 script 应当走 Vite 的模块处理流程。build运行构建命令检查产物中对应 HTML 文件里的替换/注入结果确认钩子在构建阶段同样生效。调试插件时文档建议把vite-plugin-inspect加入项目安装后访问localhost:5173/__inspect/可以检查模块和转换栈的中间状态。边界与限制框架接管入口文件时钩子不触发文档特别警告若框架对入口文件有自定义处理例如 SvelteKittransformIndexHtml不会被调用。钩子作用域是 per-environment跨环境行为以 api-environment-plugins.md 的说明为准。%CONST_NAME%不存在的变量不会被替换保留原样这与 JS 中import.meta.env.X得到undefined的行为不同复杂逻辑不要指望它交给本钩子。另有一个同名程序化 API自定义 SSR 中间件里可以用vite.transformIndexHtml(url, template)手动对模板应用 Vite 内置 HTML 转换和插件 HTML 转换见 ssr.md 与 api-javascript.md。那是服务端渲染中间件场景的用法与插件钩子本身是不同入口按需选择。【免费下载链接】viteNext generation frontend tooling. Its fast!项目地址: https://gitcode.com/GitHub_Trending/vi/vite创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/4 8:55:05

STM32F407四路电机编码器驱动与PID角度控制实战

简介:面向需要同时管理多路步进电机的嵌入式开发者,这套基于STM32F407VET6的驱动工程实现了四路电机的速度与方向控制,并通过编码器反馈完成闭环角度精确定位,适用于机器人、自动化设备等运动控制场景。压缩包共171个文件&#xf…

2026/11/4 8:54:17

PostgreSQL Schema管理与优化实战指南

1. PostgreSQL Schema基础概念解析 在PostgreSQL数据库体系中,schema(模式)是一个至关重要的逻辑容器概念。简单来说,它就像是数据库里的文件夹系统,允许我们将表、视图、函数等数据库对象进行分组管理。每个PostgreSQ…

2026/11/4 8:54:17

Agent静默截断排查:源端50条数据为何模型只看到20条

做 Agent 的同学应该都有过这种经历:你明明在源端准备好了 50 条候选数据,模型回答里却只体现出了 20 条的信息。它不报错、不警告、不告诉你少了一半,就静悄悄地用剩下那部分内容给你交差。我第一次遇到这个问题是在调一个检索增强型 Agent …

2026/11/4 8:54:17

LEF/DEF 5.8 格式规范详解:物理设计中避坑与DRC通关的核心依据

简介:本资源是Cadence官方发布的《LEF/DEF 5.8 语言参考》PDF手册,面向集成电路物理设计工程师、EDA工具使用者及VLSI课程学习者,系统解决LEF/DEF格式在工艺建模、单元库定义、布局布线描述与跨工具数据交换中的核心语法与规范理解问题。文件…

2026/11/4 8:54:17

PostgreSQL Schema管理与最佳实践指南

1. PostgreSQL Schema基础概念解析 在PostgreSQL数据库体系中,schema是一个非常重要的逻辑容器概念。简单来说,schema就像是数据库里的文件夹,它可以帮助我们更好地组织和管理数据库对象。每个schema可以包含表、视图、索引、序列、数据类型、…

2026/11/4 8:54:17

用Rerank做文本分类?16组实验全记录与踩坑复盘

1. 先说说我为什么动了这个念头前两天接了个需求:一批业务场景文本,要判定它们是否属于某个风险类型。数据量不死多,几千条,但要求精度高,而且语言混杂,不是那种标准化的模板文本。最要紧的是数据不能出内网…

2026/11/4 8:49:16

Montserrat字体选型与Web落地:字重、可变字体与性能优化

1. Montserrat 到底是什么,凭什么被用烂了如果你最近在接手品牌官网、SaaS 后台或者电商详情页,翻开源码或者设计稿,十有八九会撞见 Montserrat 这个名字。它几乎成了“现代几何无衬线”这个类别的默认答案:免费商用、九档字重、还…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/4 0:03:20

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

2026/11/4 0:03:20

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

2026/11/4 0:03:20

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

2026/11/3 7:47:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/3 14:24:53

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑