vue全局公共组件自动引入并注册,开发效率直接起飞!

简介: 【10月更文挑战第14天】vue全局公共组件自动引入并注册,开发效率直接起飞!

组件自动引入并全局注册场景

在一个大型项目的开发中,我们一定会有很多全局公用的公共组件,并且随着项目的深入,组件会越来越多。

比如,我们在src\components\common文件夹用于存放公共组件,这些组件是需要全局注册使用的。

一开始,我们可能只有 Bread.vue(面包屑)组件和bannner(轮播图)组件

我们需要全局注册使用

// component/index.js
import {
   Bread,banner} from '../components/common'
export default (Vue) => {
   
     Vue.component('Bread', Bread)
     Vue.component('banner', banner)
}

然后,在main.js中使用

// 导入一个函数
import component from './components/index.js'
// 使用该函数,使里面全局挂载的组件生效
Vue.use(component)

组件很少的时候,一个个全局注册也不麻烦,但是,如果我们组件越来越多,我们每写一个组件,就要额外引入注册一次,非常麻烦!

// component/index.js
import {
   Bread,banner,Title,Card,Pic,Popver,Hover,Test} from '../components/common'
export default (Vue) => {
   
     Vue.component('Bread', Bread)
     Vue.component('banner', banner)
     Vue.component('Title',Title)
     Vue.component('Card', Card)
     Vue.component('Pic', Pic)
     Vue.component('Popver', Popver)
     Vue.component('Hover', Hover)
     // .... 
}

这样写太愚蠢了!有什么办法自动引入并注册吗?当然有!

vue-cli脚手架下的组件自动引入注册

vue-cli底层是基于webapck的,因此,我们实际上是借助webapck实现组件的全局注册引入的!

代码实现

假设我们的components/common下有非常多的组价,借助webapck实现这个功能,我们只需要这么写

// component/index.js

// 使用webpack语法自动导入全部自定义的公共组件
const comments = require.context('../components/common', true, /.(vue)$/)

export default (Vue: any) => {
   
  //自动化全局注册自定义的公共组件
  comments.keys().forEach((fileName: any) => {
   
    Vue.component(fileName.match(/^./(.*).vue$/)[1], comments(fileName).default)
  })
}

是不是非常简单!那么这个require.context是干什么的?

require.context

require.context是webpack自动化导入多个模块的一个工具。

基础用法

require.context(directory, useSubdirectories, regExp)

属性名 含义
directory 要查找的文件路径
useSubdirectories 是否查找子目录
regExp 要匹配文件的正则
const comments = require.context('../components/common', true, /.(vue)$/)

这句代码的意思就是从../components/common文件夹进行子集目录遍历,查找所有的.vue结尾的文件。

comments返回的是一个函数,comments.keys() 返回的是一个包含文件名的数组 本示例中返回的数组是

consol.log(comments.keys()) //   [Bread.vue,banner.vue,...]
 comments.keys().forEach((fileName: any) => {
   
    console.log(comments)
    Vue.component(fileName.match(/^./(.*).vue$/)[1], comments(fileName).default)
  })

这句代码也很好理解,遍历comments.keys()这个数组,使用 Vue.component()方法全局注册所有的组件。

每个 Vue.component()方法内,用数组中每一个文件的名字作为组件名(去掉.vue后缀),然后传入组件的配置对象。

comments(fileName).default返回的是每一个组件的配置对象

其他写法

import Vue from 'vue';

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

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

  // 获取组件的 PascalCase 命名
  const componentName = fileName
    .split('/')
    .pop()
    .replace(/.\w+$/, '');

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

vite中组件的自动引入与注册

在使用 Vite 构建 Vue 项目时,我们可以通过 import.meta.glob 方法来批量引入和注册组件。import.meta.glob 是 Vite 提供的一个功能,类似于 Webpack 的 require.context

代码实现

创建自动引入和全局注册脚本

在 src 目录下创建一个文件,例如 globalComponents.js,用于自动引入和全局注册组件:

src/globalComponents.js:

import {
    defineAsyncComponent } from 'vue';

export default function registerGlobalComponents(app) {
   
  const components = import.meta.glob('./components/*.vue');

  for (const path in components) {
   
    const componentName = path.split('/').pop().replace(/.\w+$/, '');
    app.component(componentName, defineAsyncComponent(components[path]));
  }
}

在 main.js 中引入并使用

在 src/main.js 中引入并使用这个自动注册脚本:

src/main.js:

import {
    createApp } from 'vue';
import App from './App.vue';
import registerGlobalComponents from './globalComponents';

const app = createApp(App);

registerGlobalComponents(app);

app.mount('#app');

import.meta.glob

import.meta.glob 参数

  • pattern:字符串或字符串数组,表示匹配文件的路径模式。可以使用通配符 *。
  • options:一个对象,可以包含以下属性:

    • eager:布尔值,如果为 true,将立即加载模块,而不是返回一个导入函数。
    • import:函数,用于自定义导入。
    • expose:数组,指定哪些命名导出应该被暴露。
    • ignore:字符串或字符串数组,表示要忽略的文件模式。
const components = import.meta.glob('./components/*.vue', {
    eager: true });

console.log(components);
/* 输出类似于:
{
  './components/Bread.vue': Module,
  './components/Banner.vue': Module
}
*/

总结

在大型的前端项目中,手动引入和全局注册公共组件既繁琐又易出错。

我们可以通过Webpack的require.context或Vite的import.meta.glob,他们都可以自动引入并全局注册组件。这两种方法都大大简化了组件管理,提高了开发效率。

相关文章
|
6天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
5天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
5天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
20天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
6天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
6天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
6天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
7天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
7天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
12天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发