Source: parse-args.js

var npmCmds = require('./npm-cmds');
var locateBin = require('./locate-bin');
var env = require('./env');

// 更新环境变量
Object.keys(process.env).forEach(function(key) {
  env[key] = process.env[key];
});

var OFFICIAL_REGISTRY = env.NPM_OFFICIAL_REGISTRY,
  MIRROR_REGISTRY = env.NPM_MIRROR_REGISTRY;

/**
 *
 * 解析 cli 的参数
 *
 *  - 如果命令中带有 `--registry`,则使用其指定的 registry ,如 `npm install jquery --registry=https://registry.npmjs.org`
 *  - 如果命令中带有 `--npm`, 则强制使用官方的 registry , 如 `npm install jquery --npm`
 *  - 如果命令中不带有上面两个参数,则判断命令是否是 {@link npm-cmds} 中的一个,是的话用官方的 registry ,否则使用中国镜像的 registry
 *
 *
 * @alias parse-args
 * @param {Array} args - cli 的参数,一般是 process.argv.slice(2)
 * @returns {Object}
 */
module.exports = function(args) {

  var cmd = locateBin('npm'),
    registry = MIRROR_REGISTRY,
    rest = [],
    reWord = /^[\w-]+$/;

  args = args.filter(function(arg) {
    if (arg === '--npm') {
      registry = OFFICIAL_REGISTRY;
      return false;
    }

    if (arg && arg[0] !== '-' && reWord.test(arg)) {
      rest.push(arg);
    }

    return true;
  });

  if (rest.length && npmCmds.indexOf(rest[0]) >= 0) {
    registry = OFFICIAL_REGISTRY;
  }

  // 命令中没有 `--registry` 选项才加上默认的
  if (args.join('|').indexOf('--registry') < 0) {
    args.push('--registry=' + registry);
  }

  return {
    env: registry !== OFFICIAL_REGISTRY ? env : process.env,
    cmd: cmd,
    rest: rest, // rest 可能为空的 数组
    args: args
  };
};