源码共读-UMI-1

7 篇文章 0 订阅
4 篇文章 0 订阅
#!/usr/bin/env node

声明文件执行环境 node

const spawn = require('cross-spawn');
const chalk = require('chalk');

chalk是一个颜色的插件

const script = process.argv[2];
const args = process.argv.slice(3);

process模块用来与当前进程互动,可以通过全局变量process访问,不必使用require命令加载。它是一个EventEmitter对象的实例。

process对象提供一系列属性,用于返回系统信息。
- process.pid:当前进程的进程号。
- process.version:Node的版本,比如v0.10.18。
- process.platform:当前系统平台,比如Linux。
- process.title:默认值为“node”,可以自定义该值。
- process.argv:当前进程的命令行参数数组。
- process.env:指向当前shell的环境变量,比如process.env.HOME。
- process.execPath:运行当前进程的可执行文件的绝对路径。
- process.stdout:指向标准输出。
- process.stdin:指向标准输入。
- process.stderr:指向标准错误。
比如执行 umi dev haha xixi

// process.argv
[ 
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\Users\\Administrator\\AppData\\Roaming\\npm\\node_modules\\umi\\bin\\umi.js',
  'dev',
  'haha',
  'xixi' 
]

那么此时

script = dev

args = [ ‘haha’, ‘xixi’ ]

const nodeVersion = process.versions.node;
const versions = nodeVersion.split('.');
const major = versions[0];
const minor = versions[1];

if (major * 10 + minor * 1 < 65) {
  console.log(`Node version must >= 6.5, but got ${major}.${minor}`);
  process.exit(1);
}

判断当前node的版本大于v6.5
- process.exit(0)表示成功完成,回调函数中,err将为null;
- process.exit(非0)表示执行失败,回调函数中,err不为null,err.code就是我们传给exit的数字。

// Notify update when process exits
const updater = require('update-notifier');
const pkg = require('../package.json');
updater({ pkg: pkg }).notify({ defer: true });

进程退出时通知更新,其中defer:true,表示在进程退出后显示通知。

// Add help command 
const cmds = {
  build: 'create a production build',
  dev: 'start a development server',
  test: 'do unit/ui test with jest',
  help: 'show help',
  '-v, --version': 'show version',
};

function help(aliasedScript) {
  let usage = `\nUsage: umi <command>\n`;
  let helpArea = '';
  for (var cmd in cmds) {
    helpArea += (' ' + cmd + Array(25 - cmd.length).join(' ') + cmds[cmd] + '\n');
  }
  console.log([usage,helpArea].join(`\nCommands:\n\n`));
  if (!['help', '-h', '--help'].includes(aliasedScript)) {
    console.log(`Unknown script ${chalk.cyan(aliasedScript)}.`);
  }
}

help输入,当执行umi help时

Usage: umi <command>

Commands:

 build                   create a production build
 dev                     start a development server
 test                    do unit/ui test with jest
 help                    show help
 -v, --version           show version
// Script area
const scriptAlias = {
  g: 'generate' // eslint-disable-line
};

给命令取别名,比如这里给generate取了个别名叫做g
当执行umi generate 时,相当于执行umi g

const aliasedScript = scriptAlias[script] || script;

取出别名,如果有别名取别名,没有就保留。

switch (aliasedScript) {
  case '-v':
  case '--version':
    console.log(pkg.version);
    if (!(pkg._from && pkg._resolved)) {
      console.log(chalk.cyan('@local'));
    }
    break;
  case 'build':
  case 'dev':
  case 'generate':
    runScript(aliasedScript, args, /* isFork */true);
    break;
  case 'test':
    runScript(aliasedScript, args);
    break;
  default:
    help(aliasedScript);
    break;
}
  case '--version':
    console.log(pkg.version);
    if (!(pkg._from && pkg._resolved)) {
      console.log(chalk.cyan('@local'));
    }
  break;

umi -v 这里通过package.json中的 _from_resolved 来判断是否是本地包

其他的通过runScript执行。

function runScript(script, args, isFork) {
  if (isFork) {
    const result = spawn.sync(
      'node',
      [require.resolve(`../lib/scripts/${script}`)].concat(args),
      {stdio: 'inherit'} // eslint-disable-line
    );
    process.exit(result.status);
  } else {
    require(`../lib/scripts/${script}`);
  }
}

执行lib目录下面对应的scripts。

Github地址
https://github.com/xiaohuoni/source-code-co-reading-umi

感谢您的阅读。
我是莽夫,希望你开心。
如果你觉得本文对你有帮助,请扫描文末二维码,支持博主原创。
希望大家关注我的个人公众号ionic_

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值