umi/father–build模块源码阅读
背景
最近在做前端公共组件库的打包工具,B站上看到阿里大佬云谦做的一个关于前端组件库打包工具umi/father视频,于是拿来阅读,方便后期自己基于Rollup开发打包工具。
项目架构
该项目同样是以lerna为monorepo架构的多包管理,共有2个包,father和father-build。father主要是处理组件库文档类,father-build是聚焦于利用rollup去打包library。本文重点关注father-build。
![未命名文件](/Users/yang/Downloads/未命名文件.png)
主要模块解析
father.js(father/packages/father/bin/father.js)
通过script命令 father build/doc调用
// 获取命令行执行参数json对象
const args = yParser(process.argv.slice(2));
// 参数中带有version时,打印版本号信息
if (args.v || args.version) {
console.log(require('../package').version);
// 检测.local是否存在,若存在,打印
if (existsSync(join(__dirname, '../.local'))) {
console.log(chalk.cyan('@local'));
}
// 正常退出进程
process.exit(0);
}
// 进行退出时通知
const updater = require('update-notifier');
const pkg = require('../package.json');
updater({
pkg }).notify({
defer: true });
// 获取Node.js进程执行时的工作目录
const cwd = process.cwd();
async function doc(args) {
// 处理文档内容,暂不做解析
}
// 根据father xxx命令对应操作
switch (args._[0]) {
// XXX
case 'build':
build();
break;
// XXX
}
function build() {
// 转换传入参数
const buildArgs = stripEmptyKeys({
esm: args.esm && {
type: args.esm === true ? 'rollup' : args.esm },
cjs: args.cjs && {
type: args.cjs === true ? 'rollup' : args.cjs },
umd: args.umd && {
name: args.umd === true ? undefined : args.umd },
file: args.file,
target: args.target,
entry: args._.slice(1),
});
// 如果有多个入口文件,则抛出异常, 退出进程
if (buildArgs.file && buildArgs.entry && buildArgs.entry.length > 1) {
signale.error(new Error(
`Cannot specify file when have multiple entries (${
buildArgs.entry.join(', ')})`
));
process.exit(1);
}
// 引入father-build模块,并调用father-build中build函数
require('father-build').default({
cwd,
watch: args.w || args.watch,
buildArgs,
}).catch(e => {
// 有异常,打印异常,退出
signale.error(e);
process