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

2023-03-14  本文已影响0人  日不落000

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

问题描述

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

解决思路

属性 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

上一篇 下一篇

猜你喜欢

热点阅读