2.6.1 npm init
使用 npm init
初始化一個空項目是一個好的習慣强重,即使你對 package.json 及其他屬性非常熟悉,npm init
也是你開始寫新的 Node.js 應用或模塊的一個快捷的辦法佃声。npm init
有智能的默認選項十拣,比如從根目錄名稱推斷模塊名稱,通過 ~/.npmrc
讀取你的信息夭问,用你的 Git 設置來確定 repository 等等缰趋。
2.6.2 npm install
npm install
是我們最常用的 npm 命令之一秘血,因此我們需要好好了解下這個命令。終端輸入 npm install -h
查看使用方式:
可以看出:我們通過 npm install
可以安裝 npm 上發(fā)布的某個版本谋竖、某個tag蓖乘、某個版本區(qū)間的模塊嘉抒,甚至可以安裝本地目錄些侍、壓縮包和 git/github 的庫作為依賴政模。
小提示:
npm i
是npm install
的簡寫耗式,建議使用npm i
。
直接使用 npm i
安裝的模塊是不會寫入 package.json 的 dependencies (或 devDependencies)刊咳,需要額外加個參數(shù):
-
npm i express --save
/npm i express -S
(安裝 express彪见,同時將"express": "^4.14.0"
寫入 dependencies ) -
npm i express --save-dev
/npm i express -D
(安裝 express,同時將"express": "^4.14.0"
寫入 devDependencies ) -
npm i express --save --save-exact
(安裝 express娱挨,同時將"express": "4.14.0"
寫入 dependencies )
第三種方式將固定版本號寫入 dependencies余指,建議線上的 Node.js 應用都采取這種鎖定版本號的方式,因為你不可能保證第三方模塊下個小版本是沒有驗證 bug 的跷坝,即使是很流行的模塊酵镜。拿 Mongoose 來說,Mongoose 4.1.4 引入了一個 bug 導致調用一個文檔 entry 的 remove 會刪除整個集合的文檔,見:https://github.com/Automattic/mongoose/blob/master/History.md#415--2015-09-01吝沫。
后面會介紹更安全的
npm shrinkwrap
的用法。
運行以下命令:
npm config set save-exact true
這樣每次 npm i xxx --save
的時候會鎖定依賴的版本號,相當于加了 --save-exact
參數(shù)经柴。
小提示:
npm config set
命令將配置寫到了 ~/.npmrc 文件,運行npm config list
查看播急。
2.6.3 npm scripts
npm 提供了靈活而強大的 scripts 功能绍些,見 官方文檔。
npm 的 scripts 有一些內置的縮寫命令,如常用的:
-
npm start
等價于npm run start
-
npm test
等價于npm run test
2.6.4 npm shrinkwrap
前面說過要鎖定依賴的版本上沐,但這并不能完全防止意外情況的發(fā)生硫眯,因為鎖定的只是最外一層的依賴净宵,而里層依賴的模塊的 package.json 有可能寫的是 "mongoose": "*"
。為了徹底鎖定依賴的版本,讓你的應用在任何機器上安裝的都是同樣版本的模塊(不管嵌套多少層),通過運行 npm shrinkwrap
,會在當前目錄下產生一個 npm-shrinkwrap.json
呛讲,里面包含了通過 node_modules 計算出的模塊的依賴樹及版本芽偏。上面的截圖也顯示:只要目錄下有 npm-shrinkwrap.json 則運行 npm install
的時候會優(yōu)先使用 npm-shrinkwrap.json 進行安裝,沒有則使用 package.json 進行安裝。
更多閱讀:
注意: 如果 node_modules 下存在某個模塊(如直接通過
npm install xxx
安裝的)而 package.json 中沒有,運行npm shrinkwrap
則會報錯。另外蘑险,npm shrinkwrap
只會生成 dependencies 的依賴,不會生成 devDependencies 的堆缘。