程序员scholar 程序员scholar
首页
  • Web 三剑客

    • HTML
    • CSS
    • JavaScript
  • 现代 JavaScript

    • ES6
    • TypeScript
  • 前端工具库

    • jQuery
    • Ajax
    • Axios
  • Vue 生态

    • Vue2
    • Vue3
    • Vue3 + TS
    • Vuex
  • 小程序开发

    • 微信小程序
    • uni-app
  • 构建工具

    • Webpack
  • 服务端技术

    • Node.js
  • 实时通信

    • WebSocket
    • 第三方登录
  • Element-UI
  • Apache ECharts
后端 (opens new window)
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Web 三剑客

    • HTML
    • CSS
    • JavaScript
  • 现代 JavaScript

    • ES6
    • TypeScript
  • 前端工具库

    • jQuery
    • Ajax
    • Axios
  • Vue 生态

    • Vue2
    • Vue3
    • Vue3 + TS
    • Vuex
  • 小程序开发

    • 微信小程序
    • uni-app
  • 构建工具

    • Webpack
  • 服务端技术

    • Node.js
  • 实时通信

    • WebSocket
    • 第三方登录
  • Element-UI
  • Apache ECharts
后端 (opens new window)
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Vue2

  • Vue3

  • vue3 + TS 项目集成

    • 集成element-plus
    • 项目配置 src 别名
    • 项目配置环境变量
    • 项目集成 SVG 图标
    • 项目集成 SASS(SCSS)
    • 项目集成 Mock 数据
    • 项目集成axios二次封装
    • 项目集成 vite调试工具
    • 项目集成自动注册组件
      • 1. 为什么使用 `unplugin-vue-components`?
      • 2. 安装 `unplugin-vue-components`
      • 3. 在 `vite.config.ts` 配置插件
      • 4. 组件如何使用?
        • 1. 自动注册全局组件
        • 2. 支持 `src/components` 子目录
        • 3. 兼容 UI 组件库
        • 📌 兼容 `Element Plus`
        • 📌 兼容 `Naive UI`
      • 5. 自动生成 TypeScript 组件类型
      • 6. 解决常见问题
    • 项目集成自动导入 API
  • Vue全家桶
  • vue3 + TS 项目集成
scholar
2025-04-30
目录

项目集成自动注册组件

# 项目集成自动注册组件

在 Vue3 项目开发过程中,组件的注册方式 直接影响开发效率。通常,我们有两种方式来注册组件:

  1. 手动注册组件

    <script setup>
    import MyComponent from '@/components/MyComponent.vue';
    </script>
    
    1
    2
    3
    • 优点:显式导入,易于追踪组件来源。
    • 缺点:需要在每个组件中手动 import,大量使用组件时会很繁琐。
  2. 自动注册组件

    <template>
      <MyComponent />
    </template>
    
    1
    2
    3

    💡 如何做到? 通过 unplugin-vue-components 插件,Vite 可以自动扫描 src/components/ 目录,无需手动 import 组件,提高开发效率!


# 1. 为什么使用 unplugin-vue-components?

✅ 无需手动 import 组件,自动扫描 src/components/,提高开发效率。 ✅ 支持子目录组件,例如 src/components/base/Button.vue 也能自动注册。 ✅ 自动生成 TypeScript 类型声明,让 Vue3 + TypeScript 开发更加顺滑。 ✅ 兼容 UI 组件库(如 Element Plus、Naive UI),可自动注册常用 UI 组件。


# 2. 安装 unplugin-vue-components

使用 pnpm 安装:

pnpm install -D unplugin-vue-components
1

或者使用 npm / yarn:

npm install -D unplugin-vue-components
# 或
yarn add -D unplugin-vue-components
1
2
3

# 3. 在 vite.config.ts 配置插件

安装完成后,需要在 vite.config.ts 启用 unplugin-vue-components,让其自动扫描 src/components 目录。

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import Components from 'unplugin-vue-components/vite';

export default defineConfig({
  plugins: [
    vue(),
    Components({
      dirs: ['src/components'], // 自动扫描 src/components 目录
      deep: true, // 允许扫描子目录
      extensions: ['vue'], // 仅注册 .vue 组件
      dts: 'src/components.d.ts', // 自动生成全局组件类型声明
    }),
  ],
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

📌 配置解析

  • dirs: ['src/components'] 👉 自动扫描 src/components 目录中的 .vue 组件。
  • deep: true 👉 允许扫描子目录,例如 src/components/base/Button.vue 也能自动注册。
  • extensions: ['vue'] 👉 仅处理 .vue 组件,避免影响 .ts 或 .js 文件。
  • dts: 'src/components.d.ts' 👉 自动生成 TypeScript 组件类型声明,在 Vue3 + TypeScript 项目中非常有用。

# 4. 组件如何使用?

# 1. 自动注册全局组件

现在,我们可以在 Vue 组件中 直接使用组件,而不需要手动 import:

<template>
  <MyComponent />
</template>
1
2
3

而不需要:

<script setup>
import MyComponent from '@/components/MyComponent.vue';
</script>
1
2
3

✅ 组件会被自动注册,无需手动 import!


# 2. 支持 src/components 子目录

如果 src/components 目录下有多个子目录:

src/components/
│── base/
│   │── Button.vue
│   │── Card.vue
│── common/
│   │── Modal.vue
│   │── Table.vue
1
2
3
4
5
6
7

在 deep: true 配置下,所有子目录内的组件都会被自动注册:

<template>
  <Button />
  <Card />
  <Modal />
  <Table />
</template>
1
2
3
4
5
6

📌 无需手动导入,Vite 会自动找到并注册这些组件!


# 3. 兼容 UI 组件库

unplugin-vue-components 还可以与 UI 组件库(Element Plus、Naive UI、Ant Design Vue 等) 结合,实现 按需自动引入,避免手动 import 组件。

# 📌 兼容 Element Plus

在 vite.config.ts 配置:

import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';

Components({
  resolvers: [ElementPlusResolver()],
});
1
2
3
4
5

这样,我们就可以直接使用 Element Plus 组件,而不需要手动 import:

<template>
  <el-button type="primary">按钮</el-button>
</template>
1
2
3

📌 无需 import { ElButton } from 'element-plus',插件会自动注册!

# 📌 兼容 Naive UI

import { NaiveUiResolver } from 'unplugin-vue-components/resolvers';

Components({
  resolvers: [NaiveUiResolver()],
});
1
2
3
4
5

📌 自动注册 Naive UI 组件,直接使用 <n-button /> 等组件!


# 5. 自动生成 TypeScript 组件类型

如果你的项目是 Vue3 + TypeScript,那么 unplugin-vue-components 还会自动生成全局组件类型声明,让 TS 代码更流畅!

📌 自动生成 src/components.d.ts

// 自动注册的组件类型
declare module '@vue/runtime-core' {
  export interface GlobalComponents {
    MyComponent: typeof import('./components/MyComponent.vue')['default'];
    Button: typeof import('./components/base/Button.vue')['default'];
  }
}
export {};
1
2
3
4
5
6
7
8

📌 这样,TS 就不会报 Cannot find name 'MyComponent' 之类的错误!


# 6. 解决常见问题

🔹 问题 1:自动注册的组件没有生效

✅ 解决方案:

  • 确保 组件文件名首字母大写,例如 MyComponent.vue 而不是 myComponent.vue。

  • 如果组件没有被自动注册,尝试 重启 Vite 服务器:

    pnpm run dev
    
    1

🔹 问题 2:TypeScript 仍然提示 Cannot find name 'xxx'

✅ 解决方案:

  • 确保 vite.config.ts 配置了:

    Components({
      dts: 'src/components.d.ts',
    });
    
    1
    2
    3
  • 手动删除 src/components.d.ts,然后重启 Vite 服务器:

    rm src/components.d.ts
    pnpm run dev
    
    1
    2
编辑此页 (opens new window)
项目集成 vite调试工具
项目集成自动导入 API

← 项目集成 vite调试工具 项目集成自动导入 API→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式