文章 · 构建工具
自己写一个 Vite 插件要懂什么
写 Vite 插件的门槛不在 API,而在理解「开发时和构建时是两条不同的路径」。搞清楚这两条路径上各自的钩子时机,插件才写得对。
两条路径,两套时机
开发环境是按需编译,模块被请求时才处理;构建环境是一次性全量处理。同一个钩子在两边触发的次数和顺序都不一样。
先认准要挂哪个钩子
- 改写模块内容:在转换阶段做,别去碰解析阶段
- 拦截资源加载:从解析阶段入手更稳
- 影响产物输出:放到构建收尾阶段统一处理
ts
export default function myPlugin(): Plugin {
return {
name: 'my-plugin',
transform(code, id) {
if (!id.endsWith('.special')) return null
return { code: rewrite(code), map: null }
},
}
}返回 null 是门手艺
不处理的模块一定要明确返回 null 或 undefined。返回空字符串会被当成「这个模块的内容就是空」,把原本的代码整个抹掉。
评论13
登录后参与评论,你的发言会署上自己的名字。
周迟作者@zhouchi·2026-08-23
先占个位:文里的数字都是本地实测的,测试环境写在文末备注里,有疑问直接在这儿回。
江辰@jiangchen·2026-08-24
缓存那部分能不能再展开讲讲?我们这边命中率一直上不去。
唐棠@tangtang·2026-08-25
产物裁剪这条被低估了,sourcemap 和语言包占的空间比想象中大。
孟凡@mengfan·2026-08-26
构建脚本重写那段看着很有共鸣,最花时间的果然还是新旧产物对照。
邓可@dengke·2026-08-27
把流水线耗时先打出来这一步太重要了,不然优化全靠猜。
罗叙@luoxu·2026-08-28
同意,先有数据再谈优化,不然改了半天不知道有没有用。