vite 插件,vite打包工具

  vite 插件,vite打包工具

  本文主要介绍一个如何更流畅的使用vite插件包的例子。有需要的朋友可以借鉴一下,希望能有所帮助。祝大家进步很大,早日升职加薪。

  

目录

  用法及用法介绍(带参数):给自定义进度条加点颜色:实现思路。第一次打包(模拟模块总数)与进度条配合。添加缓存。使用缓存实现架构图。最后

  

前言

  上一个我给你带了《如何入门去写一个 vite 插件》。我能看出学生们非常喜欢它。如果对vite感兴趣,可以关注我的专栏《vite 从入门到精通》。

  因为公司目前大部分项目都已经转化为vite,为了给社区增加一份贡献,我们开发了一个插件vite-plugin-progress,已经应用到项目中vite的前端打包进度条上;

  

介绍

  Vite-plugin-progress插件是一个在打包时显示进度条的插件。如果你觉得这个插件对你的项目有帮助,欢迎明星支持。谢谢大家!

  

用法

  安装

  # npm

  npm我邀请-插件-进度-D

  #纱线

  纱线添加插件-进度-D

  # pnpm

  pnpm i邀请-插件-进度-D

  使用(不带参数):vite.config.js/vite.config.ts的配置

  从“vite-plugin-progress”导入进度

  导出默认值{

  插件:[

  进度()

  ]

  }

  参数 0ptions:

  格式:自定义进度条的格式;Width:终端中进度条的宽度;完成:完成后的默认字符\ u2588不完整:不完整的默认字符;RenderThrottle:默认的间隔更新时间是16(毫秒);Clear:完成后是否清空终端,false默认情况下;回调:完成后执行的回调函数;流终端中输出格式流,默认为stderrHead:进度条的第一个字符;options参数格式中每个标记的含义:

  :bar:代表进度条;当前:当前执行位置的规模;合计:总规模;elapsed:经过的时间(秒);percent:完成的百分比;eta:预计完成时间(秒);速率:每秒的速率;

  

使用(带参数)

  //vite . config . js/vite . config . ts

  从“vite-plugin-progress”导入进度

  导出默认值{

  插件:[

  进度({

  格式:建筑[:条]:百分比,

  总计:200,

  宽度:60,

  完成:“=”,

  不完整:“”,

  })

  ]

  }

  

给自定义进度条加点颜色

  安装微微色:

  pnpm i微微色-D

  使用:

  //vite . config . js/vite . config . ts

  从“vite-plugin-progress”导入进度

  从“微微色”导入颜色

  导出默认值{

  插件:[

  进度({

  format:`$ { colors . green(colors . bold( boubuilding )} $ { colors . cyan([:bar])}:percent ` p

  })

  ]

  }

  如果你只想使用插件,那么现在就去安装吧!

  如果你对实现的想法感兴趣,那么你可以继续向下滚动查看~

  

实现思路

  其实要实现这个功能,我们主要考虑的是目前的vite打包进度在哪里,所以我们思考两个问题:

  vite包装目前进展如何?我如何知道目前包装的进展?熟悉webpack的朋友对webpack的打包进度条并不陌生。可以发现,在webpack中,webpack公开了一个webpack的事件钩子。ProgressPlugin,可以很方便的在webpack中实现进度条,并且可以通过钩子直接封装;

  但是在vite中,由于包代码是基于Rollup构建的,所以我们无法知道当前的vite包进度;

  借用vite的一位作者的话:

  简单的意思就是vite打包的时候,不可能知道0%-100%的进度条,因为你必须先确定要构建的模块总数。

  虽然不知道模块总数,但是第一次封装可以模拟一个;

  而且在第一次打包的时候,我们记录了对应的模块个数然后缓存,这样就可以知道对应的模块个数了?

  说做就做~

  

