使用vite插件可以扩展vite的能力,比如解析用户自定义的文件输入,在打包代码前转译代码。
插件钩子
export default function(options){
return {
name: 'my-vite-plugin',
// 修改vite配置
config(){},
// vite配置确认
configResolved(){},
// 用于配置dev server
configureServer(){},
// 用于转换宿主页
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>
实现以上的功能,我们就完成啦。
😁