• 当我们在控制台运行`npm run xxx`时,到底发生了什么?


    npm script

    当我们在控制台运行npm run xxx时,到底发生了什么?

    使用过vue-cli或者create-react-app的小伙伴一定知道,当我们运行项目时,往往需要在控制台输入npm run xxx

    只有这样 我们的项目才会开始构建,接下来我们就来探讨其中的过程

    我们打开一个项目,以create-react-app脚手架为例

    它的package.json大体是这样的

    image-20220811162012403

    其中有本项目的一些基本信息,其中script属性就是我们要探讨的东西

    当我们执行npm run xxx时 实际上会执行script中的指令

    例如执行npm run start,实际上会执行react-script start

    那么问题来了:

    我们为什么要通过执行npm run start来间接执行react-script start,而不能直接执行它呢?

    答案是:react-script start这条指令并不存在于操作系统中,所以我们直接执行是会报错的

    那么问题又来了:

    为什么执行npm run start就会使得react-script start正常执行呢? 在这个过程中 npm帮我们做了一些什么事呢?

    其实,当我们执行npm run start时,系统会自动寻找在mode_modules/.bin/目录中的对应文件,也就是react-script

    这个文件就是一个可执行文件,用于启动整个项目

    image-20220811163447606

    但是我们点开文件,文件内部是这样的

    image-20220811163523634

    很显然,这个文件只是一个映射,他的功能实质性我们真正的启动文件

    当我们使用npm install来下载npm包时,会下载这个包的各种文件

    image-20220811163813455

    这个npm包内部的package.json中会有一个bin声明,他指向./bin目录中的对应文件,在这里就是react-script.js

    image-20220811163946908

    并且在创建的过程中,npm会将这个文件(react-script.js)软链接 ./node_modules/.bin目录中,形成一个映射关系,

    而 npm 还会自动把`node_modules/.bin加入$PATH,这样就可以直接作为命令运行依赖程序和开发依赖程序

    所以我们执行./node_modules/.bin对应文件时,npm就会去寻找真正的js文件(react-script.js)来执行

    这样就完成了一整个流程

    总结一下:

    npm i 的时候,npm 就帮我们把这种软连接配置好了,其实这种软连接相当于一种映射,执行npm run xxx 的时候,就会到 node_modules/bin中找对应的映射文件,然后再找到相应的js文件来执行。**


    其实还有一点没说 就是./node_modules/.bin中,会什么会有三个同名文件呢?

    image-20220811164659506

    其实这三个文件代表不同的三个执行环境

    如果我们在 cmd 里运行的时候,windows 一般是调用了 react-script.cmd,这个文件

    # unix 系默认的可执行文件,必须输入完整文件名
    react-script
    
    # windows cmd 中默认的可执行文件,当我们不添加后缀名时,自动根据 pathext 查找文件
    react-script.cmd
    
    # Windows PowerShell 中可执行文件,可以跨平台
    react-script.ps1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    再做个总结:

    当我们运行react-script serve这条命令的时候,就相当于运行 node_modules/.bin/react-script.cmd serve

    然后这个脚本会使用 node 去运行 react-script.js这个 js 文件

    由于 node 中可以使用一系列系统相关的 api ,所以在这个 js 中可以做很多事情,例如读取并分析运行这条命令的目录下的文件,根据模板生成文件等。

  • 相关阅读:
    【老生谈算法】matlab实现fsk-ask算法源码——fsk-ask算法
    姿态估计评价指标
    笔试选择题-树
    【Python】Python 查询图片EXIF信息,获取地理位置
    Spring6 (1) IOC
    shell命令合集(loading)
    在 VirtualBox 虚拟机上搭建 openEuler 并安装桌面环境 详细教程
    基础操作:拓扑连线以及矩形文字位置
    高标准企业级安全性,华为云会议为线上沟通保驾护航
    gitlab 实战
  • 原文地址:https://blog.csdn.net/Laollaoaolao/article/details/126288769