分别用webpack和vite注册全局组件

打印 上一主题 下一主题

主题 686|帖子 686|积分 2058

根本组件的自动化全局注册

1. 组件全部导入后,批量注册

  1. import dgDialog from "@/components/dgDialog/index.vue";
  2. import svgIcon from "@/components/svgIcon/index.vue";
  3. const allComponent = { dgDialog, svgIcon };
  4. export default {
  5.     install(app) {
  6.         console.log(app, "app"); //App.vue
  7.         Object.keys(allComponent).forEach((key) => {
  8.             console.log(key, "key"); //dgDialog svgIcon
  9.             app.component(key, allComponent[key]);
  10.         });
  11.     },
  12. };
  13. // 或是
  14. const ComponentRegister = {
  15.     install(Vue) {
  16.         console.log(Vue, "Vue"); //App.vue
  17.         Object.keys(allComponent).forEach((key) => {
  18.             console.log(key, "key");
  19.             Vue.component(key, allComponent[key]);
  20.         });
  21.     }
  22. }
  23. export default ComponentRegister;
复制代码
2. 使用webpack(或在内部使用了webpack的 Vue CLI 3+)全局注册组件

使用 require.context方法引入组件
  1. // 所有组件放在一个`components`文件夹内的写法
  2. const ComponentRegister = {
  3.     install(Vue) {
  4.         // 文件结构为components/组件名称.vue
  5.         const requireComponent = require.context(
  6.             // 其组件目录的相对路径
  7.             "@/components",
  8.             // 是否查询其子目录
  9.             false,
  10.             // 匹配基础组件文件名的正则表达式
  11.             /\.(vue|js)$/
  12.         );
  13.         requireComponent.keys().forEach((fileName) => {
  14.             // 获取组件配置
  15.             const componentConfig = requireComponent(fileName);
  16.             // 获取当前组件的文件名称 vue文件中声明的name属性 || 文件名称
  17.             const componentName =
  18.                 componentConfig.default.name ||
  19.                 fileName
  20.                     .split("/")
  21.                     .pop()
  22.                     .replace(/\.\w+$/, ""); //或 fileName.replace(/^\.\/(.*)\.\w+$/, "$1");
  23.             // 全局注册组件
  24.             Vue.component(
  25.                 componentName,
  26.                 // 如果这个组件选项是通过 `export default` 导出的,
  27.                 // 那么就会优先使用 `.default`,
  28.                 // 否则回退到使用模块的根。
  29.                 componentConfig.default || componentConfig
  30.             );
  31.         });
  32.     },
  33. };
  34. export default ComponentRegister;
复制代码
  1. // 组件以文件夹名称命名
  2. const ComponentRegister = {
  3.     install(Vue) {
  4.         // 文件结构为文件夹名称(即组件名称)/index.vue
  5.         const requireComponent = require.context(
  6.             // 其组件目录的相对路径
  7.             "@/components/",
  8.             // 是否查询其子目录
  9.             true,
  10.             // 匹配基础组件文件名的正则表达式
  11.             /\.(vue|js)$/
  12.         );
  13.         requireComponent.keys().forEach((fileName) => {
  14.             // 获取组件配置
  15.             const componentConfig = requireComponent(fileName);
  16.             //获取当前组件的文件名称 vue文件中声明的name属性 || 文件名称
  17.             const componentName =
  18.                 componentConfig.default.name ||
  19.                 fileName
  20.                     .replace(/^\.\/(.*)\.\w+$/, "$1")
  21.                     .split("/")
  22.                     .shift(); //移除数组第一个元素  结果为 文件夹名称
  23.             // .pop()//移除最后一个数组元素 结果为index
  24.             // 全局注册组件
  25.             Vue.component(
  26.                 componentName,
  27.                 // 如果这个组件选项是通过 `export default` 导出的,
  28.                 // 那么就会优先使用 `.default`,
  29.                 // 否则回退到使用模块的根。
  30.                 componentConfig.default || componentConfig
  31.             );
  32.         });
  33.     },
  34. };
  35. export default ComponentRegister;
复制代码
3. 使用vite方法全局注册组件

使用import.meta.glob方法引入组件
  1. const ComponentRegister = {
  2.     install(Vue) {
  3.         //获取所有的vue文件
  4.         const requireComponent = import.meta.glob("@/components/*/*.vue", {
  5.             // import: 'default',
  6.             as: "component",
  7.             eager: true,
  8.         });
  9.         /**
  10.          * (\/[^\/]+)+ 匹配一个或多个以/开头,后面跟着一个或多个非/字符的序列。这对应于路径中的目录名。
  11.          * \/ 匹配/字符,它是目录名与我们要提取的部分之间的分隔符。
  12.          * ([^\/]+) 匹配一个或多个非/字符,这就是我们要提取的部分(文件夹名称)。
  13.          * \/ 再次匹配/字符,表示提取部分的结束和下一个目录或文件的开始。
  14.          * */
  15.         const re = /(\/[^\/]+)+\/([^\/]+)\//; //或是 /\/components\/(.*?)\//;  i.match(re)[1];
  16.         for (const i in requireComponent) {
  17.             //获取当前遍历的组件
  18.             const componentName = i.match(re)[2];
  19.             const componentConfig = requireComponent[i];
  20.             Vue.component(componentName, componentConfig.default || componentConfig);
  21.         }
  22.     },
  23. };
  24. export default ComponentRegister;
复制代码
记取全局注册的行为必须在根 Vue 实例 (通过 new Vue) 创建之前发生。如下
  1. //注册组件到全局
  2. Vue.component("Profile", Profile);
  3. //创建vue
  4. var vue = new Vue({
  5.     el: "#app",
  6.     data: {
  7.         msg: "Vue是最简单的",
  8.     },
  9. });
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表