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

简介: 【8月更文挑战第17天】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,可以自动引入并全局注册组件。require.context适用于基于Webpack的项目,而import.meta.glob适用于Vite构建的项目,这两种方法都大大简化了组件管理,提高了开发效率。

相关文章
|
21天前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
160 0
|
22天前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
1月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件实现代码及详细开发流程解析
这是一篇关于 Vue 表情包输入组件的使用方法与封装指南的文章。通过安装依赖、全局注册和局部使用,可以快速集成表情包功能到 Vue 项目中。文章还详细介绍了组件的封装实现、高级配置(如自定义表情列表、主题定制、动画效果和懒加载)以及完整集成示例。开发者可根据需求扩展功能,例如 GIF 搜索或自定义表情上传,提升用户体验。资源链接提供进一步学习材料。
74 1
|
1月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
137 17
|
JavaScript 测试技术 容器
Vue2+VueRouter2+webpack 构建项目
1). 安装Node环境和npm包管理工具 检测版本 node -v npm -v 图1.png 2). 安装vue-cli(vue脚手架) npm install -g vue-cli --registry=https://registry.
1151 0
|
1月前
|
存储 JavaScript 前端开发
如何高效实现 vue 文件批量下载及相关操作技巧
在Vue项目中,实现文件批量下载是常见需求。例如文档管理系统或图片库应用中,用户可能需要一次性下载多个文件。本文介绍了三种技术方案:1) 使用`file-saver`和`jszip`插件在前端打包文件为ZIP并下载;2) 借助后端接口完成文件压缩与传输;3) 使用`StreamSaver`解决大文件下载问题。同时,通过在线教育平台的实例详细说明了前后端的具体实现步骤,帮助开发者根据项目需求选择合适方案。
91 0
|
1月前
|
JavaScript 前端开发 UED
Vue 项目中如何自定义实用的进度条组件
本文介绍了如何使用Vue.js创建一个灵活多样的自定义进度条组件。该组件可接受进度段数据数组作为输入,动态渲染进度段,支持动画效果和内容展示。当进度超出总长时,超出部分将以红色填充。文章详细描述了组件的设计目标、实现步骤(包括props定义、宽度计算、模板渲染、动画处理及超出部分的显示),并提供了使用示例。通过此组件,开发者可根据项目需求灵活展示进度情况,优化用户体验。资源地址:[https://pan.quark.cn/s/35324205c62b](https://pan.quark.cn/s/35324205c62b)。
44 0
|
1月前
|
JavaScript API 开发者
Vue框架中常见指令的应用概述。
通过以上的详细解析,你应该已经初窥Vue.js的指令的威力了。它们是Vue声明式编程模型的核心之一,无论是构建简单的静态网站还是复杂的单页面应用,你都会经常用到。记住,尽管Vue提供了大量预定义的指令,你还可以创建自定义指令以满足特定的需求。为你的Vue应用程序加上这些功能增强器,让编码变得更轻松、更愉快吧!
34 1
|
1月前
|
监控 JavaScript 前端开发
Vue 文件批量下载组件封装完整使用方法及优化方案解析
本文详细介绍了批量下载功能的技术实现与组件封装方案。主要包括两种实现方式:**前端打包方案(基于file-saver和jszip)** 和 **后端打包方案**。前者通过前端直接将文件打包为ZIP下载,适合小文件场景;后者由后端生成ZIP文件流返回,适用于大文件或大量文件下载。同时,提供了可复用的Vue组件`BatchDownload`,支持进度条、失败提示等功能。此外,还扩展了下载进度监控和断点续传等高级功能,并针对跨域、性能优化及用户体验改进提出了建议。可根据实际需求选择合适方案并快速集成到项目中。
155 17
|
1月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件的实现代码:支持自定义表情库、快捷键发送和输入框联动的聊天表情解决方案
本文详细介绍了在 Vue 项目中实现一个功能完善、交互友好的表情包输入组件的方法,并提供了具体的应用实例。组件设计包含表情分类展示、响应式布局、与输入框的交互及样式定制等功能。通过核心技术实现,如将表情插入输入框光标位置和点击外部关闭选择器,确保用户体验流畅。同时探讨了性能优化策略,如懒加载和虚拟滚动,以及扩展性方案,如自定义主题和国际化支持。最终,展示了如何在聊天界面中集成该组件,为用户提供丰富的表情输入体验。
108 8