手撸vite插件,就问你来不来

简介: 本文主要讲vite工作机制和初始化插件流程始化插件流程

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


hello 大家好,🙎🏻‍♀️🙋🏻‍♀️🙆🏻‍♀️

我是一个热爱知识传递,正在学习写作的作者,ClyingDeng 凳凳!


vite工作机制


用户向vite请求资源时,vite内部启了一个开发服务器vite devServer,在这个服务器内部有个工作机制,相当于一个流水线(插件)。插件又分为系统插件(vue)和用户插件。用户请求过来必定经过所有的插件,去处理一下。这就有点向过滤器、中间件。将请求所需的资源进行处理,处理完成之后把转换的结果返回给用户,得到用户想要的东西。


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

vite特点:请求一个页面,显示的就是这个页面的内容,无需加载和页面无关的东西。这就意味着,以后的项目不管多大,它的加载速度都是一样的。

插件的形式可以是对象也可以是一个函数:包含插件名称、相关钩子函数(在vite工作的时间节点去执行)


插件钩子


通用钩子


服务器启动时被调用:


在每个传入模块请求时被调用:

  • resolveId 创建自定义确认函数,常用于定位第三方依赖
  • load 创建自定义加载函数,用于返回自定内容
  • transform 转换,将load进来的代码块进一步加工处理


在服务器关闭时被调用:

vite为了性能会避免完整的AST解析。所以在开发中不存在moduleParsed


vite独有钩子


config:在被解析之前修改 Vite 配置

configResolved:在解析 Vite 配置后调用,配置确认

configureServer:配置开发服务器的钩子(可添加自定义中间件)

transformIndexHtml:转换 宿主页面index.html 的专用钩子

handleHotUpdate:执行自定义 HMR 更新处理


初始化插件流程始化插件流程


1、初始化插件:


创建vite-plugin-example文件(自己定义的vite插件)

resolveId钩子用于接管第三方插件,通过该钩子我们可以很快判定该第三方插件是否是我们需要处理的。如果是则接管,跟着顺序,我们可以在load钩子中进行自定义我们自己的插件。


export default function (options) {
  return {
    name: 'dy-i18n',
    resolveId(source) {
      // 是否处理当前的请求  在main中导入的插件名称
      if (source === 'dy-i18n') {
        return source // 表示接管
      }
      return null
    },
    load(id) {
      console.log('id', id)
      // 返回加载的东西
      return 'export default "this is virtaul"'
    },
  }
}


2、配置执行插件


在vite.config.js文件中,执行相关插件函数


import i18n from './plugins/vite-plugin-example'
export default defineConfig({
    // 执行函数i18n
  plugins: [vue(), i18n()],
})


3、在入口文件中引入


import dyI18n from 'dy-i18n'
// 使用插件


i18n插件


初始化项目


使用vite创建一个项目,然后运行该项目。在控制台可以看出文件的按需加载。

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

在解析app文件的后面携带的一串字符:


?:后面说明该文件的sfc文件,

type:解析的模块类型是style样式文件,

index:后面接的是序号,解析的是当前类型的第一个样式

lang.css:解析的该语言是css同理:lang.i18n语言类型就是i18n


写入i18n自定义块


在此,我们写入的i18n插件是去解析自定义模块,将用户需要的代码段通过插件返回给用户。

<i18n>
{
  "en": {
    "language": "Language",
    "hello": "hello, world!"
  },
  "zh": {
    "language": "语言",
    "hello": "你好,世界!"
  }
}
</i18n>


写入的时候可以发现,控制台报错。无法识别我们自定义的代码块。



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


这就需要我们去编写处理该自定义模块的插件,返回所需要的东西给用户。


创建插件文件


接下来就是我们需要做的工作,拿到代码块进行转换处理。

新建插件文件vite-plugin-i18n.js。


export default {
  // code是块的内容
  // id是请求的url
  transform(code, id) {
    // i18n信息写入组件配置
    // 接收vue文件,类型是i18n
    if (!/vue&type=i18n/.test(id)) {
      return;
    }
    // 匹配成功  导出函数(工厂函数) 给组件加上i18n配置选项内容为块的内容
    return `export default Comp => {
      Comp.i18n = ${code}
    }`;
  },
};


请求经过i18n插件,返回插件处理好的资源。 此时,我们可以在控制台中看到,i18自定义块已经经过插件处理,给组件上添加了i18n属性。


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


语言选择器


在vue文件中,编写语言选择的静态页面:


<template>
  <label>{{ t('language') }}</label>
  <select v-model="locale">
    <option value="en">en</option>
    <option value="zh">zh</option>
  </select>
  <p>{{ t('hello') }}</p>
</template>


使用插件


在script中编写逻辑,获取i18n组件实例中的代码块,编写t函数,返回相对应语言的字段属性值。根据locale判断是什么语言,根据传入的关键值属性获取对应的语言值。


