Skip to content
霞露小伙 — HfWang
On this page

vite 插件实践

WARNING

待完善

vite-plugin-mock

分析

因为 mock 一般只用在本地开发阶段,所以需要在 vite 确认最终配置信息的时候,我们去判断是不是开发阶段,不是的话直接拦截操作。

而这个阶段 vite 为我们提供了这个钩子 configResolved 用于开发者获取最终配置信息

让后就是我们在开发阶段,我们每次发起的请求,实际上都是在使用 vite 为我们搭建的开发服务器发起请求,所以我们就可以在这里做判断了

  • 我们先获取 mock 文件夹下导出的数组
  • 在 vite 为我们开发服务器的中间件上 configureserver 执行我们封装好的 mock 操作

先简单搭建个插件架子

ts
import type { ResolvedConfig, ViteDevServer, PluginOption } from 'vite'

export interface VitePluginMockOption {
    entry?: string // mock 文件入口
    useTs?: boolean // 是否使用 ts
}

export default (options: VitePluginMockOption = {}) => {
    let isDev = false

    return {
        name: "vitePluginMock",
        // 开启 enforce, 插件调用时机会在调用 vite 内置的核心插件之前
        // https://vitejs.bootcss.com/guide/api-plugin.html#plugin-ordering
        enforce: "pre",
        // 确认配置钩子,这个钩子在 vite 确认最终的配置项后触发
        configResolved: (config: ResolvedConfig) => {
            isDev = config.command === 'serve'
        },
        // vite 插件服务器的相关配置
        // https://vitejs.bootcss.com/guide/api-plugin.html#configureserver
        configureServer: (server: ViteDevServer) => {
            if (!isDev) return

            // 获取 mock 文件入口
            const mockEntryPath = 
                `${options.entry || 'mock'}/index.${options.useTs ? 'ts' : 'js'}`
            const mockEntry = path.resolve(process.cwd(), mockEntryPath)

            server.middlewares.use(req, res, next) => {
                // 符合 mock 的在这里就处理掉了,不符合的直接交由下一个 中间件 处理
                if () {
                    // .....
                } else {
                    next()
                }
            }
        }
    }
}

本站中引用到的其他资料,如有侵权,请联系本人删除