脚手架实现原理

为什么全局安装@vue/cli后会添加命令为vue

实际注册的命令是package.json中bin配置的

全局安装@vue/cli是发生了什么

npm会查看package.json,如果发现了bin字段就会在全局node_module同级目录创建可执行文件

执行vue命令时发生了什么?为什么vue指向一个js文件,我们却可以直接通过vue命令去执行它

1.在环境变量中寻找vue命令,如果存在就先找到实际的包目录(有可能是软连接)再执行命令入口文件;
2.因为入口js 顶部 声明了使用node去执行,!# /usr/bin/env node; 执行vue命令时传入的第一个参数是node

Yargs常用API和开发流程

传递参数:

require('yargs/yargs')(process.argv.slice(2)).argv 等价于 require('yargs/yargs')(process.argv.slice(2)).parse()

const { hideBin } = require('yargs/helpers'); process.argv.slice(2) 等价于 hideBin(process.argv)

脚手架初始化流程

  • Yargs() - 构造函数
  • Yargs.options - 批量注册全局options
  • Yargs.option - 单个注册全局option
  • Yargs.group - 给定options的键值 将其归于一个分组
  • Yargs.demandCommand - 允许输入的参数最小个数 不满足时报错
  • Yargs.recommendCommands - 如果找不到匹配的命令 提示类似命令
  • Yargs.strict - 无法识别命令会报错
  • Yargs.fail - 所有错误处理函数
  • Yargs.alias - 为option 指定别名
  • Yargs.wrap - 为命令行指定宽度
  • Yargs.epilogue - 再命令行结尾输出信息

    Yargs.command

  • Yargs.command(command, describe, builder, handler)
  • Yargs.command({ command, describe, builder, handler })
    • command - 命令字符串
    • describe - 命令描述
    • builder - 添加命令的options
    • handler - 命令处理函数,处理具体业务

      lerna的实现原理

      lerna简单说明

  • lerna是基于git+npm 的多package项目管理工具;主要解决了多包管理的重复操作,操作的标准化,提高了效能;
    • 主要api
      • lerna init初始化项目
      • lerna create 创建package
      • lerna add 安装依赖
      • lerna link link包的依赖
      • lerna publish 发布到npm上
    • 给特定的package执行命令使用filter-options --scope

      lerna原理

  • 通过import-local优先调用本地项目: lerna中使用微任务执行命令 在全局入口判断有本地lerna项目的情况下会加载本地项目并执行,然后执行宏任务下的代码输出 using local version of lerna
  • 通过yargs生成脚手架
  • lerna 通过配置package.json本地依赖的方式进行本地开发,写法"module-name":'file:your-local-module-path',lerna再发布时会自动替换该路径

    require.resolve 实现原理

  • 通过Module._resolveFileName 解析文件名 解析出绝对路径;首先调用Module._resolveLookupPaths逐层往上级目录找并拼接/node_modules存到paths数组中返回paths;然后通过Module._findPath找到真实模块路径;
Copyright © imooc-lego (2020 - present) all right reserved,powered by GitbookFile Modify: 2021-06-27 08:04:57

results matching ""

    No results matching ""