1. Vite 插件钩子(config/configResolved/transformIndexHtml/transform/handleHotUpdate/closeBundle)的执行时机与 enforce(pre/post)排序
Vite 插件钩子(config/configResolved/transformIndexHtml/transform/handleHotUpdate/closeBundle)的执行时机是什么?enforce(pre/post)如何排序?
- 各钩子的生命周期阶段(配置、转换、HTML、HMR、构建结束)
- enforce: 'pre'/'post' 与默认顺序的排序机制
- 钩子执行顺序对插件行为的影响(转换链、优先级)
Vite 插件钩子分布在构建与开发的全生命周期:config(读取配置前,可修改配置对象)、configResolved(配置解析完成后,只读快照)、configureServer(dev server 创建时)、transformIndexHtml(HTML 转换,可注入脚本/标签)、resolveId/load/transform(模块解析与转换链——dev 与 build 共用)、handleHotUpdate(HMR 更新时,可自定义热更内容)、closeBundle(build 结束,清理/产物后处理)。执行时机决定插件"在哪一步干预",如 transformIndexHtml 注入 polyfill 标签、handleHotUpdate 自定义热更边界、closeBundle 做产物收尾。
enforce 排序:插件在数组中默认按注册顺序执行(resolveId/load/transform 等链式钩子),enforce: 'pre' 把插件排到"默认之前"(核心转换之前)、'post' 排到默认之后(核心转换之后)——典型用法:pre 用于别名/特殊语法转换(先于通用转换)、post 用于后处理(压缩、产物修正);排序影响链式结果(transform 依次叠加),错误顺序会导致"转换后语法不再匹配"或"后处理被后续插件覆盖"。工程注意点:HMR 相关钩子只在 dev 生效(build 无 HMR)、closeBundle 在 build 生效(dev 中对应 server close)、钩子的执行次数(build 多入口时 transform 可能多次)与"幂等性"(插件处理需可重复)、以及 enforce 对"非链式钩子"(config、closeBundle)无排序意义(仍按注册顺序)。
本题考察 Vite 插件生命周期的全局视图:钩子按阶段分布、enforce 控制链式顺序。回答应逐钩子说明时机、enforce 语义与排序陷阱。