第三章、vite 中生命周期函数

1,559 阅读3分钟

本章介绍声vite插件对应的声明周期函数,这样有助于我们在开发vite插件时候,找到对应的声明周期函数,做出相应的处理方法,生命周期函数对于做过vue、react开发的同学来讲并不是一个陌生的概念;

1、通用的声明周期钩子函数

开发时候 ,vite dev server启动创建一个插件容器,会按照rollup调用创建钩子的规则请求各个钩子函数,下面钩子函数会在服务器启动时候调用一次

  • options 替换或操作 rollup选项(如果不是打包处理,一般用不到)
  • buildStart 准备创建的信号

下面的钩子每次有模块请求都会被调用,每次import都会触发这些钩子函数

  • resolveId 创建定义确认函数
  • load 床架插件函数,用于返回自定义内容
  • transform 用于转换已加载的模块

2、vite特有的钩子

  • config 修改vite的配置,例如配置别名,可以覆盖之前的配置
config(conf) {
  // return的对象会和 conf合并生成一个新的配置
	return {
  	// 设置一些配置项内容
  }
}
  • configResolved vite配置确认
  • configureServer 用于配置开发服务器(也就是我们通常yarn vite启动的服务器)
configureServer(server) {
  // koa2的中间件模式类似的方式来去做,好像不完全用的是koa2这套东西(后续计划做个mock请求拦截工具)
  // 之前在做mock在网上有一个类似的插件库,可以按照拦截的模式做mock数据
	server.app.use(req, res, next) ... 
}
  • transformIndexHtml 用于转换宿主页面
transformIndexHtml(html: string): Promise<IndexHtmlTransformResult> {
	return {
		html: '' as string,
  	tags: [{
			tag: '', // div script ... html元素
  		attrs: {
				src: '' // 元素的的属性、属性值
			},
  		children?: tags[] // 此处为距离,大概意思就是tags类型的数据做为子元素
			injectTo: 'head-prepend' // 'head' | 'body' | 'head-prepend' | 'body-prepend' 
		}]
	}
}
  • handleHotUpdate 用户hmr热更新调用

3、插件生命周期调用的顺序

在做顺序之前,这里我编写一个一个测试生命周期函数调用的基本顺序测试plugin,大家可以去吧这个方式vite项目中,启动项目实际感受一下顺序,纸上得来终觉浅,亲自实操一番记忆会更深刻

function myExamplePlugin(): Plugin {
  return {
    name: 'my-example-plugin',
    // 只执行一次
    options(opt) {
      console.log('options', opt)
      return opt
    },
    buildStart() {
      console.log('start')
    },
    // vite特有的钩子
    config(conf) {
      console.log('config', conf)
    },
    configResolved(id) {
      console.log('configResolved', id)
    },
    configureServer(server) {
      console.log('configureServer', 'server拦截,做mock')
    },
    transformIndexHtml(html) {
      console.log('transformIndexHtml')
      return html
    },
    // 每次插件执行后都会去调用的钩子
    resolveId(source) {
      console.log('resolveId')
      return source
    },
    // 加载模块代码
    load(id) {
      console.log('load', id)
      return id
    },
    transform(code, id) {
      console.log('transform')
      return code
    }
  }
}

这块我们需要区分一下运行时环境,和打包过程的环境,两者有一些区别

4、插件执行的顺序

在vite插件开发的过程中,我们一般都会给插件配置enfore 插件属性,来去确定我们的产检具体在哪个位置执行;下面流程图展示一下具体插件的执行顺序: