or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

component-resolution.mdindex.mdnuxt-integration.mdplugin-configuration.mdtypescript-integration.mdui-library-resolvers.md
tile.json

tessl/npm-unplugin-vue-components

Vue component auto-importing plugin for multiple build tools including Vite, Webpack, Rollup, and esbuild

Workspace
tessl
Visibility
Public
Created
Last updated
Describes
npmpkg:npm/unplugin-vue-components@29.0.x

To install, run

npx @tessl/cli install tessl/npm-unplugin-vue-components@29.0.0

index.mddocs/

unplugin-vue-components

unplugin-vue-components is a universal Vue component auto-importing plugin that works across multiple build tools including Vite, Webpack, Rollup, esbuild, and Rspack. It automatically imports Vue components on-demand from local directories or popular UI libraries, eliminating the need for manual component registration and significantly reducing boilerplate code while maintaining full TypeScript support and tree-shaking optimization.

Package Information

  • Package Name: unplugin-vue-components
  • Package Type: npm
  • Language: TypeScript
  • Installation: npm install unplugin-vue-components

Core Imports

import Components from "unplugin-vue-components/vite";

For other build tools:

import Components from "unplugin-vue-components/webpack";
import Components from "unplugin-vue-components/rollup";
import Components from "unplugin-vue-components/esbuild";
import Components from "unplugin-vue-components/rspack";

For Nuxt:

import Components from "unplugin-vue-components/nuxt";

Resolvers for UI libraries:

import { ElementPlusResolver, AntDesignVueResolver } from "unplugin-vue-components/resolvers";

Utility functions:

import { camelCase, kebabCase, pascalCase } from "unplugin-vue-components";

Type definitions:

import type { Options, ComponentInfo, ComponentResolver } from "unplugin-vue-components/types";

Basic Usage

// vite.config.ts
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import Components from "unplugin-vue-components/vite";

export default defineConfig({
  plugins: [
    vue(),
    Components({
      // Auto import components from src/components directory
      dirs: ["src/components"],
      // Generate TypeScript declarations
      dts: true,
      // Auto import from UI libraries
      resolvers: [ElementPlusResolver()],
    }),
  ],
});

After setup, use components directly in Vue templates without imports:

<template>
  <!-- Local component auto-imported from src/components/HelloWorld.vue -->
  <HelloWorld />
  
  <!-- UI library component auto-imported via resolver -->
  <ElButton type="primary">Click me</ElButton>
</template>

<script setup lang="ts">
// No manual imports needed - components are auto-imported!
</script>

Architecture

unplugin-vue-components is built around several key components:

  • Universal Plugin: Uses unplugin framework to provide consistent API across all build tools
  • Context System: Centralized component discovery and caching with file watching capabilities
  • Resolver System: Extensible component resolution with built-in support for 20+ UI libraries
  • Transformer Engine: Vue 2/3 compatible code transformations with TypeScript support
  • Declaration Generator: Automatic TypeScript declaration generation for IDE intellisense

Capabilities

Plugin Configuration

Core plugin setup and configuration options for customizing component discovery, transformations, and build tool integration.

interface Options {
  include?: FilterPattern;
  exclude?: FilterPattern;
  dirs?: string | string[];
  extensions?: string | string[];
  resolvers?: ComponentResolver[];
  dts?: boolean | string;
  transformer?: "vue2" | "vue3";
}

// Build tool specific plugin functions
function VitePlugin(options?: Options): Plugin & { api: PublicPluginAPI };
function WebpackPlugin(options?: Options): WebpackPlugin;
function RollupPlugin(options?: Options): RollupPlugin;

Plugin Configuration

Component Resolution

Built-in component discovery from directories and extensible resolver system for UI libraries, with support for custom resolution logic.

type ComponentResolver = ComponentResolverFunction | ComponentResolverObject;

interface ComponentResolverFunction {
  (name: string): ComponentResolveResult;
}

interface ComponentResolverObject {
  type: "component" | "directive";
  resolve: ComponentResolverFunction;
}

type ComponentResolveResult = string | ComponentInfo | null | undefined | void;

Component Resolution

UI Library Resolvers

Pre-built resolvers for popular Vue UI libraries including Element Plus, Ant Design Vue, Vuetify, Quasar, and many others.

