zhou zhou
4 小时以前 fec285d150b377d004e47f0973d298b92fe4c711
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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 }