?? 作者簡介:一名大四的學(xué)生,致力學(xué)習(xí)前端開發(fā)技術(shù)
??個人主頁:夜宵餑餑的主頁
? 系列專欄:NodeJs
??學(xué)習(xí)格言:成功不是終點,失敗也并非末日,最重要的是繼續(xù)前進(jìn)的勇氣
????前言:
本文是關(guān)于Node命令中的npm link命令的詳細(xì)使用,還有腳手架的背后原理,如果我們需要開發(fā)命令行工具或者腳手架時,npm link的使用是必不可少的一環(huán),有關(guān)環(huán)境變量部分大家一定要好好理解,希望可以幫助到大家,歡迎大家的補充和糾正
Node命令
1.CLI全局命令
當(dāng)我們安裝一個npm包之后,我們可以再電腦的任意終端使用這個npm包提供的指令,例如:當(dāng)我們安裝了nest npm install -g @nestjs/cli
,我們就可以在任意地方使用nest這個指令,例如:
nest new my-nest-project
,就會幫我們創(chuàng)建一個名字叫 my-nest-project的nest項目,這是怎么做到的呢?
1.1 環(huán)境變量
我們做格知識準(zhǔn)備,先了解一下什么是環(huán)境變量。
環(huán)境變量就是Window一個命令執(zhí)行路徑:
echo %PATH%
C:\Program Files\Java\jdk1.8.0_261\bin;C:\Program Files\Git\bin;C:\Windows\System32;...
上面打印出來的就是環(huán)境變量,其中有我們熟悉的java文件執(zhí)行,Git指令等,當(dāng)我們在終端執(zhí)行某一個指令時,其會在這些路徑下面尋找是否有對應(yīng)的可執(zhí)行文件。有就會執(zhí)行,沒有就報錯(錯誤信息:不是內(nèi)部或外部命令,也不是可運行的程序或批處理文件)
1.2 npm安裝全局指令流程
我們在執(zhí)行npm install -g @nestjs/cli
之后,就可以啟動nest全局命令,這是因為在環(huán)境變量的路徑下創(chuàng)建創(chuàng)建了一個nest文件
//可以使用下面這個命令查詢Node全局安裝指令的位置。
//注意輸出的位置,這個位置很重要,下文會經(jīng)常用到
npm bin -g
// C:\Users\AppData\Roaming\npm
在這個輸出的路勁下,可以看到nest文件
這個文件會中有指向具體執(zhí)行的npm包的位置:/node_modules/@nestjs/cli/bin/nest.js
所以總的執(zhí)行流程可以感覺到:
輸入一個nest指令 -> 在環(huán)境變量中尋找 ->找到nest可執(zhí)行文件 ->執(zhí)行/node_modules/@nestjs/cli/bin/nest.js
文件
3.package.json里的bin字段
我們來看nestjs包中的package.json,可以發(fā)現(xiàn)一個重點:
我們可以注意到與上面指令真正執(zhí)行的文件是一致的,所以最終執(zhí)行的是bin/nest.js
2.npm link
上面說的是全局安裝包的模式,那如果是還在本地開發(fā)的包呢,我們不能每改一點東西就發(fā)到線上,然后安裝下來再驗證吧,這時候就需要使用npm link了
我們使用npm link主要分為兩種功能:
- 一個是這個npm包需要被其他的包引用
- 一個是這個npm包作為命令行工具直接再終端用指令執(zhí)行
2.1作為npm包被其他包引用
場景:假設(shè)我們有兩個包,分別是a和b,b是我們本地在開發(fā)的調(diào)試包,a是我們的項目,a需要引用到b
這個場景我們分為兩步來實現(xiàn):
- 在b中使用npm link
- 在a中使用這個b包
在開發(fā)調(diào)試的包中執(zhí)行npm link
我們在b的目錄下執(zhí)行npm link,這個時候會發(fā)現(xiàn)在C:\Users\AppData\Roaming\npm\node_modules
目錄下會生成一個鏈接文件,名字就是package.json
中的name
在項目中執(zhí)行npm link
當(dāng)我們在b中執(zhí)行npm link之后,已經(jīng)在全局npm包中生成了一個目錄,所以我們可以在開發(fā)項目的a包中安裝b,只要在a包中執(zhí)行npm link b
這時候我們就在a項目中使用require('b')
的時候,會通過項目下的node_module找到b,而這個b文件可以注意到后面的一個箭頭,表示這個b文件會引用到實際的b中,有點像網(wǎng)頁中的鏈接一樣的感覺
我們現(xiàn)在可以來理一下流程:
?? 總結(jié):當(dāng)我們在a中執(zhí)行npm link b命令的時候,系統(tǒng)會去 C:\Users\AppData\Roaming\npm\node_modules
這個目錄下尋找有沒有b文件(或者鏈接文件),那么剛好我們在b目錄下執(zhí)行的npm link時會在上面的路徑中生成b的鏈接文件,所以這個命令執(zhí)行的關(guān)系時:a/node_module/b -> C:\Users\AppData\Roaming\npm\node_modules/b -> 真正的b文件
2.2 作為命令行工具需要直接在終端調(diào)用
這種功能的實現(xiàn),一般來說都是命令行工具,腳手架之類的,可以直接在終端輸入指令來執(zhí)行項目主文件,就像nest.js一樣,在終端輸入nest
就會執(zhí)行nest腳手架項目中的主文件來生成項目框架
我們在a文件中輸入node link
會在C:\Users\AppData\Roaming\npm\node_modules
路徑下生成a文件的鏈接,而且還會在外一層的目錄生成指令文件 例如:
上面中可以看到,執(zhí)行npm link
命令之后,在package.json
中的bin
對象下的"a-cmd": "./index.js"
鍵值被使用,之后我們可以在命令行使用a-cmd
命令,而這個命令會去執(zhí)行index.js
文件。
我們接下來看 C:\Users\AppData\Roaming\npm
中是什么樣子:
從上圖可以看到終端中有了像nest
指令一樣的a-cmd
指令,當(dāng)在終端輸入該執(zhí)行后,會執(zhí)行index.js
文件
成功輸出語句
最后
??建議: 本文的要結(jié)合實操性去理解,希望大家自己手動操作一遍哪些npm link知識點,相信你會收獲更多的文章來源:http://www.zghlxwxcb.cn/news/detail-792769.html
?? 筆者會繼續(xù)更新前端的知識,目前已有兩個大專欄,如果感興趣,不妨關(guān)注一下吧!謝謝 ! ??文章來源地址http://www.zghlxwxcb.cn/news/detail-792769.html
- JavaScript小貼士:有關(guān)javaScritp中的小的知識點,有點像知識碎片
- JavaScript進(jìn)階指南 :里面是javaScritp中的一個大知識點,例如:原型,this指向,模塊,各種類型知識擴(kuò)展等。
到了這里,關(guān)于【npm link】Node命令中的npm link命令的使用,還有CLI全局命令的使用,開發(fā)命令行工具必不可少的部分的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!