const ins = getCurrentInstance()
function useI18n(){
    const locale = ref('zh')
    const i18n = ins.type.i18n
    const t = msg => computed(()=> i18[locale.value][msg]).value
    return {locale,t}
}
const {locale,t} = useI18n()


可以看到效果是这样的:


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


完美实现,此处应该有掌声!🎉🎉🎉

感兴趣的朋友可以关注 vite系列专栏或者点击关注作者哦(●'◡'●)!。 如果不足,请多指教。

目录
相关文章
|
9月前
|
人工智能 自然语言处理 算法
DeepSeek:国产AI新势力,普通人如何用它赚钱?
DeepSeek 是一款由中国团队开发的大型语言模型,以其强大的自然语言处理能力迅速崛起,成为ChatGPT等国外大模型的强劲对手。它支持智能写作、代码生成、内容创作等多种功能,广泛应用于自媒体、编程、商业分析等领域。DeepSeek不仅免费且部分开源,用户可以直接访问官网体验,无需科学上网。其长文本处理能力和编程辅助功能尤为突出,适合长文写作和代码优化。DeepSeek还提供了多种变现途径,如自媒体写作、AI编程服务、课程咨询等,帮助用户在AI时代创造额外收入。掌握DeepSeek,开启AI变现之旅! 注:关注微信公众号“飞川”,发送“deepseek”获取丰富的资料包。
865 73
|
缓存 前端开发 JavaScript
html最大限度提高加载速度
要提高HTML页面的加载速度,可以采用多种策略:优化HTML结构,精简标签和合并文件;使用异步加载资源,如添加`async`或`defer`属性;压缩文件,利用HTMLMinifier减小文件大小;优化图片,采用合适格式和尺寸;利用CDN托管静态资源;设置HTTP缓存头以利用浏览器缓存;减少HTTP请求,合并文件;启用Gzip压缩;优化服务器响应时间;使用优雅降级和渐进增强确保兼容性。综合应用这些方法能显著提升加载速度和用户体验。
|
10月前
|
机器学习/深度学习 数据采集 算法
机器学习在生物信息学中的创新应用:解锁生物数据的奥秘
机器学习在生物信息学中的创新应用:解锁生物数据的奥秘
808 36
|
9月前
|
人工智能
云工开物合作动态丨中央美术学院与阿里云签约,推动人工智能和艺术与设计学科融合发展
2024年12月8日,中央美术学院与阿里云在厦门签署合作协议,双方将结合艺术与技术优势,在人工智能与艺术交叉学科的课程共建、学生实践等方面展开合作。阿里云通过“云工开物”计划提供算力资源和PAI ArtLab平台,助力师生高效创作,推动艺术与设计类人才培养新模式的探索。
|
存储 SQL 数据挖掘
TDengine 流计算与窗口机制的深度解析:揭示计数窗口的关键作用
在 TDengine 3.2.3.0 版本中,我们针对流式计算新增了计数窗口,进一步优化了流式数据处理的能力。本文将为大家解读流式计算与几大窗口的关系,并针对新增的计数窗口进行详细的介绍,帮助大家进一步了解 TDengine 流式计算,以便更好地进行应用。
176 1
|
SQL 存储 数据可视化
手机短信SQL分析技巧与方法
在手机短信应用中,SQL分析扮演着至关重要的角色
|
NoSQL 算法 JavaScript
一种优雅的方式整合限流、幂等、防盗刷
在工作中,接口防盗刷至关重要,尤其对于短信发送等高风险接口。本文以发送短信接口为例,探讨了仅校验手机号的局限性,并提出基于Ticket机制的解决方案。客户端需先申请Ticket,服务端通过UserAgent、IP等判断请求合法性,生成加密的Ticket。客户端携带Ticket调用接口,并可能需通过图形验证码验证。此方案实现限流、幂等性和防盗刷,适用于多种接口,提升安全性。同时,建议减少明显错误提示,增加破解难度。
432 6
一种优雅的方式整合限流、幂等、防盗刷
|
传感器 人工智能 物联网
【C 言专栏】C 语言与硬件交互的方法
【5月更文挑战第4天】C 语言在硬件交互中扮演关键角色,主要通过直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射I/O和设备驱动程序开发。挑战包括硬件多样性、实时性要求和错误处理。随着物联网和人工智能发展,C语言与硬件交互的需求增加,未来将面临更多新硬件和技术的挑战。本文旨在帮助读者理解和掌握这一领域的知识,以实现更高效的硬件互动。
413 1
【C 言专栏】C 语言与硬件交互的方法
|
移动开发 JSON 前端开发
HTML5作业(四)-----饼状图和柱状图绘制【附源码】
该实验旨在熟悉HTML5 Canvas绘制图形和表单交互。用户需输入统计数据,程序将依据数据绘制饼状图和柱状图。要求验证用户输入有效性,点击按钮可切换图表类型,图上需显示数据标注。提供的代码包含一个表单用于输入JSON数据,两个绘制函数(drawPieChart、drawBarChart)用于生成饼状图和柱状图,以及输入验证和颜色生成辅助函数。
508 1