Vite 插件如何用 transformIndexHtml 转换 HTML?

发布时间:2026/9/9 22:25:38

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/9/9 22:25:38

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

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

2026/9/9 22:20:37

基于灰狼算法的PID参数整定:原理、Matlab实现与仿真分析

拿到“基于灰狼算法的PID参数整定”这个题目时,很多人第一反应都是:灰狼算法和PID,这不是两个世界的东西吗?一个来自仿生智能优化,一个是控制理论里的常青树。但恰恰是这种组合,在课程设计、毕业设计、研究…

2026/9/9 23:10:49

图片无损放大哪个方法好?四个实用方法来帮你

在日常工作和学习生活中,相信很多人都遇到过这样的尴尬场景:好不容易找到一张满意的素材图,结果分辨率过低,一放大就全是马赛克。无论是做PPT汇报、设计海报,还是处理老旧照片,怎么把图片放大四倍保持清晰度…

2026/9/9 23:10:49

矩阵方法:从SVD到PCA,数据分析与信号处理的共同语言

在数据分析和信号处理的学习路径里,矩阵方法(Matrix Methods)是一个绕不开的核心主题。麻省理工学院的 18.065 课程 Matrix Methods in Data Analysis, Signal Processing, and Machine Learning 正是围绕这个主题展开的系统课程,…

2026/9/9 23:10:49

用Python实现剪映关键帧批量处理:桌面版源码解析

简介:面向视频剪辑与Python开发者的剪映关键帧自动化工具源码包,用于解决人工逐帧筛选效率低、剪辑节奏把控难的问题。工具基于Python实现视频关键帧的识别与智能筛选,可按用户设定条件自动挑选最佳剪辑点,并开放参数调整接口&…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/9 0:00:48

MHS模型硬件标准:让大模型像调用软件一样控制物理设备

让Claude真正看着显微镜说“这个细胞形态不太对”,或者让大模型自己调一版机械臂的运动轨迹,这事儿听上去已经很接近科幻片了。但你真上手试一次就会发现,模型不缺智商,缺的是一个能插进显微镜、机械臂、激光控制器里的“通用插座…

2026/9/9 0:00:48

AI五大核心方向详解:从机器学习到大模型,零基础转行选哪条?

会有人告诉我,他想转行学AI,但打开招聘网站一看直接傻眼:机器学习、深度学习、自然语言处理、计算机视觉、大模型应用……满屏都是这些词,好像每个都会一点,又好像每个都离自己很远。还有人上来就问“学Python还是学Ja…

2026/9/9 0:00:49

从50行最小循环到生产级AI引擎:工程化改造全解析

直接说干货。这一章我写的不是那种"hello world跑通某个模型"的教程,而是把AI引擎当做一个真正要上线、要被人调用、要扛流量的系统来聊。从最初只有50行的最小循环,到能够承载生产流量的AI引擎,中间差的不是代码量,而是…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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