美文网首页
内部组件库打包会把element-plus打包到node_mod

内部组件库打包会把element-plus打包到node_mod

作者: 日不落000 | 来源:发表于2023-03-14 09:49 被阅读0次

内部组件库打包会把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

相关文章

  • 2018-06-17

    基于rollup的组件库打包体积优化 背景 前段时间对公司内部的组件库(类似element-ui)做了打包体积优化...

  • vue自定义组件库如何按需加载

    写好的组件库不要打包!不要打包!不要打包!直接引入源码在使用时把单个组件导入就行。打包了之后就没办法做到按需引入了

  • webpack4实现css打包

    在webpack打包过程中,默认会把css文件打包到js内部,代码如下: 它的工作原理大概是把 CSS 内容用 J...

  • Vue插件打包与发布的方法示例

    插件打包与发布插件功能开发完成后,若需要发布到公共组件库中(例如:npmjs),需要对插件进行打包并发布,简单说明...

  • npm 打包组件库

    为了方便代码公用,打造简易组件库,下面写的教大家打包到发布,基于react 初始化项目 mkdir compone...

  • Vite打包组件库

    动机 去年使用vue3 + TSX封装组件,结果卡在了打包上,直到最近发现,vite提供了tsx的打包插件。 组件...

  • rollup 打包vue3组件库报错 'createElemen

    rollup 打包vue3组件库报错 'createElementVNode' is not exported b...

  • iOS 打包四种选项的含义和JPush的关系

    iOS 打包注意事项: Ad-Hoc是企业内部测试,即使JPush设置为开发模式,打包时也会把JPush推送改为为...

  • 私有库组件化-组件更新步骤

    项目中用到pod私有库中,自定义的组件需更新的操作 从Git上clone组件代码到本地 更新组件代码,运行打包脚本...

  • Vue3+TS Day32 Element-plus、axios

    一、element-plus 1、element-plus适用于环境? 适用于【vue3】的【桌面端】【组件库】 ...

网友评论

      本文标题:内部组件库打包会把element-plus打包到node_mod

      本文链接:https://www.haomeiwen.com/subject/caihrdtx.html