Vite插件开发纪实:vite-plugin-monitor(中)

简介: Vite插件开发纪实:vite-plugin-monitor(中)

前言


上一篇文章主要介绍了开发插件所需的准备工作,以及此次要开发的插件将要解决的问题


功能开发


有了前文的铺垫内容,下面就是功能开发


获取启动耗时


项目启动后会在终端中输出ready in xxms


网络异常,图片无法展示
|


为此咱们使用Vs Code在源码中搜一下这个关键字


网络异常,图片无法展示
|


可以看到此部分代码在源码中如下


const info = server.config.logger.info
// @ts-ignore
if (global.__vite_start_time) {
  // @ts-ignore
  const startupDuration = performance.now() - global.__vite_start_time
  info(`\n  ${chalk.cyan(`ready in ${Math.ceil(startupDuration)}ms.`)}\n`)
}


这个performance.now()等同于Date.now()即当前时间,通过global.__vite_start_time就能获取到服务启动时间


我们就从这个info方法入手,给它重定义一下,通过configureServer钩子可以获取到server实例


index.ts


import type { Plugin } from 'vite';
export default function Monitor(): Plugin {
  const startTime = global.__vite_start_time
  return {
    name: 'vite-plugin-monitor',
    apply: 'serve',
    configureServer(server) {
      const { info } = server.config.logger;
      // 拦截info方法的调用
      server.config.logger.info = function _info(str) {
        // 调用原info方法
        info.apply(this, arguments);
        // 通过字符串内容进行一个简单的判断
        if (str.includes('ready in')) {
          console.log('startupDuration', Date.now() - startTime)
        }
      };
    },
  };
}


启动一个项目看看效果,成了。


网络异常,图片无法展示
|


HMR时间获取


热更新时,终端中会出现下面的日志


网络异常,图片无法展示
|


同理源码里搜一搜,能够定位出如下内容


config.logger.info(
    updates
    .map(({ path }) => chalk.green(`hmr update `) + chalk.dim(path))
    .join('\n'),
  { clear: true, timestamp: true }
)


暂以打印这个日志的时间作为HMR开始的时间


let startTime = null
const { info } = server.config.logger;
server.config.logger.info = function _info(str) {
  info.apply(this, arguments);
  if (str.indexOf('hmr update') >= 0) {
    startTime = Date.now()
  }
};


触发HMR时,客户端会发出一个获取资源的请求,请求携带了一个import参数,我们通过这个参数来标识这个特定的请求


http://localhost:8080/src/pages/home/index.vue?import&t=1632924377207


钩子中的server实例包含middlewares属性可以向上添加自定义的中间件处理方法


  • 通过URL实例解析search参数,然后判断是否包含import&
  • 重定义end方法,在资源传回到客户端后打印耗时


server.middlewares.use(async (req, res, next) => {
  const { search } = new URL(req.url, `http://${req.headers.host}`);
  if (
    search.indexOf('import&') >= 0
  ) {
    const { end } = res;
    res.end = function _end() {
      // 在资源返回后打印耗时
      end.apply(this, arguments);
      console.log(Date.now() - startTime)
    };
  }
  next();
});


事实上通过--debug启动服务,能看到在HMR时会打印4个时间


网络异常,图片无法展示
|


目前方法仅仅得到了vite:hmr部分的时间,与实际耗时还有一丝丝差异


小结


更加详细的信息只能通过--debug看到,下一步的计划就是hack,模拟一下debug下的行为,将debug的打印的数据都拦截下来


由于时间关系,这部分hack还没完成。准备假期抽时间实现一下。下一篇文章将详细的介绍最终实现。

相关文章
|
5天前
|
JavaScript
Vite 按需引入 Ant Design Vue 3.0
Vite 按需引入 Ant Design Vue 3.0
|
5天前
|
资源调度 JavaScript 前端开发
【源码共读】Vite 项目自动添加 eslint 和 prettier
【源码共读】Vite 项目自动添加 eslint 和 prettier
51 0
|
5月前
|
JavaScript 小程序
VUE3(三十五)vite构建的项目配置使用.env文件
VUE3(三十五)vite构建的项目配置使用.env文件如标题所示:我要在vue3项目使用.env文件。 先介绍一下项目背景,项目使用VUE3.2 + vite2.9 + typescript搭建。 我基本断定,vue3使用.env文件的方法可能和vue2使用.env文件的方法可能是不同,关于vue2项目如何使用.env文件,请移步《VUE2(七)VUE配置env文件使用》
82 1
|
8月前
|
资源调度 JavaScript 前端开发
nuxt2-storybook-vite:环境搭建、基础使用 / nuxt项目组件库
nuxt2-storybook-vite:环境搭建、基础使用 / nuxt项目组件库
201 0
|
8月前
|
JavaScript
为老的vueCli项目添加vite支持
为老的vueCli项目添加vite支持
81 0
为老的vueCli项目添加vite支持
|
9月前
|
资源调度 前端开发 JavaScript
ant-design-vue+vite主题切换详细步骤(简单案例)
ant-design-vue+vite主题切换详细步骤(简单案例)
636 0
|
10月前
|
缓存 前端开发 JavaScript
前端工具Vite的出现解决了什么?
在 ESM 出现之前,Javascript 是没有一个标准的模块方案。 比如说 `CJS` 是用于 Node 服务端的模块化方案,`AMD` 是用于浏览器的模块化方案。为了解决这个模块共用性问题,出现了 `UMD` 用于兼容这两种模块规范。 鉴于上面共用性问题,实际开发中配置的打包方式,采用的还是 UMD 模式。因为这样可以避免打包而产生的规范问题,并且在 ESM 不能使用的情况下也会选择 UMD。
92 0
前端工具Vite的出现解决了什么?
|
前端开发
关于我写了一个vite插件那些事
在我们开发的过程中有开发模式和生产模式,那有些测试代码会在开发模式的时候使用,在生产环境要删掉,一般是手动删除,另一种就是判断环境变量,但是环境变量不好处理template代码以及css代码,为此我写了一个插件将解决以上问题。
187 0
关于我写了一个vite插件那些事
|
JavaScript
【Vue 开发实战】生态篇 # 24:提升开发效率和体验的常用工具:ESLint、Prettier、vue-devtools
【Vue 开发实战】生态篇 # 24:提升开发效率和体验的常用工具:ESLint、Prettier、vue-devtools
63 0
【Vue 开发实战】生态篇 # 24:提升开发效率和体验的常用工具:ESLint、Prettier、vue-devtools
|
Web App开发 JavaScript 前端开发
vite-plugin-chrome-extension(Vue版本)
vite-plugin-chrome-extension(Vue版本)