在项目中,可能你的许多组件只是包裹了一个输入框或按钮之类的元素,是相对通用的。我们有时候会把它们称为基础组件,它们会在各个组件中被频繁的用到。所以会导致很多组件里都会有一个包含基础组件的长列表:但是只用于模板的一小部分。

import  Button from \'./ Button.vue\'
import  Icon from \'./ Icon.vue\'
import  Input from \'./ Input.vue\'

export default {
  components: {
     Button,
     Icon,
     Input
  }
}

如果你使用了 webpack (或在内部使用了 webpack 的 Vue CLI 3+),那么就可以使用 require.context 只全局注册这些非常通用的基础组件。这里有一份可以让你在应用入口文件 (比如 src/main.js) 中全局导入基础组件的示例代码:

import Vue from \'vue\'
import upperFirst from \'lodash/upperFirst\'
import camelCase from \'lodash/camelCase\'

const requireComponent = require.context(
  // 其组件目录的相对路径
  \'./components\',
  // 是否查询其子目录
  false,
  // 匹配基础组件文件名的正则表达式
  / [A-Z]\\w+\\.(vue|js)$/
)

requireComponent.keys().forEach(fileName => {
  // 获取组件配置
  const componentConfig = requireComponent(fileName)

  // 获取组件的 PascalCase 命名
  const componentName = upperFirst(
    camelCase(
      // 剥去文件名开头的 `./` 和结尾的扩展名
      fileName.replace(/^\\.\\/(.*)\\.\\w+$/, \'$1\')
    )
  )

  // 全局注册组件
  Vue.component(
    componentName,
    // 如果这个组件选项是通过 `export default` 导出的,
    // 那么就会优先使用 `.default`,
    // 否则回退到使用模块的根。
    componentConfig.default || componentConfig
  )
})

记住全局注册的行为必须在根 Vue 实例 (通过 new Vue) 创建之前发生

收藏 打印