第一次打包(模拟模块总数)

  因为我们可以知道科学研究委员会目录下所有的文件总数,所以就可以假设在第一次打包时用该总数来代替模块总数;

  那么简单公式:进度条百分比=当前转换的模块/模拟的模块总数

  从“维特”导入类型{插件选项};

  从"研发"导入rd;

  导出默认函数viteProgressBar(选项?插件选项):插件选项{

  //文件类型总数

  让文件计数=0

  让transformCount=0

  let transformed=0 //当前已转换的数量

  返回{

  .

  config(config,{ command }) {

  if (command===build) {

  const readDir=rd。读取同步( src );

  const reg=/\ .(vue ts js jsx tsx CSS scss sass styl less)$/gi;

  readdir。foreach((item)=reg。测试(项目)文件计数);

  }

  },

  转换(代码,id) {

  转换计数

  const reg=/node _ modules/gi;

  如果(!注册测试(id){

  百分比=(转换的/文件数)。toFixed(2)

  }

  }

  }

  }

  

与进度条配合

  那么既然我们已经算出了基本的进度条,也知道了基本思路,那么我们就把进度条加进去

  从“维特”导入类型{插件选项};

  从"进度"导入进度;

  从"研发"导入rd;

  导出默认函数viteProgressBar(选项?插件选项):插件选项{

  设fileCount=0//文件类型总数

  设transformCount=0 //转换的模块总数

  let transformed=0 //当前已转换的数量

  设最后一个百分比=0;//记录上一次进度条百分比

  常量栏:进步;

  返回{

  .

  config(config,{ command }) {

  if (command===build) {

  //初始化进度条

  选项={

  宽度:40,

  完成:" \u2588 ",

  不完整:" \u2591 ",

  .选择

  };

  options.total=options?合计 100;

  const transforming=isExists?` ${ colors。magenta( Transforms:)}:transform cur/:transform total `:

  const chunks=isExists?` ${ colors。magenta( Chunks:)}:chunk cur/:chunk total `:

  const barText=` ${ colors。青色(`[:bar]`)} `

  常量条形格式=

  options.format

  ` $ { colors。green( bou building )} $ { barText }:percent $ { transforming } $ { chunks } Time:elapseds ` s时间

  删除选项.格式;

  bar=新进度(条形格式,选项为进度栏.进度选项);

  //统计目录下的文件总数

  const readDir=rd。读取同步( src );

  const reg=/\ .(vue ts js jsx tsx CSS scss sass styl less)$/gi;

  readdir。foreach((item)=reg。测试(项目)文件计数);

  }

  },

  转换(代码,id) {

  转换计数

  const reg=/node _ modules/gi;

  如果(!注册测试(id){

  lastPercent=percent=(已转换/文件计数)。toFixed(2)

  }

  //更新进度条

  bar.update(lastPercent,{

  转换总数:cacheTransformCount,

  transformCur: transformCount,

  chunkTotal: cacheChunkCount,

  chunkCur: 0,

  })

  },

  closeBundle() {

  //关闭进度

  bar.update(1)

  bar.terminate()

  }

  }

  }

  

添加缓存

  为了更准确的知道打包的进度,那么我们在第一次模拟了总数的时候,也要同时把真实的模块总数给缓存起来,这样在下一次打包时才能更加准确的计算出进度条;

  新增缓存文件cache.ts

  从" fs "导入fs;

  从"路径"导入路径;

  const dirPath=path。加入(流程。CWD(),节点模块, .进步);

  const文件路径=path。join(dirPath, index。JSON’);

  导出接口ICacheData {

  /**

  * 转换的模块总数

  */

  cacheTransformCount:number;

  /**

  *组块的总数

  */

  cacheChunkCount:数字

  }

  /**

  * 判断是否有缓存

  * @返回布尔值

  */

  导出常量is exists=fs。exists sync(文件路径) false

  /**

  * 获取缓存数据

  * @返回ICacheData

  */

  导出常量getCacheData=(): ICacheData={

  如果(!isExists)返回{

  cacheTransformCount: 0,

  cacheChunkCount: 0

  };

  返回JSON。解析(fs。读取文件同步(文件路径, utf8 );

  };

  /**

  * 设置缓存数据

  * @返回

  */

  export const setCacheData=(data:icache data)={

  !是存在的fs。mkdirsync(目录路径);

  fs.writeFileSync(filePath,JSON。stringify(数据));

  };

  

使用缓存

  //缓存进度条计算

  函数runCachedData() {

  if (transformCount===1) {

  溪流。写( \ n );

  条形刻度({

  转换总数:cacheTransformCount,

  transformCur: transformCount,

  chunkTotal: cacheChunkCount,

  chunkCur: 0,

  })

  }

  转换

  percent=last percent=(transformed/(cacheTransformCount cacheChunkCount)).toFixed(2)

  }

  

实现架构图

  

最后

  该系列会是一个持续更新系列,关于整个专栏《Vite 从入门到精通》 ,我主要会从如下图几个方面讲解,请大家拭目以待吧!

  更多关于轻快地打包插件的资料请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: