简单写一个vite插件

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插件有初步的了解,其他详细的介绍和使用可以查看官方文档

希望能为大家在需求开发过程中拓展实现思路。

相关推荐
一 乐14 分钟前
动漫书销售商城|基于springboot + vue动漫书销售商城(源码+数据库+文档)
java·数据库·vue.js·spring boot·毕业设计
admin and root35 分钟前
「AI安全篇」实战AntiDebug自动化JS逆向加解密MCP
javascript·人工智能·网络安全·自动化·漏洞挖掘·cnvd·src赏金
前端snow1 小时前
ai agent --- postgreSQL 关系型数据库
前端
卷无止境2 小时前
ECharts:把数据变成故事的可视化利器
前端
Eric_见嘉2 小时前
在职前端 Skill 和 MCP 分享
前端·后端·agent
liangshanbo12152 小时前
面试题:如何优化 Webpack 的打包速度?
前端·webpack·node.js
wengad3 小时前
从 wangEditor 迁到 wangEditor-next
前端·javascript·vue.js
行者-全栈开发4 小时前
【前端/JS框架】CVE-2026-3854:GitHub Enterprise Server X-Stat注入XSS漏洞深度剖析与紧急修复指南
前端·javascript·github
计算机魔术师5 小时前
AMD砸82亿买下李飞飞,这次不卖芯片卖什么?
前端
hzxpaipai5 小时前
杭州企业官网怎么建设?从策划到上线的5步建站方法
运维·服务器·前端·网络