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

基础组件的自动化全局注册

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

js 复制代码
import dgDialog from "@/components/dgDialog/index.vue";
import svgIcon from "@/components/svgIcon/index.vue";
const allComponent = { dgDialog, svgIcon };
export default {
    install(app) {
        console.log(app, "app"); //App.vue
        Object.keys(allComponent).forEach((key) => {
            console.log(key, "key"); //dgDialog svgIcon
            app.component(key, allComponent[key]);
        });
    },
};


// 或是
const ComponentRegister = {
    install(Vue) {
        console.log(Vue, "Vue"); //App.vue
        Object.keys(allComponent).forEach((key) => {
            console.log(key, "key");
            Vue.component(key, allComponent[key]);
        });
    }
}


export default ComponentRegister;

2. 使用webpack(或在内部使用了webpackVue CLI 3+)全局注册组件

使用 require.context方法引入组件

js 复制代码
// 所有组件放在一个`components`文件夹内的写法
const ComponentRegister = {
    install(Vue) {
        // 文件结构为components/组件名称.vue
        const requireComponent = require.context(
            // 其组件目录的相对路径
            "@/components",
            // 是否查询其子目录
            false,
            // 匹配基础组件文件名的正则表达式
            /\.(vue|js)$/
        );


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


            // 获取当前组件的文件名称 vue文件中声明的name属性 || 文件名称
            const componentName =
                componentConfig.default.name ||
                fileName
                    .split("/")
                    .pop()
                    .replace(/\.\w+$/, ""); //或 fileName.replace(/^\.\/(.*)\.\w+$/, "$1");
            // 全局注册组件
            Vue.component(
                componentName,
                // 如果这个组件选项是通过 `export default` 导出的,
                // 那么就会优先使用 `.default`,
                // 否则回退到使用模块的根。
                componentConfig.default || componentConfig
            );
        });
    },
};


export default ComponentRegister;
js 复制代码
// 组件以文件夹名称命名
const ComponentRegister = {
    install(Vue) {
        // 文件结构为文件夹名称(即组件名称)/index.vue
        const requireComponent = require.context(
            // 其组件目录的相对路径
            "@/components/",
            // 是否查询其子目录
            true,
            // 匹配基础组件文件名的正则表达式
            /\.(vue|js)$/
        );
        requireComponent.keys().forEach((fileName) => {
            // 获取组件配置
            const componentConfig = requireComponent(fileName);


            //获取当前组件的文件名称 vue文件中声明的name属性 || 文件名称
            const componentName =
                componentConfig.default.name ||
                fileName
                    .replace(/^\.\/(.*)\.\w+$/, "$1")
                    .split("/")
                    .shift(); //移除数组第一个元素  结果为 文件夹名称
            // .pop()//移除最后一个数组元素 结果为index


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


export default ComponentRegister;

3. 使用vite方法全局注册组件

使用import.meta.glob方法引入组件

js 复制代码
const ComponentRegister = {
    install(Vue) {
        //获取所有的vue文件
        const requireComponent = import.meta.glob("@/components/*/*.vue", {
            // import: 'default',
            as: "component",
            eager: true,
        });


        /**
         * (\/[^\/]+)+ 匹配一个或多个以/开头,后面跟着一个或多个非/字符的序列。这对应于路径中的目录名。
         * \/ 匹配/字符,它是目录名与我们要提取的部分之间的分隔符。
         * ([^\/]+) 匹配一个或多个非/字符,这就是我们要提取的部分(文件夹名称)。
         * \/ 再次匹配/字符,表示提取部分的结束和下一个目录或文件的开始。
         * */
        const re = /(\/[^\/]+)+\/([^\/]+)\//; //或是 /\/components\/(.*?)\//;  i.match(re)[1];
        for (const i in requireComponent) {
            //获取当前遍历的组件
            const componentName = i.match(re)[2];
            const componentConfig = requireComponent[i];
            Vue.component(componentName, componentConfig.default || componentConfig);
        }
    },
};


export default ComponentRegister;

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

js 复制代码
//注册组件到全局
Vue.component("Profile", Profile);
//创建vue
var vue = new Vue({
    el: "#app",
    data: {
        msg: "Vue是最简单的",
    },
});
相关推荐
万少4 小时前
万少的博客 - 技术分享与解决方案
前端·javascript·后端
尘世中一位迷途小书童6 小时前
用 Cesium 撸了一个森林火情监控大屏,弧线、粒子、发光效果都齐了
前端·javascript
先吃饱再说8 小时前
JavaScript中`this` 的“千层套路”:从默认绑定到箭头函数的五种指向
javascript
foxire8 小时前
基于nodejs实现服务端内核引擎
javascript
锋行天下9 小时前
半秒开!还有谁!!!
前端·vue.js·架构
触底反弹10 小时前
🧠 搞懂 Token,才算真正入门大模型——从分词原理到 Embedding 语义实战
javascript·人工智能·算法
free3510 小时前
AST Interpreter 的设计:为什么分 evaluate() 和 execute()
javascript
JING小白10 小时前
Day 1 重学Vue:响应式系统的“底层逻辑”变更,Vue2旧时代的终结与Vue3新时代的开启
前端·vue.js
等咸鱼的狸猫11 小时前
JavaScript 隐式类型转换:从入门到精通
javascript
kyriewen13 小时前
我用 Codex 重写了同事维护三年的代码,他没说谢谢——而是找了领导
前端·javascript·ai编程