简单写一个vite插件

vite插件钩子

Vite打包的底层构建其实是基于Rollup的,在Rollup设计的接口基础上进行扩展,在此之上加入了自己特有的一些钩子函数。 看一下官方的描述

参数 说明 归属 触发时机
options 这是构建阶段的第一个挂钩。因为是在Rollup完全配置之前运行的,所以这个阶段访问不到任何上下文实例,起到合并配置等作用 viterollup 共享 服务器启动时
buildStart 这个钩子可以用于访问Rollup的配置参数 viterollup 共享 服务器启动时
resolveId 在解析模块时调用,用于可以返回一个特殊的Id来表示指定的模块 viterollup 共享 解析模块时
load 解析加载模块时触发 viterollup 共享 解析模块时
transform 解析代码模块时,对代码进行转换,并输出转换后的结果 viterollup 共享 解析模块时
buildEnd 输出生成阶段的outputOptions,因为这是构建阶段的最后一个钩子 viterollup 共享 服务器关闭时
closeBundle 调用bundle.close()时,是服务关闭时被触发的一个钩子函数 viterollup 共享 服务器关闭时
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插件有初步的了解,其他详细的介绍和使用可以查看官方文档

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

相关推荐
CSR-kkk20 分钟前
前端工程化速通——①ES6
前端·es6·速通
yt9483225 分钟前
C#实现CAN通讯接口
java·linux·前端
前端小巷子25 分钟前
Cookie与Session:Web开发中的身份验证与数据存储
前端·javascript·面试
小磊哥er37 分钟前
【前端工程化】前端开发中如何做一套规范的项目模版
前端
Wetoria1 小时前
管理 git 分支时,用 merge 还是 rebase?
前端·git
前端开发与ui设计的老司机1 小时前
UI前端与数字孪生融合新领域:智慧环保的污染源监测与治理
前端·ui
一只小风华~1 小时前
Web前端开发: :has功能性伪类选择器
前端·html·html5·web
成遇1 小时前
Eslint基础使用
javascript·typescript·es6
Mr_Mao5 小时前
Naive Ultra:中后台 Naive UI 增强组件库
前端
前端小趴菜057 小时前
React-React.memo-props比较机制
前端·javascript·react.js