unplugin-auto-import 的 vite resolvers
,主要处理 vite
项目本身的 api
按需自动引入。
简体中文 | English
为了按需自动引入指定目录下模块的 api
。
- 安装
npm i vite-auto-import-resolvers unplugin-auto-import -D
# pnpm 👇
# pnpm i vite-auto-import-resolvers unplugin-auto-import -D
# yarn 👇
# yarn add vite-auto-import-resolvers unplugin-auto-import -D
- 配置插件
// vite.config.js
// 或者 vite.config.ts
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import AutoImports from 'unplugin-auto-import/vite'
import { dirResolver, DirResolverHelper } from 'vite-auto-import-resolvers'
export default defineConfig({
plugins: [
Vue(),
// 该辅助插件也是必需的 👇
DirResolverHelper(),
dts: 'src/auto-imports.d.ts',
AutoImports({
imports: ['vue'],
resolvers: [
dirResolver()
]
})
]
})
- 之后
src/composables
下模块的默认导出将在项目中自动按需引入
例如 👇
// src/composables/foo.ts
export default 100
// src/App.vue
<script setup>
console.log(foo) // 输出100,而且是按需自动引入的
</script>
<template>
Hello World!!
</template>
- 类型配置(已废弃,不需要)
如果你的项目是 ts
的,那么你应该始终在 tsconfig.json
中保持以下配置 👇
{
"compilerOptions": {
// 其他配置
"baseUrl": ".",
"paths": {
"/src/*": ["src/*"]
}
},
// 其他配置
}
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import AutoImports from 'unplugin-auto-import/vite'
import { dirResolver, DirResolverHelper } from 'vite-auto-import-resolvers'
export default defineConfig({
plugins: [
Vue(),
DirResolverHelper(),
AutoImports({
imports: ['vue'],
resolvers: [
dirResolver({ prefix: 'use' }), // 强制前缀为 use
dirResolver({
target: 'stores', // 目标目录,默认为 composables
suffix: 'Store' // 强制后缀为 Store
})
]
})
]
})
于是
src/composables
下只有use
开头的模块会被按需加载src/stores
下只有Store
结尾的模块会被按需加载
例如 👇
// src/stores/counterStore.ts
const counter = ref(100)
export default () => {
const inc = (v: number = 1) => (counter.value += v)
return {
inc,
counter
}
}
<script setup lang="ts">
// 这将按需自动引入
const n = counterStore()
</script>
<template>
<div @click="n.inc()">{{n.counter}}</div>
</template>
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import AutoImports from 'unplugin-auto-import/vite'
import { dirResolver, DirResolverHelper } from 'vite-auto-import-resolvers'
export default defineConfig({
plugins: [
Vue(),
DirResolverHelper(),
AutoImports({
imports: ['vue'],
resolvers: [
dirResolver({
prefix: 'use',
include: ['foo'], // 即使 foo 模块不是以 use 开头也会被包含进来
exclude: ['useBar'] // useBar 模块将始终被排除
})
]
})
]
})
import { resolve } from 'path'
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import AutoImports from 'unplugin-auto-import/vite'
import { dirResolver, DirResolverHelper } from 'vite-auto-import-resolvers'
export default defineConfig({
plugins: [
Vue(),
DirResolverHelper(),
AutoImports({
imports: ['vue'],
resolvers: [
dirResolver({
root: '.' // 默认为 src
})
]
})
]
})
你可能在项目中用其他风格的路径别名,例如 @
那么你可以这样配置 👇
import { resolve } from 'path'
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import AutoImports from 'unplugin-auto-import/vite'
import { dirResolver, DirResolverHelper } from 'vite-auto-import-resolvers'
export default defineConfig({
resolve: {
alias: {
// 改变别名
'@/': `${resolve(__dirname, 'src')}/`
}
},
plugins: [
Vue(),
DirResolverHelper(),
AutoImports({
imports: ['vue'],
resolvers: [
dirResolver({ srcAlias: '@' }) // 设置别名,默认为 /src/
]
})
]
})
如果你是 ts
的项目,tsconfig.json
理所当然也应该改 👇
{
"compilerOptions": {
// 其他配置
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
// 其他配置
}
在使用 unplugin-auto-imports
时,需要手动管理 imports
👇
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import AutoImports from 'unplugin-auto-import/vite'
export default defineConfig({
plugins: [
Vue(),
AutoImports({
imports: ['vue', 'vue-router', 'pinia'] // 手动管理
})
]
})
但有时候你可能需要去变动一些依赖,例如将 pinia
换成 vuex
,这时如果配置未更改就会发生错误。同时如果你设置了未安装的包,这将造成无谓的性能消耗。
所以你能这样 👇
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import AutoImports from 'unplugin-auto-import/vite'
import { AutoGenerateImports } from "vite-auto-import-resolvers"
export default defineConfig({
plugins: [
Vue(),
AutoImports({
imports: AutoGenerateImports() // 自动管理,只有对应的包有装时才会自动按需设置预设
})
]
})
include
属性
- vue
- pinia
- vuex
- vitest
- vue-i18n
- vue-router
- @vueuse/core
- @vueuse/head
- @nuxtjs/composition-api
- preact
- quasar
- react
- react-router
- react-router-dom
- svelte
- svelte/animate
- svelte/easing
- svelte/motion
- svelte/store
- svelte/transition
- vitepress
- vee-validate
当然你可以手动排除掉不想要的 👇
import { defineConfig } from 'vite'
import Vue from '@vitejs/plugin-vue'
import AutoImports from 'unplugin-auto-import/vite'
import { AutoGenerateImports } from "vite-auto-import-resolvers"
export default defineConfig({
plugins: [
Vue(),
AutoImports({
imports: AutoGenerateImports({
exclude: ['pinia'] // pinia 将始终被排除
})
})
]
})
该 resolvers
来源于 unplugin-auto-import
的 issue
讨论 👉 How should I auto import composition functions。
更多项目工程实践可见 👉 tov-template
Made with markthree
Published under MIT License.