iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Modern Web

蓋一個自己的 Nuxt 3 UI Module系列 第 19

addComponentsDir

  • 分享至 

  • xImage
  •  

之前介紹透過 addComponent 的方法來加入元件

但…元件一多,要一個一個引入實在是好麻煩呀

雖然可以像 nuxt-headlessui 一樣將資訊整理成一個 array 再用 for 迴圈引入

但在沒有特殊設定的需求下還是覺得有點麻煩~

// nuxt-headlessui 
 for (const group of headlessComponents) {
      for (const e of group.exports) {
        addComponent(
          {
            name: `${options.prefix}${e}`,
            export: e,
            filePath: join(root, group.relativePath),
            chunkName: group.chunkName,
            mode: 'all'
          }
        )
      }
    }

https://github.com/P4sca1/nuxt-headlessui/blob/main/src/module.ts

這時可以使用 addComponentsDir() 來引入資料夾

一樣要記得先引入

import { addComponentsDir } from '@nuxt/kit'

接著透過 createResolver() 來引入”資料夾”

ps. createResolver() 除了可以抓取檔案之外還可以讀取資料夾喔

const resolver = createResolver(import.meta.url)

addComponentsDir({
      path: resolver.resolve('./runtime/components', 'global'),
      global: true
    })

這樣就會引入資料夾下的元件囉

因為是設定成 global 的型態,所以跟之前一樣使用即可

但~假如有個 test.vue 元件,其路徑是 component/header/test.vue

我們呼叫這個元件的方法是 <HeaderTest>

如果用剛剛的方式寫

addComponentsDir({
      path: resolver.resolve('./runtime/components', 'header'),
      global: true
    })

就會用<Test> 呼叫他

如果其他資料夾下也有 test.vue 呢? 到底在叫誰?!

(就跟在街上大喊志明!!!! 會有一堆志明回頭的概念)

為了增加他的辨識性,就可以替他加上前綴( 志明 ⇒ 新竹志明)

    addComponentsDir({
      path: resolver.resolve('./runtime/components', 'header'),
      prefix: 'header',
      global: true,
    })

如此就可以用 <HeaderTest> 呼叫到他囉,用這個方式可以添加自己想要的前綴進去

如果只是單純想要根據資料夾結構來識別元件
可以使用 pathPrefix

   addComponentsDir({
      path: resolver.resolve('./runtime', 'components'),
      pathPrefix: true,
      global: true
    })

這樣就會抓取 components 資料夾下的結構名稱來組成元件名稱囉!

PS. 想知道component 添加的狀況

可以到 playground\.nuxt\components.d.ts 裡面去看~


addComponentsDir :https://nuxt.com/docs/api/kit/components#addcomponentsdir


上一篇
addPlugin
下一篇
放入 public 資料夾
系列文
蓋一個自己的 Nuxt 3 UI Module30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言