使用vite插件可以扩展vite的能力,比如解析用户自定义的文件输入,在打包代码前转译代码。
插件钩子
export default function(options){return {name: 'my-vite-plugin',// 修改vite配置config(){},// vite配置确认configResolved(){},// 用于配置dev serverconfigureServer(){},// 用于转换宿主页transformIndexHtml(){},// 创建自定义确认函数resolveId(id){},// 创建自定义加载函数,可用于返回自定义内容load(id){},// 可用于转换已加载的模块内容transform(code){},// 自定义hrm更新时调用handleHotUpdate(){}}}
手写一个vite插件
1. 定义多语言文件
我们尝试把配置文件以标签的形式写在vue中。
export default defineComponent({name: 'App',setup(){}})</script><i18n>{"en": {"language": "en","message": "this is message content"},"zh": {"language": "中文","message": "我是消息的啊"}}</i18n>
2. 引入vite插件
我们的vite需要解析这个i18n标签,就要自定义一个插件来实现。
export default {name: 'vite-vue-i18n',transform(code, id){// 将load进来的代码进行加工if (/vue&type=i18n/.test(id)){return `export default Components => {Components.i18n = ${code};}`}return null;}}
加载插件,在vite.config.js中修改。
import { defineConfig } from 'vite'import vue from '@vitejs/plugin-vue'import I18n from './plugins/vite-vue-i18n'// https://vitejs.dev/config/export default defineConfig({plugins: [vue(), I18n]})
经过上面的配置,我们就可以在界面中发现已解析了i18n的标签。
3. 如何使用
加载的插件是挂载到vue实例当中的,所以我们需要从实例中获取。
<script lang="ts">import { defineComponent, ref, getCurrentInstance, computed } from 'vue'export default defineComponent({name: 'App',setup(){// 获取当前vue实例const ins: any = getCurrentInstance();const useI18n = () => {const locale = ref('zh');// 拿到实例中的i18n数据const i18n = ins.type.i18n;const t = (msg: string) => {// t 返回一个计算属性,动态取值return computed(() => i18n[locale.value][msg]).value;}return {t, locale};}const { locale, t } = useI18n();return { locale, t }}})</script>
vue模板文件
<template><label>{{t('language')}}</label><select v-model="locale"><option value="en">en</option><option value="zh">zh</option></select><p>{{t('message')}}</p></template>
实现以上的功能,我们就完成啦。
😁
