Skip to content

autoImport

自动注入 import 语句的 Vite 插件,支持预设映射和目录扫描两种方式,可选生成 TypeScript 类型声明文件,支持 Vue 模板自动导入。

导入方式

typescript
// 子模块独立导入(推荐)
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 { autoImport } from '@meng-xi/vite-plugin'

快速开始

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
		})
	]
})

配置选项

选项类型默认值说明
importsRecord<string, string[]> | ImportMapping[] | Array<Record<string, string[]> | ImportMapping>{}导入映射配置
dirsstring[][]需要扫描的目录列表
dtsstring | boolean'auto-imports.d.ts'类型声明文件输出路径
vueTemplatebooleanfalse是否为 Vue 模板启用导入
ignorestring[][]需要忽略的标识符列表
fileFilterRegExp/\.(vue|jsx|tsx|ts|js|mjs)$/文件过滤正则表达式
injectAtPosition'top' | 'after-last-import''top'import 语句注入位置
enabledbooleantrue启用插件
verbosebooleantrue显示详细日志
errorStrategy'throw' | 'log' | 'ignore''throw'错误处理策略

imports 配置格式

支持三种格式:

1. 简写格式 — 键为模块路径,值为导入名称数组

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

2. 完整格式 — 支持默认导入配置

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

3. 混合格式 — 两种格式可以在数组中混合使用

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

ImportMapping

属性类型默认值说明
modulestring必填模块路径
namesstring[]必填要导入的名称列表
defaultImportbooleanfalse是否为默认导入(import name from 'mod'

injectAtPosition

说明
top注入到文件有效代码最顶部(跳过 shebang 等)
after-last-import注入到最后一个已有 import 语句之后

类型导出

ResolvedImport

解析后的导入映射结构。

属性类型说明
modulestring模块路径
namestring导入标识符
isDefaultboolean是否为默认导入

ScannedModule

目录扫描到的模块信息。

属性类型说明
filePathstring模块文件绝对路径
exportsstring[]命名导出名称列表
defaultExportstring | null默认导出名称

示例

基本使用

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

目录扫描

自动扫描 src/composables 目录下的导出,注册为可自动导入的标识符:

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

扫描规则:

  • 递归扫描子目录
  • 跳过 node_modules 和隐藏目录(以 . 开头)
  • 跳过 .d.ts 类型声明文件

Vue 模板自动导入

开启后,Vue SFC 文件 <template> 中使用的 API 也会被自动导入:

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

检测范围:

  • 插值表达式 中的标识符
  • 指令绑定 v-ifv-showv-model 等中的表达式
  • 属性绑定 :prop="expr" 中的表达式
  • 事件绑定 @event="handler" 中的表达式

TypeScript 类型声明

typescript
autoImport({
	dts: 'src/auto-imports.d.ts' // 生成类型声明文件
	// dts: false // 不生成类型声明文件
})

默认导入

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

忽略标识符

typescript
autoImport({
	ignore: ['React'], // React 已通过 CDN 全局注入,不需要自动导入
	imports: { react: ['useState', 'useEffect'] }
})

注入位置控制

typescript
autoImport({
	injectAtPosition: 'after-last-import' // 注入到最后一个 import 语句之后
})

注意事项

  • 自动跳过已显式导入的标识符,避免重复
  • 自动跳过 shebang(#!/usr/bin/env node)和 "use strict" 声明
  • transform 钩子使用 order: 'pre' 确保在其他插件处理之前执行
  • 类型声明文件仅在内容变化时才写入,减少不必要的 IO
  • 用户配置的 imports 优先级高于 dirs 扫描结果

Released under the MIT License.