配置 unplugin-auto-import 插件,实现 // import {ref, reactive, …} from “vue” 自动引入

1,583 阅读2分钟

1.安装 unplugin-auto-import 插件

npm i unplugin-auto-import -D

2在 vite.config.js 中配置

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import AutoImport from 'unplugin-auto-import/vite';

export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等
      imports: ['vue', 'vue-router'],
    }),
  ],
});

配置完成,这样在每个 vue 页面都不需要手动配置 import {ref, reactive, …} from “vue” 了。但是还会遇到 ts, eslint 不识别而导入报错的问题。

3. typescript 报错:‘reactive’ is not defined.

原因:TS 未识别到 vue api,没有相应的模块声明文件 处理:在 vite 中配置并生成 auto-imports.d.ts ,并在 tsconfig.json 中引入

vite.config.js

// vite.config.js
export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等
      imports: ['vue'],
      // 生成自动导入的TS声明文件
       dts: "/auto-import.d.ts", 
    }),
  ],
});

tsconfig.json

// tsconfig.json
{
     "include": [
        "src/**/*.d.ts",
        "./*.d.ts",
        "./auto-imports.d.ts" // 导入上一步生成的配置文件
      ],
}

4. eslint 无法识别报错 error ‘reactive’ is not defined no-undef

原因:未配置自动导入相应的 eslint 规则 处理:通过 autoimport 中的配置生成对应 .eslintrc-auto-import.json 配置文件,并在 .eslintrc 中引入

{
    // ......
     AutoImport({
      imports: ['vue', 'vue-router', 'pinia'],
      dts: "/auto-import.d.ts",
      eslintrc: {
        enabled: true,  // 1、改为true用于生成eslint配置。2、生成后改回false,避免重复生成消耗
        filepath: './.eslintrc-auto-import.json',
        globalsPropValue: true
      },
    }),
}

.eslintrc.js

// .eslintrc.js
extends: [
   "./.eslintrc-auto-import.json",
 ],

5.我的配置

//.eslintrc-auto-import.json",
{
  "globals": {
    "Component": true,
    "ComponentPublicInstance": true,
    "ComputedRef": true,
    "EffectScope": true,
    "InjectionKey": true,
    "PropType": true,
    "Ref": true,
    "VNode": true,
    "acceptHMRUpdate": true,
    "computed": true,
    "createApp": true,
    "createPinia": true,
    "customRef": true,
    "defineAsyncComponent": true,
    "defineComponent": true,
    "defineStore": true,
    "effectScope": true,
    "getActivePinia": true,
    "getCurrentInstance": true,
    "getCurrentScope": true,
    "h": true,
    "inject": true,
    "isProxy": true,
    "isReactive": true,
    "isReadonly": true,
    "isRef": true,
    "mapActions": true,
    "mapGetters": true,
    "mapState": true,
    "mapStores": true,
    "mapWritableState": true,
    "markRaw": true,
    "nextTick": true,
    "onActivated": true,
    "onBeforeMount": true,
    "onBeforeRouteLeave": true,
    "onBeforeRouteUpdate": true,
    "onBeforeUnmount": true,
    "onBeforeUpdate": true,
    "onDeactivated": true,
    "onErrorCaptured": true,
    "onMounted": true,
    "onRenderTracked": true,
    "onRenderTriggered": true,
    "onScopeDispose": true,
    "onServerPrefetch": true,
    "onUnmounted": true,
    "onUpdated": true,
    "provide": true,
    "reactive": true,
    "readonly": true,
    "ref": true,
    "resolveComponent": true,
    "setActivePinia": true,
    "setMapStoreSuffix": true,
    "shallowReactive": true,
    "shallowReadonly": true,
    "shallowRef": true,
    "storeToRefs": true,
    "stores": true,
    "toRaw": true,
    "toRef": true,
    "toRefs": true,
    "toValue": true,
    "triggerRef": true,
    "unref": true,
    "useAdminerStore": true,
    "useAttrs": true,
    "useAuthStore": true,
    "useCssModule": true,
    "useCssVars": true,
    "useDictStore": true,
    "useLink": true,
    "useMenuStore": true,
    "useNoticeStore": true,
    "useRootStore": true,
    "useRoute": true,
    "useRouter": true,
    "useSlots": true,
    "useTabsStore": true,
    "useThemeStore": true,
    "useWebsocketStore": true,
    "watch": true,
    "watchEffect": true,
    "watchPostEffect": true,
    "watchSyncEffect": true
  }
}