脚手架实现原理分析

348 阅读2分钟

脚手架的核心目标:

提升前端研发效

脚手架核心价值

将研发过程:

  • 自动化:项目重复代码拷贝/git操作/发布上线操作
  • 标准化:项目创建/git flow/发布流程/回滚流程
  • 数据化:研发过程系统化、数据化、使得研发过程可量化

@vue-cli 脚手架简介

脚手架本质是一个操作系统的客户端,它通过命令执行,比如:@vue/cli

    vue create vue-test-app -r https://registry.npm.taobao.org 
    
    // 主命令:vue
    //command: create
    //command 的 params: vue-test-app
    //创建一个名为 vue-test-app vue项目 使用 淘宝镜像 安装依赖

更多的 vue create 参数 执行 vue create --help

image.png

@vue/cli 脚手架实现原理

从三个问题入手分析 @vue/cli 实现原理

  1. 全局安装 @vue/cli 时发生了什么?
  • 下载 @vue/cli 的依赖包文件到全局 npm包安装目录,(装node的时候会指定) 默认目录: C:/Users/username/AppData/Roaming/npm/node_modules

  • 安装包文件目录 C:/Users/username/AppData/Roaming/npm/node_modules/@vue, 解析 package.json 配置,如果存在 bin 配置 在 C:\Users\hailiang.li\AppData\Roaming\npm 文件下生成 vue 对应的 shell 脚本文件 如下(执行vue 指令的时候实际 是执行的 这个shell 脚本,找到实际执行的vue.js 文件)

    #!/bin/sh
    basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

    case `uname` in
        *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
    esac

    if [ -x "$basedir/node" ]; then
      "$basedir/node"  "$basedir/node_modules/@vue/cli/bin/vue.js" "$@"
      ret=$?
    else 
      node  "$basedir/node_modules/@vue/cli/bin/vue.js" "$@"
      ret=$?
    fi
    exit $ret

  1. 执行vue命令时发生了什么?为什么 vue 指向一个 js 文件, 我们却可以直接通过vue 命令 去执行它。 执行 vue 命令的时候
  • 执行 which vue 命令, which 指令会在环境变量 $PATH 设置的目录里查找符合条件的文件(地址:C:\Users\username\AppData\Roaming\npm\vue ---- 这个文件实际是一个 shell 脚本)
  • 然后执行 vue 的shell 脚本, 查找到 vue实际执行文件 最终找到C:\Users\hailiang.li\AppData\Roaming\npm\node_modules@vue\cli\bin\vue.js 文件
  • bin/vue.js 文件头部声明 #!/usr/bin/env node 告诉操作系统 node 执行这个文件,完成 vue 命令注册

执行 vue 命令 在环境变量 C:\Users\hailiang.li\AppData\Roaming\npm 中找到注册的 vue 命令 , 软链接 指向 C:\Users\hailiang.li\AppData\Roaming\npm\vue 实际执行的 vue.js 文件
概述如下:

  • 在终端中输入 vue create vue-test-app
  • 终端解析出vue命令 (which vue 解析出 vue 软链接:/c/Users/username/AppData/Roaming/npm/vue)
  • 终端在环境变量中找到 vue 命令
  • 终端根据 vue 命令链接到实际文件vue.js (C:\Users\username\AppData\Roaming\npm\node_modules@vue\cli\bin\vue.js)
  • 终端利用node执行 vue.js
  • vue.js 解析 command/options
  • vue.js 执行 command
  • 执行完毕,退出执行

image.png

  1. 为什么全局安装 @vue/cli 后会添加的命令为 vue 而不是 vue-cli ? package.json 下bin 配置

image.png