package/module
包就是一個有單個或多個文件的目錄,其中有個文件package.json帶有這個包的元信息
一般有三種類型的包
- server端nodejs工程使用的各種模塊
- 供命令行使用的各種功能命令支持
- 前端工程使用的各種模塊
安裝方式
- local:一般是作為項(xiàng)目工程代碼引用的模塊時
- global:一般是作為命令行工具使用時,全局的npm包安裝在C:\User<username>\AppData\Roaming\npm目錄下
安裝
npm install命令會在當(dāng)前目錄創(chuàng)建node_modules目錄,然后把包下載到這個目錄下
如果當(dāng)前目錄下沒有package.json文件,那么會安裝最新版本的包;如果存在,則按照文件里指定的版本規(guī)則來下載匹配規(guī)則的最高版本的包
一般來說,包的首次安裝才使用install,后續(xù)的版本更新應(yīng)該使用update;如果是對已安裝包的再次install,那么可以認(rèn)為是先進(jìn)行一次uninstall在install的行為
package.json
name和version字段是必須的,其他都是可選的;
dependencies字段指production構(gòu)建引用的包;
devDependencies字段指只在開發(fā)和測試階段引用的包;
dependencies和devDependencies兩個字段里依賴包除了使用版本規(guī)則外,還可以使用本地路徑來引用本地的包
dist-tags
為了組織和標(biāo)記不同版本的包(比如穩(wěn)定版和開發(fā)版,完整版和精簡版等等),使用了dist-tags的概念,有點(diǎn)類似版本管理的不同分支的理念。
默認(rèn)情況下發(fā)布的包會使用latest標(biāo)記,而使用npm install <包名>來安裝的話,會默認(rèn)使用latest標(biāo)記;如果需要指定標(biāo)記的話,可以使用 npm install <包名>@<tag>這樣的形式
包和模塊
包(Package):一個包含有通過package.json文件描述的程序的目錄
另外,其他的衍生形式,如對這個目錄進(jìn)行壓縮或打包后的文件,或指向這個文件的鏈接等等這些也都屬于包的概念范疇,因?yàn)樽罱K這些衍生形式都能歸結(jié)到上述定義中
模塊(Module):能夠通過require函數(shù)被node.js程序加載的東西,它可能以下面的形式呈現(xiàn):
- 存在package.json文件的目錄,且package.json文件存在main字段
- 帶有index.js文件的目錄
- 一個JavaScript文件
所以大部分情況下,包都會是一個模塊,但是包不一定必須是一個模塊!
依賴
npm3的依賴包很有可能本身也依賴著其他包,這就帶來同個包的不同版本被不同的依賴包所依賴的問題,npm2是通過每個依賴包的依賴又存放在自己的node_module目錄下這種嵌套方式來解決的,而npm3則改進(jìn)了一下,按照安裝順序,首個被安裝的二次依賴包會平放在頂級的node_module目錄下,后續(xù)的不同版本二次依賴包則沿用npm2的嵌套方式解決;
因?yàn)閚pm3的這種依賴解決方式導(dǎo)致其依賴樹的形狀是與安裝順序有關(guān)的,所以同樣的package.json文件因?yàn)樵诓煌瑱C(jī)器下會有依賴樹形狀不一樣的情況(但是不會影響具體的構(gòu)建),這也是npm3所說的node_module或依賴樹的不確定性;如果真的需要保持大家的依賴樹一致,那可以在每次package.json改動后,刪除node_module目錄,然后重新install;