前言
感覺這塊也是一個知識點,雖然我現在還不能系統的用xmind總結每個知識點的串聯關係,但是隻能看一個記一個了
package.json是什麼
我個人理解,package.json是描述包,管理包的一個信息json文件,給npm用的,比如你可以寫一個包,發到npm,那這個json就是記錄這個包的信息,或者對用vue腳手架開發的項目而言,它就是管理包的文件,npm install會讀這個文件的denp配置包信息然後下載
package.json 如何產生的
用npm init初始化,一路回車,這裏説一句,npm init,這句話,我們是用shell窗口輸入的,就是在這種
要知道,這個窗口裏面的指令,其實執行的是shell指令,也就是説,npm init,打下去後,它內部跑了一個sehll的指令,這個指令調用系統創建文本的指令,然後巴拉巴拉,最後輸出到本文件夾。
dependenices和devDependenices
這兩個字段,從始至終,我只知道,dependenices的依賴包是本地,線上開發都需要,比如UI框架,而devDependenices的依賴包,只是本地開發才需要,比如eslint;
(1)什麼叫本地需要,線上開發需要?
我的理解啊,就是npm run dev的時候,這兩個字段的依賴包全部都會加載,而npm run build的時候,devDependenices的依賴包不會打包進去,從而減少了整個包的體積,訪問更快一點
(2)鎖版本
我今天才知道,原來安裝依賴的時候,把包前面的倒三角刪掉,版本就鎖定了
那麼這樣做有什麼用呢??
你的同事,拉代碼,跑npm install的時候,如果依賴包前面帶倒三角,它其實是默認拉最新的包,如果它跑完了,代碼一推,這個package.json被更新了,重點來了!
依賴A版本是1.0,它匹配依賴B版本是1.0,後面依賴B更新了2.0,你安裝依賴的 時候,A還是1,但是B被你更新變成2了,結果就報錯了
(3)指令
// 安裝最新到dependenices(默認)
npm i xxxxx
// 安裝最新到dependenices
npm i xxxxx -S
// 安裝指定版本到dependenices
npm i xxxxx@2.0.0
// 安裝最新到devDependenices
npm i xxxxx -D
bin
在介紹這個字段之前,先來舉一個例子,
大家在新的電腦安裝環境的時候,裝那個node的時候,如果那個node安裝後,沒有配置PATH(環境變量地址),在shell窗口輸入node -v的時候,會報錯説找不到,配了path後,其實就是把安裝目錄路徑填進去,就可以
好了説完上面那個之後,回到這個bin,這個bin字段的作用其實也類似。
在我們的依賴包裏,比如gulp,有這個bin字段配置
一旦有這個配置,那麼其實我們裝npm i gulp的時候,它會讀取到這個字段,並且,會寫一份文件到node_modules下的.bin文件夾(這個文件夾的由來就是這樣)
然後呢,當我們npm run dev的時候,都知道,這句代碼,其實跑的是scripts那裏的
gulp dev-local,問題來了,gulp我沒有全局安裝,PATH我沒有配,為什麼這樣跑不會報錯!!!
答案就是,下面我引入大佬文章的一段解釋
(1) 我們每次在運行 scripts 中的一個屬性時候(npm run),實際系統都會自動新建一個shell(一般是Bash),在這個shell裏面執行指定的腳本命令。因此 凡是能在 shell 中允許的腳本,都可以寫在npm scripts中。
(2) 特別的點,npm run 新建的 shell,會在當前目錄的 node_modules/.bin 子目錄加入到 PATH 變量,執行結束後,再將 PATH 變量恢復原樣。也就是説,當前項目目錄 node——modules/.bin 子目錄中所有的腳本,都可以直接用腳本名稱調用,不需要增加路徑.(簡單總結:通過 npm 啓動的腳本,會默認把 node_modules/.bin 加到 PATH 環境變量中。)
比如本來我們應該要這樣寫的
"scripts": {
"dev": "./node_modules/.bin/gulp dev-local",
"server": "gulp dev-local",
"build": "gulp deploy && gulp dev-server"
},
但是有這個機制在,就可以
"scripts": {
"dev": "gulp dev-local",
"server": "gulp dev-local",
"build": "gulp deploy && gulp dev-server"
},
大家也可以聯想到webpack,webpack我沒有全局安裝,為什麼用依賴的形式安裝webpack卻可以執行,一樣的道理
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "node build/build.js"
},
未完待續
資料參考這位大佬
【Node進階】你應該知道的NPM知識都在這!