项目集成自动导入 API
# 项目集成自动导入 API
在 Vue3 开发过程中,我们经常需要手动导入 ref、computed、watch 等 Vue API,同时 vue-router 的 useRouter()、useRoute() 以及 Pinia 的 defineStore() 也需要手动 import,例如:
import { ref, computed } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { defineStore } from 'pinia';
2
3
在多个文件中反复导入这些 API 非常繁琐,同时如果某些 import 遗漏,会导致 TS 报错。
为了解决这个问题,我们可以使用 unplugin-auto-import 自动导入 Vue、Vue Router、Pinia 的 API,这样我们在代码中就可以直接使用这些 API,而不需要手动导入,提高开发效率!
# 1. 为什么使用 unplugin-auto-import?
- ✅ 无需手动
importVue、Vue Router、Pinia 的 API,减少代码冗余。 - ✅ TypeScript 友好,自动生成类型声明文件,避免
TS报错。 - ✅ 支持 ESLint 规则,保证代码风格一致,不影响静态检查。
- ✅ 可扩展性强,可以配置自动导入
VueUse、Axios等工具库的 API。
# 2. 安装 unplugin-auto-import
使用 pnpm 安装:
pnpm install -D unplugin-auto-import
或者使用 npm / yarn:
npm install -D unplugin-auto-import
# 或
yarn add -D unplugin-auto-import
2
3
# 3. 在 vite.config.ts 配置插件
安装完成后,需要在 vite.config.ts 启用 unplugin-auto-import,让其自动导入 Vue、Vue Router、Pinia 的 API。
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import AutoImport from 'unplugin-auto-import/vite';
export default defineConfig({
plugins: [
vue(),
AutoImport({
imports: ['vue', 'vue-router', 'pinia'], // 自动导入 Vue & Vue Router & Pinia API
dts: 'src/auto-imports.d.ts', // 生成全局类型声明,支持 TypeScript
eslintrc: {
enabled: true, // 生成 `.eslintrc-auto-import.json`,自动配置 ESLint
},
}),
],
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
📌 配置解析
imports: ['vue', 'vue-router', 'pinia']👉 自动导入ref、computed、useRouter()、defineStore()等 API。dts: 'src/auto-imports.d.ts'👉 自动生成 TypeScript 类型声明,避免TS报Cannot find name 'ref'。eslintrc.enabled: true👉 自动配置 ESLint,避免ESLint报no-undef错误。
# 4. 配置成功后代码使用
# 📌 1. 不用再手动 import
有了 unplugin-auto-import,我们可以直接使用 Vue API,而不需要手动 import:
<script setup lang="ts">
const count = ref(0);
const double = computed(() => count.value * 2);
</script>
2
3
4
而不需要:
<script setup lang="ts">
import { ref, computed } from 'vue';
const count = ref(0);
const double = computed(() => count.value * 2);
</script>
2
3
4
5
6
✅ ref 和 computed 会被自动导入,不需要 import!
# 📌 2. vue-router 直接使用 useRouter()
如果项目中使用 vue-router,我们可以直接使用 useRouter(),而不需要手动导入:
<script setup lang="ts">
const router = useRouter();
const goHome = () => {
router.push('/');
};
</script>
2
3
4
5
6
7
📌 无需 import { useRouter } from 'vue-router',插件会自动导入!
# 📌 3. Pinia 直接使用 defineStore()
如果项目中使用了 Pinia,我们可以直接使用 defineStore() 创建状态管理:
export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0,
}),
actions: {
increment() {
this.count++;
},
},
});
2
3
4
5
6
7
8
9
10
📌 无需 import { defineStore } from 'pinia',插件会自动导入!
# 5. 自动生成 TypeScript 类型
如果你的项目是 Vue3 + TypeScript,unplugin-auto-import 会自动生成全局类型声明,避免 TS 报错。
📌 自动生成 src/auto-imports.d.ts
// 这个文件是自动生成的,避免手动 import
declare global {
const ref: typeof import('vue')['ref'];
const computed: typeof import('vue')['computed'];
const watch: typeof import('vue')['watch'];
const useRouter: typeof import('vue-router')['useRouter'];
const defineStore: typeof import('pinia')['defineStore'];
}
export {};
2
3
4
5
6
7
8
9
📌 这样,TS 就不会报 Cannot find name 'ref' 之类的错误!
# 6. 解决常见问题
# 🔹 问题 1:自动导入的 API 没生效
✅ 解决方案:
确保
vite.config.ts已正确配置:AutoImport({ imports: ['vue', 'vue-router', 'pinia'], dts: 'src/auto-imports.d.ts', });1
2
3
4重启 Vite 服务器 让插件生效:
pnpm run dev1
# 🔹 问题 2:TypeScript 仍然报 Cannot find name 'xxx'
✅ 解决方案:
确保
dts已正确配置,并且src/auto-imports.d.ts存在:dts: 'src/auto-imports.d.ts',1手动删除
src/auto-imports.d.ts,然后重启 Vite 服务器:rm src/auto-imports.d.ts pnpm run dev1
2
# 🔹 问题 3:ESLint 报 no-undef
✅ 解决方案:
确保
eslintrc.enabled: true已开启:AutoImport({ eslintrc: { enabled: true, }, });1
2
3
4
5运行
pnpm run dev让插件自动生成.eslintrc-auto-import.json,然后在 .eslintrc.js 中引用它:module.exports = { extends: ['./.eslintrc-auto-import.json'], };1
2
3