上一篇文章,已经大致了解脚手架是什么以及脚手架是如何工作的。接下来,稍微深入一下脚手架的工作过程(以vue-cli为例)。首先抛出3个问题:

  1.明明全局安装的是@vue/cli,最后执行的命令却是vue?

  2.全局安装@vue/cli时发生了什么?

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

  弄清楚这3个问题,基本上对脚手架的原理已经有个大体的认识,文章最后会详解自定义npm命令哦~

  首先,第一个问题为什么安装的是@vue/cli,执行的命令是vue,先找到npm文件夹:

  

  这是vue命令的执行文件,打开会发现有这样一行代码:

   1 endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\node_modules\vue-cli\bin\vue" %*

  这行代码的作用是,将当前命令指向\node_modules\vue-cli\bin\vue,所以即使我们用的命令是vue,最终还是指向@vue/cli内部的文件。

  第二个问题,全局安装@vue/cli时发生了什么:

  1.下载node_modules

  2.在package.json里面配置bin的软链接:

  

  第三个问题,vue命令最终会指向vue-cli内的某个文件,为什么可以执行它:

  前面我们已经知道,vue命令执行的时候,会先找到vue文件(AppData\Roaming\npm\vue.cmd)并执行,执行这个vue文件的时候,会发现这是一个软链接,实际指向的是:\node_modules\vue-cli\bin\vue 该路径的vue文件,最后才会执行这个文件。那么问题来了,vue命令指向的这个文件,是如何执行的?前端的同学们都知道,node环境下执行js文件,需要加一个node命令前缀,才可以执行该js文件。那这个地方的文件,是如何执行的呢?我们找到vue-cli\bin\vue文件:

  打开会是下面这几行代码:

 1 #!/usr/bin/env node
2
3 const program = require('commander')
4
5 program
6 .version(require('../package').version)
7 .usage('<command> [options]')
8 .command('init', 'generate a new project from a template')
9 .command('list', 'list available official templates')
10 .command('build', 'prototype a new project')
11 .command('create', '(for v3 warning only)')
12
13 program.parse(process.argv)

  没错,主要就是第一行代码:

1 #!/usr/bin/env node

  这行代码的作用,它会在我们的环境变量中找到node命令,并用node命令执行该文件!致此,这三个问题都已经有了答案,现在再来看一下:vue create vue-test这条命令的执行过程:

  1.在终端输入:vue create vue-test

  2.终端解析出vue命令

  3.终端在环境变量中找到vue命令

  4.终端根据vue命令链接到实际文件vue

  5.终端利用node执行vue文件

  6.vue解析command/options

  7.vue执行command

  8.执行完毕,退出

  现在是不是对脚手架的工作原理理解更深刻一点了呢,其中的command将会在以后开发脚手架的时候会单独拿出来讨论。

  下面介绍自定义npm指令以及其软链接到其它文件:

  首先在npm文件夹下新建一个wang.cmd:

 1 @ECHO off
2 GOTO start
3 :find_dp0
4 SET dp0=%~dp0
5 EXIT /b
6 :start
7 SETLOCAL
8 CALL :find_dp0
9
10 IF EXIST "%dp0%\node.exe" (
11 SET "_prog=%dp0%\node.exe"
12 ) ELSE (
13 SET "_prog=node"
14 SET PATHEXT=%PATHEXT:;.JS;=;%
15 )
16
17 endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\node_modules\vue-cli\bin\wang" %*

  最终指向到vue-cli\bin\wang:

1 #!/usr/bin/env node
2
3 console.log('wang')

  执行wang:

最后:脚踏实地行,海阔天空飞!

