幾個插件,讓你的Vue代碼 “學會” 自動按需引入


前言

在之前的項目中,為了避免項目打包體積過大,不是全局都使用的組件都需要按需引入,使用的圖標也需要手動按需引入,不斷的手寫 import 引入,實話實說,這非常的麻煩!

這不,最近學習到了幾個全新的插件,整理成文分享出來。

  • 你是否厭煩了每次使用 vue 時,需要額外的 import vue 的 api
  • 你是否厭煩了每次使用 組件庫 時,需要額外的 按需引入 組件
  • 你是否厭煩了有時使用 第三方組件庫 時,需要額外的 引入 css 樣式
  • 你是否厭煩了每次使用 圖標 時,需要額外的 import

現在有幾個插件可以幫我們一次性解決這些問題,我們在調用時可以不需要import而直接使用,且最終打包時,只有實際使用過的api和組件才會被build進最終產物

unplugin-auto-import:自動按需引入 vue\vue-router\pinia 等的 api

unplugin-vue-components:自動按需引入 第三方的組件庫組件我們自定義的組件

unplugin-icons:可以自動按需引入 所使用的圖標,而不用手動 import

vite-plugin-style-import:自動按需引入 我們手動引入的組件的css樣式

我這里的配置的示例代碼,以 Element PlusAnt Design Vue 以及 Vite 為例,Webpack 的配置可以查看官方倉庫里的配置

實際效果

image.png

可以看到,input 組件和 vueref api,我都沒有 import ,但是仍然使用如常

自動按需引入api、組件、樣式

我們先安裝依賴:

npm install -D unplugin-vue-components unplugin-auto-import
然后我們配置 vite.config.ts 加入以下內容;
// vite.config.ts
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers';

export default {
  plugins: [
    // ...
    AutoImport({
      // 這里除了引入 vue 以外還可以引入pinia、vue-router、vueuse等,
      // 甚至你還可以使用自定義的配置規則,見 https://github.com/antfu/unplugin-auto-import#configuration
      imports: ['vue'],
      // 第三方組件庫的解析器
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      // dirs 指定組件所在位置,默認為 src/components
      // 可以讓我們使用自己定義組件的時候免去 import 的麻煩
      dirs: ['src/components/'],
      // 配置需要將哪些后綴類型的文件進行自動按需引入
      extensions: ['vue', 'md'],
      // 解析的 UI 組件庫,這里以 Element Plus 和 Ant Design Vue 為例
      resolvers: [ElementPlusResolver(), AntDesignVueResolver()],
    }),
  ],
}

非模板組件的 自動按需引入 樣式

Element Plus 發布正式版后,在目前的 vite2 + vue3 + 按需引入 Element Plus 使用中,還沒有發現按需引入失效的問題

什么叫非模板組件呢?其實就是 message 等純粹通過 js 進行調用的組件,unplugin-vue-components 這個插件目前並不能掃描不在模板 (template) 內使用的部分組件,比如 Ant-Design-Vue 的 Message 組件

我們目前按需使用Ant-Design-Vue 的 Message 組件就得手動 import 后使用

<script setup lang="ts">
import { message } from 'ant-design-vue';
message.info('This is a normal message');
</script>

我們看一下實際的效果

image.png

顯示效果如上圖所示,可以看到是沒有 css 樣式 的,我們得手動去引入 它的css樣式,但是這種行為是很麻煩的,為了解決這種需求,一個插件也就隨之而生:

vite-plugin-style-import:自動引入 第三方組件庫我們所使用到的 style 樣式

安裝配置

這里以 Ant-Design-Vue 為例:

我們先安裝依賴:

npm install -D vite-plugin-style-import

配置

// vite.config.ts
import styleImport, { AndDesignVueResolve } from 'vite-plugin-style-import';

export default {
  plugins: [
    // ...
    styleImport({
      resolves: [AndDesignVueResolve()],
    }),
  ],
}

這樣子配置完之后,我們手動 import 了組件庫的某個組件,它的樣式也就會自動被我們加載進來,是不是很方便呢?

自動按需引入圖標

我們經常都要為找各種各樣的圖標而發愁,而現在有一個極好的插件和一個極好的庫,可以直接解決我們找圖標、用圖標的后顧之憂

