首先咱们在vue的使用中,免不了会本身自定义组件,那么咱们每次定义好组件都会先import 进来,而后在components里面引入才能用
复现如下场景css
import BaseButton from './baseButton' import BaseIcon from './baseIcon' import BaseInput from './baseInput' export default { components: { BaseButton, BaseIcon, BaseInput } } <BaseInput v-model="searchText" @keydown.enter="search" /> <BaseButton @click="search"> <BaseIcon name="search"/> </BaseButton>
咱们平时是否是都是这么写?我的以为太麻烦了,秉持着能偷懒就偷懒的原则,咱就配置一次,不再用import引入就直接能用多好啊,好消息,好消息!是能够实现的:vue
咱们须要借助一下神器webpack,使用 require.context() 方法来建立本身的(模块)上下文,从而实现自动动态require组件。这个方法须要3个参数:要搜索的文件夹目录,是否还应该搜索它的子目录,以及一个匹配文件的正则表达式。
咱们在components文件夹添加一个叫global.js的文件,在这个文件里借助webpack动态将须要的基础组件通通打包进来。
固然了要根据不一样的目录结构进行不一样的处理
若是你是这样的目录结构webpack
那么 global.js 就能够这么写web
import Vue from 'vue' function capitalizeFirstLetter(string) { return string.charAt(0).toUpperCase() + string.slice(1) } const requireComponent = require.context( '.', false, /\.vue$/ //找到components文件夹下以.vue命名的文件 ) requireComponent.keys().forEach(fileName => { const componentConfig = requireComponent(fileName) const componentName = capitalizeFirstLetter( fileName.replace(/^\.\//, '').replace(/\.\w+$/, '') //由于获得的filename格式是: './dataList.vue', 因此这里咱们去掉头和尾,只保留真正的文件名 ) Vue.component(componentName, componentConfig.default || componentConfig) })
若是你是以上的目录结构,以上代码就能够知足你了正则表达式
可是我不是这样的目录结构,我喜欢一个组件放在一个文件夹里,并且js和scss都分开来写,就像这样:api
这样的话,就须要改动一下以上的代码,废话不都说,上代码ui
import Vue from 'vue'; function capitalizeFirstLetter(string){ return string.charAt(0).toUpperCase() + string.slice(1); } const requireComponent = require.context( '.',true,/\.vue$/ //找到components文件夹下以.vue命名的文件 ) requireComponent.keys().forEach(fileName => { const componetConfig = requireComponent(fileName); let a = fileName.lastIndexOf('/'); fileName = '.' + fileName.slice(a); const componetName = capitalizeFirstLetter( fileName.replace(/^\.\//,'').replace(/\.\w+$/,'') ) Vue.component(componetName,componetConfig.default || componetConfig) })
总之,global.js建好之后,最后咱们在main.js中import ‘./components/global.js’,而后咱们就能够随时随地使用这些基础组件,无需手动引入了。spa
而后咱们看下效果
首先我说好了,js并无任何import,也没有components选项,直接在vue文件中使用组件code
最后效果在这里component