import { h } from 'vue'
|
class ComponentLoader {
|
constructor() {
|
this.modules = import.meta.glob('../../views/**/*.vue')
|
}
|
/**
|
* 加载组件
|
*/
|
load(componentPath) {
|
if (!componentPath) {
|
return this.createEmptyComponent()
|
}
|
const fullPath = `../../views${componentPath}.vue`
|
const fullPathWithIndex = `../../views${componentPath}/index.vue`
|
const module = this.modules[fullPath] || this.modules[fullPathWithIndex]
|
if (!module) {
|
console.error(
|
`[ComponentLoader] 未找到组件: ${componentPath},尝试过的路径: ${fullPath} 和 ${fullPathWithIndex}`
|
)
|
return this.createErrorComponent(componentPath)
|
}
|
return module
|
}
|
/**
|
* 加载布局组件
|
*/
|
loadLayout() {
|
return () => import('@/views/index/index.vue')
|
}
|
/**
|
* 加载 iframe 组件
|
*/
|
loadIframe() {
|
return () => import('@/views/outside/Iframe.vue')
|
}
|
/**
|
* 创建空组件
|
*/
|
createEmptyComponent() {
|
return () =>
|
Promise.resolve({
|
render() {
|
return h('div', {})
|
}
|
})
|
}
|
/**
|
* 创建错误提示组件
|
*/
|
createErrorComponent(componentPath) {
|
return () =>
|
Promise.resolve({
|
render() {
|
return h('div', { class: 'route-error' }, `组件未找到: ${componentPath}`)
|
}
|
})
|
}
|
}
|
export { ComponentLoader }
|