icones:是一個非常優秀的圖標庫,里面集成了很多的圖標

unplugin-icons:可以自動按需引入我們所要使用的圖標,而不用手動 import

安裝配置
npm i -D unplugin-icons @iconify/json

安裝好后,我們配置 vite.config.ts 加入以下內容

// vite.config.ts
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'
import Components from 'unplugin-vue-components/vite'

export default {
  plugins: [
    Components({
      resolvers: [IconsResolver()], // 這里是個數組
    }),
    Icons({
      compiler: 'vue3',
      autoInstall: true,
    }),
  ],
}
使用示例

我們先打開網址:icones.netlify.app/ 隨便選擇一個圖標

image.png

然后點擊復制

image.png

回到我們的代碼中,只需要短短的一句就可以使用了:

<template>
  <i-mdi-account-reactivate style="font-size: 2em; color: red" />
</template>

 報錯解決:

  自動生成的會報ts錯誤

 這樣的報錯需要在tsconfig.json

// tsconfig.json
compilerOptions : {
// ... "types": ["unplugin-icons/types/vue"], }

啟動優化

值得一提的是:如果你的 vite版本 > 2.9.0,那么就不需要安裝啟動優化插件

使用這幾個按需引入插件后,我們使用 Vite 開發項目時,第一次經常會看到以下的場景:

image.png

這個時間往往會耗時很久!而針對於這個情況,也有相對應的插件來解決這個問題

vite-plugin-optimize-persist

安裝配置
npm i -D vite-plugin-optimize-persist vite-plugin-package-config

編輯配置 vite.config.ts:

// vite.config.ts
import OptimizationPersist from 'vite-plugin-optimize-persist'
import PkgConfig from 'vite-plugin-package-config'

export default {
  plugins: [
    PkgConfig(),
    OptimizationPersist()
  ]
}

這樣配置完成后,我們第一次使用按需引入后,它就會在 package.json 中生成內容(生成的內容根據你項目所使用的組件而定),下次進來就可以快速的跑起項目啦

image.png

TypeScript 報紅

很多人第一次配置完之后,會發現 編輯器 給我們在按需引入的組件上報了紅:

image.png

這是因為我們生成的 auto-imports.d.tscomponents.d.ts 兩個文件,默認是生成在項目根目錄,正常我們配置的 TypeScript 解析的文件都放在 src 文件夾下,自然 TS 會報這個錯啦;

解決辦法很簡單:

  • 在 tsconfig.json 中 include 這兩個文件
  • 像下面這樣配置,把兩個 .d.ts 的生成目錄放到 src 文件夾下
// vite.config.ts
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'

export default {
  plugins: [
    // ...
    AutoImport({
      dts: './src/auto-imports.d.ts',
    }),
    Components({
      dts: './src/components.d.ts'
    }),
  ],
}

Eslint 報紅

如果我們的項目中使用了 Eslint,且使用了 unplugin-auto-import,那么你就會發現下面這一幕

image.png

是的,因為 Eslint 找不到我們按需引入的這些 api,我們不需要import是爽了,人家Eslint不知道呀,就咯的一下給我們報紅,那怎么辦呢?好辦,既然 Eslint 不知道我們按需引入了 api,那我們讓它知道不就好了?看代碼:

// vite.config.ts
import AutoImport from 'unplugin-auto-import/vite'

export default {
  plugins: [
    // ...
    AutoImport({
      // Generate corresponding .eslintrc-auto-import.json file.
      // eslint globals Docs - https://eslint.org/docs/user-guide/configuring/language-options#specifying-globals
      eslintrc: {
        enabled: true, // Default `false`
        filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json`
        globalsPropValue: true, // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable')
      },
    }),
  ],
}

這段代碼,會讓我們在根目錄下生成一個 .eslintrc-auto-import.json 文件,里面都是我們所引入的所有 API 名稱,接下來我們只需要在 .eslintrc.js 中加載這個文件即可

// .eslintrc.js

module.exports = { 
  /* ... */
  extends: [
    // ...
    './.eslintrc-auto-import.json',
  ],
}

完整的使用示例

完整的使用實例可以看另一篇文章里的模板:https://juejin.cn/post/7058201396113309703


作者:菜貓子neko
鏈接:https://juejin.cn/post/7062648728405934087
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM