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还没完成。准备假期抽时间实现一下。下一篇文章将详细的介绍最终实现。

相关文章
|
20天前
|
前端开发 JavaScript 容器
在 vite+vue 中使用@originjs/vite-plugin-federation 模块联邦
【10月更文挑战第25天】模块联邦是一种强大的技术,它允许将不同的微前端模块组合在一起,形成一个统一的应用。在 vite+vue 项目中,使用@originjs/vite-plugin-federation 模块联邦可以实现高效的模块共享和组合。通过本文的介绍,相信你已经了解了如何在 vite+vue 项目中使用@originjs/vite-plugin-federation 模块联邦,包括安装、配置和使用等方面。在实际开发中,你可以根据自己的需求和项目的特点,灵活地使用模块联邦,提高项目的可维护性和扩展性。
|
19天前
|
JavaScript 前端开发
将 Babel 插件应用于实际项目中
【10月更文挑战第25天】如果在应用插件过程中出现问题,可以检查 Babel 配置是否正确、插件的依赖是否安装完整、构建工具的集成是否正确等,逐步排查和解决问题。通过以上步骤,就可以将 Babel 插件成功应用到实际项目中,实现特定的代码转换和功能增强。
|
2月前
vite.config.js中vite.defineConfig is not defined以及创建最新版本的vite项目
本文讨论了在配置Vite项目时遇到的`vite.defineConfig is not defined`错误,这通常是由于缺少必要的导入语句导致的。文章还涉及了如何创建最新版本的Vite项目以及如何处理`configEnv is not defined`的问题。
110 3
vite.config.js中vite.defineConfig is not defined以及创建最新版本的vite项目
|
1月前
|
资源调度 JavaScript 前端开发
如何实现一个类似 vite 的脚手架并发布 npm
本文介绍了如何实现一个类似 Vite 的脚手架工具。通过详细解析和实践,文章分享了从零开始构建脚手架的过程,包括技术选型、开发步骤及发布 NPM 包的完整流程。最终目标是让用户能够通过 `yarn create electron-prokit myapp` 快速搭建 Electron 项目。项目源码可在 GitHub 上获取。
23 5
|
4月前
Vite 项目中如何去集成 Mock 环境 (插件:vite-plugin-mock)
Vite 项目中如何去集成 Mock 环境 (插件:vite-plugin-mock)
178 0
|
11月前
|
JavaScript 小程序
VUE3(三十五)vite构建的项目配置使用.env文件
VUE3(三十五)vite构建的项目配置使用.env文件如标题所示:我要在vue3项目使用.env文件。 先介绍一下项目背景,项目使用VUE3.2 + vite2.9 + typescript搭建。 我基本断定,vue3使用.env文件的方法可能和vue2使用.env文件的方法可能是不同,关于vue2项目如何使用.env文件,请移步《VUE2(七)VUE配置env文件使用》
388 1
|
JavaScript
为老的vueCli项目添加vite支持
为老的vueCli项目添加vite支持
131 0
为老的vueCli项目添加vite支持
|
缓存 前端开发 JavaScript
前端工具Vite的出现解决了什么?
在 ESM 出现之前,Javascript 是没有一个标准的模块方案。 比如说 `CJS` 是用于 Node 服务端的模块化方案,`AMD` 是用于浏览器的模块化方案。为了解决这个模块共用性问题,出现了 `UMD` 用于兼容这两种模块规范。 鉴于上面共用性问题,实际开发中配置的打包方式,采用的还是 UMD 模式。因为这样可以避免打包而产生的规范问题,并且在 ESM 不能使用的情况下也会选择 UMD。
139 0
前端工具Vite的出现解决了什么?
|
前端开发
关于我写了一个vite插件那些事
在我们开发的过程中有开发模式和生产模式,那有些测试代码会在开发模式的时候使用,在生产环境要删掉,一般是手动删除,另一种就是判断环境变量,但是环境变量不好处理template代码以及css代码,为此我写了一个插件将解决以上问题。
217 0
关于我写了一个vite插件那些事
|
存储 缓存 中间件
快速入门nest.js(8/10)--其他更多模块
嵌套构建块可以是: 全局范围 控制器范围 方法范围 参数范围<仅适用于管道>
154 0