浅析vue-cli脚手架命令的执行过程的更多相关文章

  1. 13. Vue CLI脚手架

    一. Vue CLI 介绍 1. 什么是Vue CLI? Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统.Vue CLI 致力于将 Vue 生态中的工具基础标准化.它确保了各种构建工 ...

  2. 深入Redis命令的执行过程

    深入Redis命令的执行过程 Redis 服务器: Redis 服务器实现与多个客户端的连接,并处理这些客户端发送过来的请求,同时保存客户端执行命令所产生的数据到数据库中.Redis 服务器依靠资源管 ...

  3. 使用Vue CLI脚手架搭建vue项目

    本次是使用@vue/cli 3.11.0版本搭建的vue项目 1. 首先确保自己的电脑上的Node.js的版本是8.9版本或者以上 2. 全局安装vue/cli npm install @vue/cl ...

  4. Ping 命令的执行过程和应用协议

    1. ICMP是“Internet Control Message Ptotocol”的缩写.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息. 控制消息是指网络通不通.主机 ...

  5. vue cli脚手架使用

    1.安装nodejs,npm https://www.cnblogs.com/xidianzxm/p/12036880.html 2.安装vue cli sudo npm install -g @vu ...

  6. 关于ansible命令的执行过程

    首先说明一下.每一个模块.都是有相应的.py文件的,可以通过rpm -ql ansible看到 要观察模块执行过程,可以在ansible命令执行时加上-v或-vvv,或者-vvvv看得更加详细 ans ...

  7. sqlplus文件查看自带oracle命令的执行过程

    问题描述:看到一篇文章 在$ORACLE_HOME/bin/sqlplus中可以查看到数据库命令的查询语句.可以直接编辑sqlplus文件,查到到我们平时标准系统命令的原脚本,但是自己进行编辑查看却是 ...

  8. vue.cli脚手架初次使用图文教程

    vue-cli作用 vue-cli作为vue的脚手架,可以帮助我们在实际开发中自动生成vue.js的模板工程. vue-cli使用 !!前提:需要vue和webpack 安装全局vue-cli npm ...

  9. node.js和vue cli脚手架下载安装配置方法

    一.node.js安装以及环境配置 1.下载vue.js 下载地址: https://nodejs.org/en/ 2.安装node.js 下载完成后,双击安装包开始安装.安装地址最好换成自己指定的地 ...

随机推荐

  1. TVM交叉编译和远程RPC

    TVM交叉编译和远程RPC 本文介绍了TVM中使用RPC的交叉编译和远程设备执行. 使用交叉编译和RPC,可以在本地计算机上编译程序,然后在远程设备上运行它.当远程设备资源受到限制时(如Raspber ...

  2. 微信架构 & 支付架构(下)

    微信架构 & 支付架构(下) 3. 管理网络请求 首先看看原来 iOS 处理支付网络请求的缺陷: 原来支付的请求,都是通过一个单例网络中心去发起请求,然后收到回包后,通过抛通知,或者调用闭包的 ...

  3. TensorFlow优化器及用法

    TensorFlow优化器及用法 函数在一阶导数为零的地方达到其最大值和最小值.梯度下降算法基于相同的原理,即调整系数(权重和偏置)使损失函数的梯度下降. 在回归中,使用梯度下降来优化损失函数并获得系 ...

  4. h265webplayer

    h265webplayer https://github.com/ksvc/h265webplayer h265webplayer是金山云的Web端H.265视频播放器,该播放器Web SDK让您可以 ...

  5. Java线程池底层源码分享和相关面试题(持续更新)

    线程池各个参数讲解 public ThreadPoolExecutor(int corePoolSize, //线程池核心工作线程数量,比如newFixedThreadPool中可以自定义的线程数量就 ...

  6. 「题解」PA2019 Terytoria

    本文将同步发布于: 洛谷博客: csdn: 博客园: 因为简书系统升级,所以本文未在简书上发布. 题目 题目链接:洛谷 P5987.LOJ 3320.官网. 题意概述 在二维平面直角坐标系上,有一个长 ...

  7. 【工具解析】瑞士军刀bettercap2.X解析_第一期_编写HTTP代理注入模块_http(s).proxy.script

    /文章作者:Kali_MG1937 CNBLOG博客号:ALDYS4 QQ:3496925334/ 前言 bettercap已经从1.6更新至2.0版本 语言也从ruby改为了go 编写注入模块指定的 ...

  8. ThreadPoolExecutor参数详解

    ThreadPoolExecutor全部参数的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long ke ...

  9. 【dp】背包问题

    01背包 呐,为什么叫它01背包呢,因为装进去就是1,不装进去就是0.所以针对每个物品就两种状态,装,不装(请允许我用这么老套的开篇,相信听过很多次背包讲解的人,大多都是这个开篇的)所以咯,我这个背包 ...

  10. 海量数据Excel报表利器——EasyExcel(开场篇)

    EasyExcel 简介篇 互联网的精髓就是共享,可以共享技术.共享经验.共享情感.共享快乐~ 很多年前就有这个想法了,从事IT行业时间也不短了,应该把自己工作和业余所学习的东西记录并分享出来,和有缘 ...