CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-unplugin-vue-components

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

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

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;
Workspace
tessl
Visibility
Public
Created
Last updated
Describes
npmpkg:npm/unplugin-vue-components@29.0.x
Publish Source
CLI
Badge
tessl/npm-unplugin-vue-components badge