Skip to content

autoImport

A Vite plugin that automatically injects import statements, supporting preset mappings and directory scanning, with optional TypeScript declaration file generation and Vue template auto-import support.

Import

typescript
// Sub-module import (recommended)
import { autoImport } from '@meng-xi/vite-plugin/plugins/auto-import'
import type { AutoImportOptions, ImportMapping, ResolvedImport, ScannedModule, TransformResult } from '@meng-xi/vite-plugin/plugins/auto-import'

// Barrel import
import { autoImport } from '@meng-xi/vite-plugin'

Quick Start

typescript
import { defineConfig } from 'vite'
import { autoImport } from '@meng-xi/vite-plugin'

export default defineConfig({
	plugins: [
		autoImport({
			imports: {
				vue: ['ref', 'reactive', 'computed', 'watch', 'onMounted'],
				'vue-router': ['useRouter', 'useRoute']
			},
			dirs: ['src/composables'],
			dts: 'src/auto-imports.d.ts',
			vueTemplate: true
		})
	]
})

Options

OptionTypeDefaultDescription
importsRecord<string, string[]> | ImportMapping[] | Array<Record<string, string[]> | ImportMapping>{}Import mapping configuration
dirsstring[][]Directories to scan
dtsstring | boolean'auto-imports.d.ts'TypeScript declaration file output path
vueTemplatebooleanfalseEnable auto-import for Vue templates
ignorestring[][]Identifiers to ignore
fileFilterRegExp/\.(vue|jsx|tsx|ts|js|mjs)$/File filter regex
injectAtPosition'top' | 'after-last-import''top'Import statement injection position
enabledbooleantrueEnable the plugin
verbosebooleantrueShow detailed logs
errorStrategy'throw' | 'log' | 'ignore''throw'Error handling strategy

imports Formats

Supports three formats:

1. Shorthand — Key is module path, value is array of import names

typescript
imports: {
  vue: ['ref', 'reactive', 'computed'],
  'vue-router': ['useRouter', 'useRoute']
}

2. Full format — Supports default import configuration

typescript
imports: [
	{ module: 'lodash', names: ['debounce', 'throttle'], defaultImport: false },
	{ module: 'axios', names: ['axios'], defaultImport: true }
]

3. Mixed format — Both formats can be mixed in an array

typescript
imports: [{ vue: ['ref', 'reactive'] }, { module: 'lodash', names: ['debounce'], defaultImport: true }]

ImportMapping

PropertyTypeDefaultDescription
modulestringrequiredModule path
namesstring[]requiredImport names list
defaultImportbooleanfalseWhether to use default import (import name from 'mod')

injectAtPosition

ValueDescription
topInject at the top of effective code (skips shebang, etc.)
after-last-importInject after the last existing import statement

Type Exports

ResolvedImport

Resolved import mapping structure.

PropertyTypeDescription
modulestringModule path
namestringImport identifier
isDefaultbooleanWhether it's a default import

ScannedModule

Module info from directory scanning.

PropertyTypeDescription
filePathstringAbsolute file path
exportsstring[]Named export names list
defaultExportstring | nullDefault export name

Examples

Basic Usage

typescript
autoImport({
	imports: {
		vue: ['ref', 'reactive', 'computed', 'watch', 'onMounted']
	}
})

Directory Scanning

Automatically scan exports from src/composables directory:

typescript
autoImport({
	dirs: ['src/composables', 'src/stores']
})

Scanning rules:

  • Recursively scans subdirectories
  • Skips node_modules and hidden directories (starting with .)
  • Skips .d.ts type declaration files

Vue Template Auto-Import

When enabled, APIs used in Vue SFC <template> will also be auto-imported:

typescript
autoImport({
	imports: { vue: ['ref', 'computed'] },
	vueTemplate: true
})

Detection scope:

  • Interpolation expressions
  • Directive bindings v-if, v-show, v-model, etc.
  • Attribute bindings :prop="expr"
  • Event bindings @event="handler"

TypeScript Declarations

typescript
autoImport({
	dts: 'src/auto-imports.d.ts' // Generate declaration file
	// dts: false // Don't generate declaration file
})

Default Import

typescript
autoImport({
	imports: [{ module: 'axios', names: ['axios'], defaultImport: true }]
})
// Generates: import axios from 'axios'

Ignore Identifiers

typescript
autoImport({
	ignore: ['React'], // React is globally injected via CDN, no auto-import needed
	imports: { react: ['useState', 'useEffect'] }
})

Injection Position

typescript
autoImport({
	injectAtPosition: 'after-last-import' // Inject after the last import statement
})

Notes

  • Automatically skips already explicitly imported identifiers to avoid duplicates
  • Automatically skips shebang (#!/usr/bin/env node) and "use strict" declarations
  • The transform hook uses order: 'pre' to ensure execution before other plugins
  • Declaration files are only written when content changes, reducing unnecessary IO
  • User-configured imports take priority over dirs scan results

Released under the MIT License.