这一节咱们将组件的大包配置,也就是使gulp同时工作的第三个compileTypescript:

exports.default = gulp.series(    removeDist,    gulp.parallel(compileLess, styleScriptTask, compileTypescript),);

这一步gulp的工作就是找到所有须要参加rollup编译的文件打包输入,当然一些测试脚本还有款式脚本须要排除在外:

// 编译tsfunction compileTypescript(cb) {    const source = [        'src/**/*.tsx',        'src/**/*.ts',        'src/**/*.d.ts',        '!src/**/__test__/**',        '!src/**/style/*.ts',    ];    const tsFiles = globArray(source);    buildScript(        tsFiles,        {            es: esDir,            cjs: cjsDir,        },        cb,    )        .then(() => {            cb();        })        .catch(err => {            console.log('---> build err', err);        });    // 单文件输入    buildBrowser('src/index.ts', umdDir, cb);    cb();}

globArray是本人找了一个匹配函数,须要匹配到指标文件并且返回文件目录列表:

const source = [        'src/**/*.tsx', // 源码目录构造下的tsx文件都参加rollup打包        'src/**/*.ts', // 源码目录构造下的ts文件都参加rollup打包        'src/**/*.d.ts',源码目录构造下的ts类型申明文件都参加rollup打包        '!src/**/__test__/**', // 测试目录不参加        '!src/**/style/*.ts', // 款式脚本独自解决的不参加    ];

接下来看这个函数buildScript 及 buildBrowser,次要是打包函数:

/** *@desc: 获取rollup 输出打包配置 *@Date: 2021-02-18 10:43:08 *@param {Object} inputOptionOverride 笼罩input配置 *@param {Array} additionalPlugins 新增的插件 *@param {object} tsConfig *@return {void} */function getRollUpInputOption(    inputOptionOverride = {},    tsConfig = {},    additionalPlugins = [],) {    const external = ['react', 'react-dom'];    const babelOptions = {        exclude: ['**/node_modules/**'],        babelHelpers: 'bundled',        presets: [            // "stage-3",            '@babel/preset-env',            '@babel/preset-react',            '@babel/preset-flow',        ],        extensions: ['tsx', 'ts', 'js', 'jsx'],        plugins: [            '@babel/transform-react-jsx',            // ['@babel/plugin-transform-runtime', { useESModules: true }],            [                '@babel/plugin-proposal-class-properties',                {                    loose: true,                },            ],            [                '@babel/plugin-proposal-decorators',                {                    legacy: true,                },            ],        ],    };    const onAnalysis = ({ bundleSize }) => {        console.log(`Bundle size bytes: ${bundleSize} bytes`);        return;    };    const inputOptions = {        external,        plugins: [            common(),            nodeResolve({                extensions: ['.js', '.jsx', '.ts', '.tsx', '.less'],            }),            alias({                entries: [                    {                        find: '@',                        replacement: path.resolve('./src'),                    },                    {                        find: '~@',                        replacement: path.resolve('./src'),                    },                ],            }),            replace({                stylePre: JSON.stringify('ti'),                'process.env.NODE_ENV': JSON.stringify('production'),            }),            less({                option: {                    globalVars: {                        'theme-color': '#136BDE',                        hack: `true; @import "${varsPath}"`,                    },                },                output: false,            }),            typescript({                tsconfigDefaults: {                    include: ['./src/**/*.ts', './src/**/*.tsx'],                    compilerOptions: {                        lib: ['es5', 'es6', 'dom'],                        // exclude: ['./src/**/style/*.ts'],                        target: 'ES6',                        // typeRoots: ["./types"],                        moduleResolution: 'node',                        module: 'ES6',                        jsx: 'react',                        allowSyntheticDefaultImports: true,                        ...tsConfig,                    },                },            }),            babel(babelOptions),            jsx({                factory: 'React.createElement',                extensions: ['js', 'jsx', 'tsx'],            }),            analyze({ onAnalysis, skipFormatted: true, stdout: true }),            ...additionalPlugins,        ],        ...inputOptionOverride,    };    return inputOptions;}// 组件es cjs标准编译输入exports.buildScript = async function(inputPaths, outputConf) {    // 输入格局    const outputOptions = [        {            // file: outputPath,            format: 'cjs',            dir: outputConf.cjs,            preserveModulesRoot: 'src',            preserveModules: true,            exports: 'named',            hoistTransitiveImports: false, // 不导入其余模块代码        },        {            // file: outputPath,            format: 'esm',            dir: outputConf.es,            preserveModulesRoot: 'src',            preserveModules: true,            exports: 'named',            hoistTransitiveImports: false, // 不导入其余模块代码        },    ];    for (const outputOption of outputOptions) {        const bundle = await rollup.rollup(            getRollUpInputOption(                {                    input: inputPaths,                    treeshake: true,                },                {                    declaration: true,                },            ),        );        await bundle.generate(outputOption);        await bundle.write(outputOption);        await bundle.close();    }};// 打包成一个文件exports.buildBrowser = async function(entryPath, outputDir, cb) {    const outputOption = {        file: outputDir + '/index.js',        format: 'umd',        // dir: outputDir, preserveModulesRoot: 'src', preserveModules: true,        name: 'ti', // 浏览器应用时候须要裸露的库的名字        exports: 'named',        globals: {            react: 'React', // 单个 打包须要裸露的全局变量            'react-dom': 'ReactDOM',        },    };    const bundle = await rollup.rollup(        getRollUpInputOption(            {                input: entryPath,                treeshake: true,            },            {},            [uglify()],        ),    );    await bundle.generate(outputOption);    await bundle.write(outputOption);    await bundle.close();    cb();};

buildScript是输入es和cjs标准的解决,buildBrowser是umd标准的解决。组件打包都开启了树摇