在 Vue 中自动引入组件、路由、工具函数等
未使用前感觉没什么卵用,使用后真香感觉已经离不开了
一共包含三个工具库
unplugin-auto-import
:自动引入工具库和 store,需自己配置引入路径,注意自动引入的变量不能直接在 Vue template 中使用,需要重新声明一次
unplugin-vue-router
:自动引入路由,根据本地文件路径映射访问地址,默认的文件夹路径是src/pages/**
可自己修改,definePage
可定义 meta 相关信息
unplugin-vue-components
:自动引入第三方或自己封装组件,默认路径src/components
代码实现
ts
import { fileURLToPath, URL } from 'node:url';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import VueDevTools from 'vite-plugin-vue-devtools';
import Unocss from 'unocss/vite';
import AutoImport from 'unplugin-auto-import/vite';
import VueRouter from 'unplugin-vue-router/vite';
import { VueRouterAutoImports } from 'unplugin-vue-router';
import Components from 'unplugin-vue-components/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
VueRouter({
dts: 'src/types-auto/typed-router.d.ts'
}),
AutoImport({
// 配置第三方库的自动引入
imports: ['vue', VueRouterAutoImports],
resolvers: [ElementPlusResolver()],
// 可添加需要自动引入的文件路径
dirs: ['src/stores', 'src/utils'],
dts: 'src/types-auto/auto-imports.d.ts'
}),
Components({
resolvers: [ElementPlusResolver()],
dts: 'src/types-auto/components.d.ts'
// 有些组件库官方未提供支持,可自己配置
// resolvers: [
// name => {
// if (name === 'Icon') return { name: 'Icon', from: '@iconify/vue' };
// }
// ]
}),
Unocss(),
VueDevTools(),
vue(),
vueJsx()
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
}
});
json
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
"composite": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
},
// 增加一行配置
"types": ["unplugin-vue-router/client"]
}
}
ts
import './assets/main.css';
import { createApp } from 'vue';
import { createPinia } from 'pinia';
import '@unocss/reset/tailwind.css';
import 'uno.css';
import App from './App.vue';
import 'element-plus/theme-chalk/src/message.scss';
// 修改路由引入方式如下
import { createRouter, createWebHashHistory } from 'vue-router/auto';
const router = createRouter({
history: createWebHashHistory()
});
const app = createApp(App);
app.use(createPinia());
app.use(router);
app.mount('#app');
ts
export const aaa = '11111111';
vue
<template>
<div class="login">
<HelloWord />
<p>{{ aaa2 }}</p>
coding
</div>
</template>
<style lang="scss" scoped>
.login {
}
</style>
<script lang="ts" setup>
import type { ElTooltip } from 'element-plus';
definePage({
alias: ['/register', '/forgot-password'],
meta: { layout: 'empty' }
});
// 需要 element 组件的 ref 可以这么写
const tooltip = ref<InstanceType<typeof ElTooltip>>(null!);
// 自动引入的变量如果需要在 template 中使用,需要重新声明一次
const aaa2 = aaa;
const store = useStore();
const route = useRoute();
const router = useRouter();
</script>
TIP
在目前的版本下还是有一些小问题,比如文件重命名或删除后旧的定义未移除,建议定期删除生成的d.ts
文件。
自动路由在修改文件名后会持续报错,此时需要重启服务才可恢复。
"unplugin-auto-import": "^0.17.5",
"unplugin-vue-components": "^0.26.0",
"unplugin-vue-router": "^0.8.4",