Vite相关插件
记录下日常使用 Vite 的一些相关插件。
unplugin-auto-import
自动导入 vue3 相关方法,支持vue
, vue-router
, vue-i18n
, @vueuse/head
, @vueuse/core
等自动引入
效果
// 引入前
import { ref, computed } from 'vue'
const count = ref(0)
const doubled = computed(() => count.value * 2)
//引入后
const count = ref(0)
const doubled = computed(() => count.value * 2)
// 引入前
import { useState } from 'react'
export function Counter() {
const [count, setCount] = useState(0)
return <div>{count}</div>
}
//引入后
export function Counter() {
const [count, setCount] = useState(0)
return <div>{count}</div>
}
安装
npm i -D unplugin-auto-import
vite.config.js
import { defineConfig } from 'vite'
import AutoImport from 'unplugin-auto-import/vite'
export default defineConfig({
plugins: [
AutoImport({
imports: [
'vue',
'vue-router',
'vue-i18n',
'@vueuse/head',
'@vueuse/core',
],
dts: 'src/auto-import.d.ts',
// 可以选择auto-import.d.ts生成的位置(默认根目录),建议设置为'src/auto-import.d.ts'
}),
],
})
原理: 自动生成 auto-imports.d.ts 文件用于代码提示,如下
auto-imports.d.ts
// Generated by 'unplugin-auto-import'
// We suggest you to commit this file into source control
declare global {
const ref: typeof import('vue')['ref']
const reactive: typeof import('vue')['reactive']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
const watch: typeof import('vue')['watch']
const customRef: typeof import('vue')['customRef']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
}
export {}
注意
注意,由于没有局部导入,在代码跳转查看时,就会跳转到 auto-imports.d.ts 文件,然后再跳转到原定义位置。
响应式语法糖
Reactivity Transform | Vue.js (vuejs.org)
使用$ref 在使用时,无需.value。演示如下
import { $ref, $$ } from 'vue/macros' // $ref是vue/macros包下的
// bind ref as a variable
let count = $ref(0)
// assignments are reactive
count++
// get the actual ref
console.log($$(count)) // { value: 1 }
- 可以用
$()
来解构响应式对象,这样就不用写.value
- 可以用
$$()
来获取原有的响应式对象
在 vite.config.ts 文件里,加上reactivityTransform: true
vite.config.js
plugins: [
vue({
reactivityTransform: true,
}),
]
可以使用 unplugin-auto-import 中的导入vue/macros
无需 import 导入。
vite.config.js
AutoImport({
imports: ['vue/macros'],
dts: true,
})
unplugin-vue-components
自动导入 UI 库,按需导入。很多组件库都推荐这种方式导入例如 Element Plus 、Ant Design Vue
安装
npm install unplugin-vue-components -D
vite.config.js
import { defineConfig } from 'vite'
import Components from 'unplugin-vue-components/vite'
import {
ElementPlusResolver,
AntDesignVueResolver,
VantResolver,
HeadlessUiResolver,
ElementUiResolver
} from 'unplugin-vue-components/resolvers'
export default defineConfig({
plugins: [
Components({
// ui库解析器,也可以自定义
resolvers: [
ElementPlusResolver(),
AntDesignVueResolver(),
VantResolver(),
HeadlessUiResolver(),
ElementUiResolver()
]
})
]
插件会生成一个 ui 库组件以及指令路径 components.d.ts 文件,如下
components.d.ts
// generated by unplugin-vue-components
// We suggest you to commit this file into source control
// Read more: https://github.com/vuejs/vue-next/pull/3399
declare module 'vue' {
export interface GlobalComponents {
ElAside: typeof import('element-plus/es')['ElAside']
ElButton: typeof import('element-plus/es')['ElButton']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElHeader: typeof import('element-plus/es')['ElHeader']
ElIcon: typeof import('element-plus/es')['ElIcon']
ElMain: typeof import('element-plus/es')['ElMain']
}
}
export {}
只要你用过的组件都会自动导入,同时也可以导入自己的组件。
vite.config.js
import { defineConfig } from 'vite'
import Components from 'unplugin-vue-components/vite'
export default defineConfig({
plugins: [
Components({
// 指定组件位置,默认是src/components
dirs: ['src/components'],
extensions: ['vue'],
// 配置文件生成位置
dts: 'src/components.d.ts',
}),
],
})
unplugin-vue-define-options/vite
script setup 语法糖通过 defineOptions 定义组件 name、inheritAttrs、props、emits
安装
npm i unplugin-vue-define-options
vite.config.js
import { defineConfig } from 'vite'
import DefineOptions from 'unplugin-vue-define-options/vite'
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue(), DefineOptions()],
})
在tsconfig.json
设置 types,如下所示:
{
"compilerOptions": {
"types": ["unplugin-vue-define-options"]
}
}