You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In the old days with webpack, we had many times when we could compile with pay, and with vite it was so
fast that we couldn't rest.
Time to take a nap in the vite.
在 Webpack 陪伴的那些日子里,我们在编译的时候有很多的时间可以用来休息,但 Vite 太快了,夺走了这一切。
importtype{Plugin}from"vite";importtype{UserOptions}from"./lib/options";import{sleep}from"./lib/utils";import{name}from"../package.json";exportdefaultfunctionsleepPlugin(userOptions: UserOptions={}): Plugin{constoptions={
...userOptions,};letfirstStart=true;return{
name,enforce: "pre",configureServer(server){server.middlewares.use(async(req,__,next)=>{// if not html, next it.// @ts-expect-errorif(!req.url.endsWith(".html")&&req.url!=="/"){returnnext();}if(firstStart){awaitsleep(options.devServerStartDelay||20000);firstStart=false;}next();});},asyncload(){awaitsleep(options.hmrDelay||2000);returnnull;},};}
其实很简单,configureServer 钩子是 Vite 官方提供的独有钩子(也就是 Rollup 中不存在的钩子),是用于配置开发服务器的钩子,最常见的用例是添加一些自定义服务中间件。
在知乎看参与 Vue Conf 2021 是怎样的体验?这个问题的时候,偶然发现 Anthony Fu 的回答里提到了一个好玩的凡尔赛插件:vite-plugin-sleep。
先看看回答中 Anthony Fu 是怎么引出这个插件的:
这充满凡尔赛气息的话语属实逗笑我了,Webpack 的构建之慢确实带给了我们一些美好的摸鱼时间,Vite 是夺走它们的罪魁祸首,这才是属于打工人的插件!
介绍
先看看 vite-plugin-sleep 的「动机」章节:
在 Webpack 陪伴的那些日子里,我们在编译的时候有很多的时间可以用来休息,但 Vite 太快了,夺走了这一切。
是时候小睡一会了……
用法
就这么简单,安装然后引入,属于你的摸鱼时间又回来了。
原理
看看这个插件的源码是什么样的,顺便学习一下 Vite 插件的编写方式。
Vite 插件的通用形式一般是个函数,接受用户传入的一个 options 配置选项,返回 Vite 标准的插件格式,一个形如这样的对象:
Vite 暴露了很多钩子函数给用户,让用户在适当的时机对源码内部的行为进行一些介入和更改。
在官网的 插件 API —— 钩子 章节阅读文档,注意有一部分钩子是继承自 Rollup 的,所以需要去 Rollup 的官网来查看使用说明。
以官网中提到的例子来解释:
这个插件允许用户引入一个虚拟文件(在实际文件中不存在),通过
load
钩子来自定义读取文件的内容,用户就可以这样引入"from virtual file"
这个字符串了。有了这些前置知识,我们来看下这个插件是怎么写的:
其实很简单,
configureServer
钩子是 Vite 官方提供的独有钩子(也就是 Rollup 中不存在的钩子),是用于配置开发服务器的钩子,最常见的用例是添加一些自定义服务中间件。而
load
钩子则是Rollup
内置的,根据官网的说法,return null
代表这个文件交给其他插件或者由默认解析行为处理,也就是延迟两秒后啥都不干。再回到插件的内容,先定义一个睡觉的函数:
配合 await 语法,可以实现非常优雅的睡眠。
通过
enforce: 'pre'
来强制这个插件的钩子在最前面执行(其他插件别想阻止我摸鱼)。configureServer
这个钩子里的代码也很简单,初次启动 Vite 开发服务器的时候,访问入口 HTML 文件时,sleep
沉睡用户传入的时间,默认 20 秒。(20 秒够干嘛?XD,请设置成 120 秒。)官方给出的例子就是添加中间件,但尤老板万万没想到中间这段注释代码被摸鱼小能手填充之后,竟是用来做这种事!
之后是
load
钩子,读取每个文件的时候,默认沉睡 2 秒。就这么简单,一个 Vite 摸鱼插件完成了。
总结
周末了,通过这个凡尔赛的插件图个乐子,顺便学习一下 Vite 插件的基础知识,美滋滋!
感谢大家
欢迎关注 ssh,前端潮流趋势、原创面试热点文章应有尽有。
记得关注后加我好友,我会不定期分享前端知识,行业信息。2021 陪你一起度过。
The text was updated successfully, but these errors were encountered: