vite5+vue3+?import.meta.glob動(dòng)態(tài)導(dǎo)入vue組件圖文教程
前言
import.meta.glob 是 Vite 提供的一個(gè)特殊功能,它允許你在模塊范圍內(nèi)動(dòng)態(tài)地導(dǎo)入多個(gè)模塊。這在處理大量的文件,如組件、頁(yè)面或其他模塊時(shí)特別有用,特別是當(dāng)你需要根據(jù)某些條件或模式來(lái)動(dòng)態(tài)加載它們時(shí)。
創(chuàng)建需要?jiǎng)討B(tài)導(dǎo)入的組件目錄
假設(shè)你有一個(gè)src/pages/DynamicComponents目錄,里面包含多個(gè) Vue 組件,你想根據(jù)某些條件動(dòng)態(tài)地導(dǎo)入這些組件。
首先,確保你的目錄結(jié)構(gòu)是這樣的:

src/pages/index.vue文件
<template>
<div class="DynamicComponentsOutbox">
<h1>DynamicComponents</h1>
</div>
<div>
<component v-for="(component, name) in dynamicComponents" :key="name" :is="component" />
</div>
</template>
<script setup>
import { onMounted, reactive,markRaw } from 'vue'
const dynamicComponents = reactive({})
onMounted(async () => {
const modules = import.meta.glob('./DynamicComponents/*.vue');
for (const path in modules) {
const module = await modules[path]();
const componentName = path.replace(/^\.\/components\/(.*)\.vue$/, '$1');
console.log(`componentName`,componentName );
dynamicComponents[componentName] = markRaw(module.default)
}
console.log(`dynamicComponents`,dynamicComponents);
})
</script>
<style lang="scss" scoped></style>
src/pages/DynamicComponents/ComponentA.vue文件
<template>
<div class="">
<h1>ComponentA</h1>
</div>
</template>
<script setup>
</script>
<style lang="scss" scoped></style>src/pages/DynamicComponents/ComponentB.vue文件
<template>
<div class="">
<h1>ComponentB</h1>
</div>
</template>
<script setup>
</script>
<style lang="scss" scoped>
</style>App.vue文件
<template>
<main>
<HelloWorld msg="You did it!" />
<component :is='DynamicComponents'></component>
</main>
</template>
<script setup>
import HelloWorld from '@/components/HelloWorld.vue'
import DynamicComponents from '@/pages/index.vue'
</script>
<style scoped></style>

index.vue:6
[Vue warn]: Vue received a Component that was made a reactive object. This can lead to unnecessary performance overhead and should be avoided by marking the component with `markRaw` or using `shallowRef` instead of `ref`.
Component that was made reactive:
{__hmrId: 'ed2b2297', __file: 'C:/Users/63002/Desktop/codefile/vue3-vite2/src/pages/DynamicComponents/ComponentA.vue', render: ?}
at <Index>
at <App>
剛開(kāi)始這樣寫(xiě)
dynamicComponents[componentName] =module.default
這里報(bào)了一個(gè)警告:提示你去給組件使用markRaw or shallowRef包起來(lái)就好了,我直接使用了markRaw來(lái)包起組件 ,就解決這個(gè)警告了。
改為:
import { onMounted, reactive,markRaw } from 'vue'dynamicComponents[componentName] = markRaw(module.default)
<template>
<div class="DynamicComponentsOutbox">
<h1>DynamicComponents</h1>
</div>
<div>
<component v-for="(component, name) in dynamicComponents" :key="name" :is="component" />
</div>
</template>
<script setup>
import { onMounted, reactive,markRaw } from 'vue'
const dynamicComponents = reactive({})
onMounted(async () => {
const modules = import.meta.glob('./DynamicComponents/*.vue');
for (const path in modules) {
const module = await modules[path]();
const componentName = path.replace(/^\.\/components\/(.*)\.vue$/, '$1');
console.log(`componentName`,componentName );
dynamicComponents[componentName] = markRaw(module.default)
}
console.log(`dynamicComponents`,dynamicComponents);
})
</script>
<style lang="scss" scoped></style>
在上面的代碼中,我們首先在onMounted鉤子中使用 import.meta.glob 獲取 components 目錄下所有 .vue 文件的動(dòng)態(tài)導(dǎo)入。然后,我們遍歷這些模塊,加載它們,并將它們存儲(chǔ)在 dynamicComponents 對(duì)象中,其中鍵是組件的名稱(chēng)(從文件路徑中提?。?,值是組件的默認(rèn)導(dǎo)出。
最后,在模板中,我們使用 v-for 指令遍歷 dynamicComponents 對(duì)象,并使用 Vue 的動(dòng)態(tài)組件功能 (<component :is="...">) 來(lái)渲染每個(gè)組件。
注意:由于
import.meta.glob是在構(gòu)建時(shí)解析的,因此它不會(huì)為動(dòng)態(tài)路徑或運(yùn)行時(shí)確定的路徑工作。它主要用于靜態(tài)路徑模式。
總結(jié)
到此這篇關(guān)于vite5+vue3+ import.meta.glob動(dòng)態(tài)導(dǎo)入vue組件的文章就介紹到這了,更多相關(guān)import.meta.glob動(dòng)態(tài)導(dǎo)入vue組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue移動(dòng)端如何解決click事件延遲,封裝tap等事件
這篇文章主要介紹了vue移動(dòng)端如何解決click事件延遲,封裝tap等事件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
在vue框架下使用指令vue add element安裝element報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了在vue框架下使用指令vue add element安裝element報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
el-select自定義指令實(shí)現(xiàn)觸底加載分頁(yè)請(qǐng)求options數(shù)據(jù)(完整代碼和接口可直接用)
某些情況下,下拉框需要做觸底加載,發(fā)請(qǐng)求,獲取option的數(shù)據(jù),下面給大家分享el-select自定義指令實(shí)現(xiàn)觸底加載分頁(yè)請(qǐng)求options數(shù)據(jù)(附上完整代碼和接口可直接用),感興趣的朋友參考下吧2024-02-02
使用Vue3開(kāi)發(fā)鴻蒙的HelloWorld(附詳細(xì)實(shí)現(xiàn)代碼)
這篇文章主要介紹了使用Vue3開(kāi)發(fā)鴻蒙HelloWorld的相關(guān)資料,文中通過(guò)示例代碼詳細(xì)講解了如何通過(guò)Vue3與鴻蒙ArkUI框架結(jié)合,實(shí)現(xiàn)跨端開(kāi)發(fā),需要的朋友可以參考下2025-07-07
vue3實(shí)現(xiàn)動(dòng)態(tài)添加路由
這篇文章主要介紹了vue3實(shí)現(xiàn)動(dòng)態(tài)添加路由方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
解決vue-cli腳手架打包后vendor文件過(guò)大的問(wèn)題
今天小編就為大家分享一篇解決vue-cli腳手架打包后vendor文件過(guò)大的問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
使用WebStorm用Debug模式調(diào)試Vue等前端項(xiàng)目的步驟
WebStorm提供了更簡(jiǎn)單的前端調(diào)試方法,記錄一下WebStorm調(diào)試步驟啟動(dòng)前端項(xiàng)目,這篇文章主要介紹了使用WebStorm用Debug模式調(diào)試Vue等前端項(xiàng)目的步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11
vue項(xiàng)目中使用particles實(shí)現(xiàn)粒子背景效果及遇到的坑(按鈕沒(méi)有點(diǎn)擊響應(yīng))
為了提高頁(yè)面展示效果,登錄界面內(nèi)容比較單一的,粒子效果作為背景經(jīng)常使用到,vue工程中利用vue-particles可以很簡(jiǎn)單的實(shí)現(xiàn)頁(yè)面的粒子背景效果,本文給大家分享在實(shí)現(xiàn)過(guò)程中遇到問(wèn)題,需要的朋友一起看看吧2020-02-02