function ElementPlusResolver(options?: ElementPlusResolverOptions): ComponentResolver;
function AntDesignVueResolver(options?: AntDesignVueResolverOptions): ComponentResolver;
function VuetifyResolver(options?: VuetifyResolverOptions): ComponentResolver;

UI Library Resolvers

TypeScript Integration

Automatic TypeScript declaration generation and type-safe configuration with full IDE intellisense support.

interface PublicPluginAPI {
  findComponent(name: string, filename?: string): Promise<ComponentInfo | undefined>;
  stringifyImport(info: ComponentInfo): string;
}

interface ComponentInfo {
  as?: string;
  name?: string;
  from: string;
  sideEffects?: SideEffectsInfo;
}

TypeScript Integration

Utility Functions

String transformation utilities for consistent component naming conventions across Vue applications.

function camelCase(str: string): string;
function kebabCase(str: string): string;
function pascalCase(str: string): string;

Nuxt Integration

Dedicated Nuxt module providing seamless integration with Nuxt's auto-import system and server-side rendering support.

// nuxt.config.ts
export default defineNuxtModule({
  modules: ["unplugin-vue-components/nuxt"],
  components: {
    // Configuration options
  },
});

Nuxt Integration

Types

Core Configuration Types

interface Options {
  /** RegExp or glob to match files to be transformed */
  include?: FilterPattern;
  /** RegExp or glob to match files to NOT be transformed */
  exclude?: FilterPattern;
  /** RegExp or string to match component names that will NOT be imported */
  excludeNames?: FilterPattern;
  /** Relative paths to the directory to search for components */
  dirs?: string | string[];
  /** Valid file extensions for components */
  extensions?: string | string[];
  /** Glob patterns to match file names to be detected as components */
  globs?: string | string[];
  /** Negated glob patterns to exclude files from being detected as components */
  globsExclude?: string | string[];
  /** Search for subdirectories */
  deep?: boolean;
  /** Allow subdirectories as namespace prefix for components */
  directoryAsNamespace?: boolean;
  /** Generate components with prefix */
  prefix?: string;
  /** Collapse same prefixes of folders and components */
  collapseSamePrefixes?: boolean;
  /** Subdirectory paths for ignoring namespace prefixes */
  globalNamespaces?: string[];
  /** Custom component resolvers */
  resolvers?: ComponentResolver[];
  /** Custom function to transform the importing path */
  importPathTransform?: (path: string) => string | undefined;
  /** Transformer to apply */
  transformer?: "vue2" | "vue3";
  /** Transform users' usage of resolveComponent/resolveDirective as well */
  transformerUserResolveFunctions?: boolean;
  /** Generate TypeScript declaration for global components */
  dts?: boolean | string;
  /** Do not emit warning on component overriding */
  allowOverrides?: boolean;
  /** Auto import for directives */
  directives?: boolean;
  /** Only provide types of components in library */
  types?: TypeImport[];
  /** Vue version of project */
  version?: 2 | 2.7 | 3;
  /** Generate sourcemap for the transformed code */
  sourcemap?: boolean;
  /** Save component information into a JSON file */
  dumpComponentsInfo?: boolean | string;
}

type FilterPattern = string | RegExp | (string | RegExp)[];

Component Information Types

interface ComponentInfo {
  /** Import alias name */
  as?: string;
  /** Component name */
  name?: string;
  /** Import path */
  from: string;
  /** Side effect imports */
  sideEffects?: SideEffectsInfo;
}

interface ImportInfo {
  /** Import alias */
  as?: string;
  /** Import name */
  name?: string;
  /** Import source */
  from: string;
}

type SideEffectsInfo = (ImportInfo | string)[] | ImportInfo | string | undefined;

interface TypeImport {
  /** Import source */
  from: string;
  /** Type names to import */
  names: string[];
}

Plugin API Types

interface PublicPluginAPI {
  /** Resolves a component using the configured resolvers */
  findComponent(name: string, filename?: string): Promise<ComponentInfo | undefined>;
  /** Obtain an import statement for a resolved component */
  stringifyImport(info: ComponentInfo): string;
}

type ComponentResolveResult = string | ComponentInfo | null | undefined | void;

type ComponentResolverFunction = (name: string) => ComponentResolveResult;

interface ComponentResolverObject {
  type: "component" | "directive";
  resolve: ComponentResolverFunction;
}

type ComponentResolver = ComponentResolverFunction | ComponentResolverObject;