vite插件钩子
Vite打包的底层构建其实是基于Rollup的,在Rollup设计的接口基础上进行扩展,在此之上加入了自己特有的一些钩子函数。 看一下官方的描述
参数 | 说明 | 归属 | 触发时机 |
---|---|---|---|
options |
这是构建阶段的第一个挂钩。因为是在Rollup完全配置之前运行的,所以这个阶段访问不到任何上下文实例,起到合并配置等作用 | vite 和 rollup 共享 |
服务器启动时 |
buildStart |
这个钩子可以用于访问Rollup的配置参数 | vite 和 rollup 共享 |
服务器启动时 |
resolveId |
在解析模块时调用,用于可以返回一个特殊的Id来表示指定的模块 | vite 和 rollup 共享 |
解析模块时 |
load |
解析加载模块时触发 | vite 和 rollup 共享 |
解析模块时 |
transform |
解析代码模块时,对代码进行转换,并输出转换后的结果 | vite 和 rollup 共享 |
解析模块时 |
buildEnd |
输出生成阶段的outputOptions,因为这是构建阶段的最后一个钩子 | vite 和 rollup 共享 |
服务器关闭时 |
closeBundle |
调用bundle.close()时,是服务关闭时被触发的一个钩子函数 | vite 和 rollup 共享 |
服务器关闭时 |
config |
解析 Vite 配置前调用,返回用户原始配置,并能修改这个配置 | Vite独享 | 服务器启动时 |
configResolved |
解析 Vite 配置后调用。使用这个钩子读取和存储最终解析的配置,并在合适钩子中使用 | Vite独享 | 服务器启动时 |
configureServer |
用于配置开发服务器的钩子。钩子将在内部中间件被安装前调用 | Vite独享 | 服务器启动时 |
configurePreviewServer |
与configureServer 相同,但用于预览服务器,也是在其他中间件安装前被调用 |
Vite独享 | 服务器启动时 |
transformIndexHtml |
转换 index.html 的专用钩子。钩子接收当前的 HTML 字符串和转换上下文 |
Vite独享 | 编译时 |
在知道了这些个常用的钩子函数及其使用的时机,我们就可以根据自身需要编写插件。
插件编写
Vite插件本质上就是一个返回特定对象的函数,和Webpack的loader很像。来看下具体格式及部分参数
js
function plugin() {
return {
name: '', //插件名称
apply: '',//指定调用模式,'build' 或 'serve'
enforce: '', //插件的执行顺序 'pre' 或 'post',或 ''
//钩子函数
transform() {
}
}
}
enforce
这个参数会控制插件的执行顺序。pre -> ' ' -> post,pre执行时机先于为空时,先于post
假设需求是,我们需要在编译输出的代码最后插入一段HTML代码,比如官网底部的Copyright等标注。
js
export default function insertHtml (){
const style: string = `<style scoped>.style {
position: fixed;
left: 60px;
bottom: 10px;
z-index: 99999;
color: #fff;
} </style>`
const fragment = `<div>插入HTML末尾的片段</div>`
return {
name: 'insert-html'
apply: 'build'
transformIndexHtml(html) {
return `${html}${fragment}${style}`
}
}
}
因为是需要在构建的时候执行代码片段插入,所以要设置执行apply为 build
,只会在打包的时候执行。开发的时候不执行。如果涉及css编写,也都是要按字符串的形式插入,可以直接拼接在代码段的前面或者后面。
插件应用
需要在 vite.congfig.ts
里面的 plugins
参数里面执行这个插件
js
import InsertHtml from '../../plugins/insertHtml'
export default defineConfig({
plugins: [ InsertHtml() ]
})
这样,在打包的时候,这个插件就会执行。并且能在最终输出的html里面看到我们插入的代码片段。

写在最后
相比webpack插件的编写,个人感觉vite的插件编写和应用更易上手了一些。
文章介绍了一些常用的钩子函数,并简单编写了一个在html文件末尾插入注解的插件,算是对vite插件有初步的了解,其他详细的介绍和使用可以查看官方文档
希望能为大家在需求开发过程中拓展实现思路。