内部组件库打包会把element-plus打包到node_modules/.pnpm/目录问题处理

内部组件库打包会把element-plus打包到node_modules/.pnpm/目录问题处理

问题描述

将 element-plus 等第三方库打包到内部库里面有可能会导致以下问题:

  • 应用打包失败
  • 内部组件库用的 element-plus 组件是内部库的 element-plus ,应用用的 element-plus 组件是 node_modules 的 element-plus ,代码用的不是一套,导致弹窗层级会有问题,会被覆盖而看不到。(这个问题还有其他解决方法,不如这个方法好,这里就不在重点介绍了,大体的思路是通过 useZIndex 同步各个组件库的 zIndex , 解决多组件库统一层叠顺序问题的本质就是在项目的应用层再实现一个 zIndex 管理器。管理器需要接受来自不同组件库的 zIndex 管理器,并在任一管理器中的 zIndex 值发生变化时,把变化同步到其它管理器中。可以参考:Element 黑魔法,统一多组件库的层叠顺序 https://juejin.cn/post/7131754451873824775

解决思路

属性 external 接收一个模块名称组成的数组,或者接收一个参数为模块名字的函数,如果需要把某模块设置为外部引入,只需要让该函数返回 true。例如:

export default {
  // ...
  external: id => /lodash/.test(id)
}

解决方案:具体配置

/** @format */

// vite.config.js
import path from 'path';
import packageJsonObj from '../../package.json';

const { peerDependencies, dependencies } = packageJsonObj;
const externalList = [...Object.keys(peerDependencies), ...Object.keys(dependencies)];
export default {
    build: {
        lib: {
            entry: path.resolve(__dirname, '../../src/entry/lib/main/index.ts'),
            name: 'PowerComponentsMain',
            formats: ['es', 'cjs'],
            // the proper extensions will be added
            fileName: 'index',
        },
        sourcemap: true,

        rollupOptions: {
            // 确保外部化处理那些你不想打包进库的依赖
            external: (id) => {
                const str = `${externalList.join('|').replaceAll('/', '[\\\\/]')}`;
                const newId = id.replaceAll('.vue', '').replaceAll('?vue', '').replaceAll('vue&', '');
                const regExp = new RegExp(str);
                let external = false;
                if (newId.indexOf('pc-') > -1) {
                    external = false;
                } else {
                    external = regExp.test(newId);
                }
                return external;
            },
            // external: [
            //  '@element-plus/icons-vue',
            //  '@vueuse/core',
            //  'ace-builds',
            //  'ace-builds/src-min-noconflict/mode-javascript',
            //  'js-cookie',
            //  'quill',
            //  'element-plus/es',
            //  'element-plus',
            //  'axios',
            //  'dayjs',
            //  'echarts',
            //  'pinia',
            //  'vue',
            //  'vue-router',
            // ],
            input: [path.resolve(__dirname, '../../src/entry/lib/main/index.ts')],
            output: [
                {
                    format: 'es',
                    //不用打包成.es.js,这里我们想把它打包成.js
                    entryFileNames: '[name].js',
                    //让打包目录和我们目录对应
                    preserveModules: true,
                    //配置打包根目录
                    dir: 'dist/es',
                    preserveModulesRoot: path.resolve(__dirname, '../../src'),
                },
                {
                    format: 'cjs',
                    entryFileNames: '[name].js',
                    //让打包目录和我们目录对应
                    preserveModules: true,
                    //配置打包根目录
                    dir: 'dist/lib',
                    preserveModulesRoot: path.resolve(__dirname, '../../src'),
                },
            ],
        },
    },
};

按这个配置配好后,一般的应该不用太关心这个方法,特殊的打包有问题了,可以考虑一下是不是 external 这里的问题,例如vue和内部组件 pc- 有进行特殊处理,避免冲突和问题。

参考:
Rollup 集成第三方工具 https://www.rollupjs.com/guide/tools#%E5%89%8D%E7%BD%AE%E4%BE%9D%E8%B5%96peer-dependencies

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容