【npm link】Node命令中的npm link命令的使用,还有CLI全局命令的使用,开发命令行工具必不可少的部分

😁 作者简介:一名大四的学生,致力学习前端开发技术

⭐️个人主页:夜宵饽饽的主页

❔ 系列专栏:NodeJs

👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进的勇气

​🔥​前言:

本文是关于Node命令中的npm link命令的详细使用,还有脚手架的背后原理,如果我们需要开发命令行工具或者脚手架时,npm link的使用是必不可少的一环,有关环境变量部分大家一定要好好理解,希望可以帮助到大家,欢迎大家的补充和纠正

文章目录

  • Node命令
    • 1.CLI全局命令
    • [2.npm link](#2.npm link)
      • 2.1作为npm包被其他包引用
        • [在开发调试的包中执行npm link](#在开发调试的包中执行npm link)
        • [在项目中执行npm link](#在项目中执行npm link)
      • [2.2 作为命令行工具需要直接在终端调用](#2.2 作为命令行工具需要直接在终端调用)
    • 最后

Node命令

1.CLI全局命令

当我们安装一个npm包之后,我们可以再电脑的任意终端使用这个npm包提供的指令,例如:当我们安装了nest npm install -g @nestjs/cli ,我们就可以在任意地方使用nest这个指令,例如:

nest new my-nest-project ,就会帮我们创建一个名字叫 my-nest-project的nest项目,这是怎么做到的呢?

1.1 环境变量

我们做格知识准备,先了解一下什么是环境变量。

环境变量就是Window一个命令执行路径:

shell 复制代码
echo %PATH%

C:\Program Files\Java\jdk1.8.0_261\bin;C:\Program Files\Git\bin;C:\Windows\System32;...

上面打印出来的就是环境变量,其中有我们熟悉的java文件执行,Git指令等,当我们在终端执行某一个指令时,其会在这些路径下面寻找是否有对应的可执行文件。有就会执行,没有就报错(错误信息:不是内部或外部命令,也不是可运行的程序或批处理文件)

1.2 npm安装全局指令流程

我们在执行npm install -g @nestjs/cli之后,就可以启动nest全局命令,这是因为在环境变量的路径下创建创建了一个nest文件

shell 复制代码
//可以使用下面这个命令查询Node全局安装指令的位置。
//注意输出的位置,这个位置很重要,下文会经常用到
npm bin -g
// C:\Users\AppData\Roaming\npm

在这个输出的路劲下,可以看到nest文件

这个文件会中有指向具体执行的npm包的位置:/node_modules/@nestjs/cli/bin/nest.js

所以总的执行流程可以感觉到:

输入一个nest指令 -> 在环境变量中寻找 ->找到nest可执行文件 ->执行/node_modules/@nestjs/cli/bin/nest.js 文件

3.package.json里的bin字段

我们来看nestjs包中的package.json,可以发现一个重点:

我们可以注意到与上面指令真正执行的文件是一致的,所以最终执行的是bin/nest.js

上面说的是全局安装包的模式,那如果是还在本地开发的包呢,我们不能每改一点东西就发到线上,然后安装下来再验证吧,这时候就需要使用npm link了

我们使用npm link主要分为两种功能:

  • 一个是这个npm包需要被其他的包引用
  • 一个是这个npm包作为命令行工具直接再终端用指令执行

2.1作为npm包被其他包引用

场景:假设我们有两个包,分别是a和b,b是我们本地在开发的调试包,a是我们的项目,a需要引用到b

这个场景我们分为两步来实现:

  • 在b中使用npm link
  • 在a中使用这个b包

我们在b的目录下执行npm link,这个时候会发现在C:\Users\AppData\Roaming\npm\node_modules目录下会生成一个链接文件,名字就是package.json中的name

当我们在b中执行npm link之后,已经在全局npm包中生成了一个目录,所以我们可以在开发项目的a包中安装b,只要在a包中执行npm link b

这时候我们就在a项目中使用require('b')的时候,会通过项目下的node_module找到b,而这个b文件可以注意到后面的一个箭头,表示这个b文件会引用到实际的b中,有点像网页中的链接一样的感觉

我们现在可以来理一下流程:

😄 总结:当我们在a中执行npm link b命令的时候,系统会去 C:\Users\AppData\Roaming\npm\node_modules 这个目录下寻找有没有b文件(或者链接文件),那么刚好我们在b目录下执行的npm link时会在上面的路径中生成b的链接文件,所以这个命令执行的关系时:a/node_module/b -> C:\Users\AppData\Roaming\npm\node_modules/b -> 真正的b文件

2.2 作为命令行工具需要直接在终端调用

这种功能的实现,一般来说都是命令行工具,脚手架之类的,可以直接在终端输入指令来执行项目主文件,就像nest.js一样,在终端输入nest就会执行nest脚手架项目中的主文件来生成项目框架

我们在a文件中输入node link 会在C:\Users\AppData\Roaming\npm\node_modules 路径下生成a文件的链接,而且还会在外一层的目录生成指令文件 例如:

上面中可以看到,执行npm link命令之后,在package.json中的bin对象下的"a-cmd": "./index.js" 键值被使用,之后我们可以在命令行使用a-cmd命令,而这个命令会去执行index.js文件。

我们接下来看 C:\Users\AppData\Roaming\npm中是什么样子:

从上图可以看到终端中有了像nest指令一样的a-cmd指令,当在终端输入该执行后,会执行index.js文件

成功输出语句

最后

🌼建议: 本文的要结合实操性去理解,希望大家自己手动操作一遍哪些npm link知识点,相信你会收获更多的

😁 笔者会继续更新前端的知识,目前已有两个大专栏,如果感兴趣,不妨关注一下 吧!谢谢 ! 🌱

  • JavaScript小贴士:有关javaScritp中的小的知识点,有点像知识碎片
  • JavaScript进阶指南 :里面是javaScritp中的一个大知识点,例如:原型,this指向,模块,各种类型知识扩展等。
相关推荐
爱吃生蚝的于勒3 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio12 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE14 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻18 分钟前
WPF中的依赖属性
开发语言·wpf
洋24026 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙28 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点29 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
熊的猫37 分钟前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
NoneCoder1 小时前
Java企业级开发系列(1)
java·开发语言·spring·团队开发·开发
苏三有春1 小时前
PyQt5实战——UTF-8编码器功能的实现(六)
开发语言·qt