Vite 插件是带 name 和若干钩子函数的对象。钩子分两类:Vite 专有钩子(config、configResolved、configureServer、transformIndexHtml、handleHotUpdate 等)和 Rollup 兼容钩子(resolveId、load、transform 等)。dev 阶段按请求流水线执行 resolveId → load → transform,build 阶段交给 Rollup 跑同一套钩子,所以大量 Rollup 插件可直接复用。
钩子可用 enforce: 'pre' 或 'post' 控制顺序;transform 返回 { code, map } 支持 sourcemap;apply: 'build' 或 'serve' 可限制生效阶段。写一个简单插件如把 .md 转成模块:resolveId 识别后缀、load 读文件、transform 编译为 JS。易错点:configureServer 返回函数可在内部中间件之后执行;插件顺序敏感,框架插件通常要放最前。追问:与 Webpack loader(只管转换)加 plugin(全生命周期)模型的对比。
export default { name: 'my-plugin', enforce: 'pre', transform(code, id) { /* ... */ } }