npm是前端開發(fā)人員廣泛使用的包管理工具蜕青,項目中通過package.json來管理項目中所依賴的npm包的配置。package.json就是一個json文件沪袭,除了能夠描述項目的包依賴外叫倍,允許我們使用“語義化版本規(guī)則”指明你項目依賴包的版本枣抱,讓你的構(gòu)建更好地與其他開發(fā)者分享布疙,便于重復(fù)使用蚊惯。
1、package.json簡介
通過 npm init 初始化一個項目灵临,會生成3個目錄/文件拣挪, node_modules, package.json和 package.lock.json。其中package-lock.json文件是為了鎖版本俱诸。
2、package.json常用屬性
1)name
name是項目的名稱赊舶,命名規(guī)范:
名稱的長度必須小于或等于214個字符睁搭,不能以“.”和“_”開頭赶诊,不能包含大寫字母;
名稱可以作為參數(shù)被傳入require("")园骆,用來導(dǎo)入模塊舔痪,所以應(yīng)當(dāng)盡可能的簡短、語義化锌唾;
名稱不能和其他模塊的名稱重復(fù)锄码,可以使用npm view命令查詢模塊明是否重復(fù),如果不重復(fù)就會提示404晌涕。
2)version
version字段表示該項目包的版本號滋捶。
版本號的使用規(guī)范如下:
版本號的命名遵循語義化版本2.0.0規(guī)范,格式為:主版本號.次版本號.修訂號余黎,通常情況下重窟,修改主版本號是做了大的功能性的改動,修改次版本號是新增了新功能惧财,修改修訂號就是修復(fù)了一些bug巡扇;
如果某個版本的改動較大,并且不穩(wěn)定垮衷,可能如法滿足預(yù)期的兼容性需求厅翔,就需要發(fā)布先行版本,先行版本通過會加在版本號的后面搀突,通過“-”號連接以點分隔的標(biāo)識符和版本編譯信息:內(nèi)部版本(alpha)刀闷、公測版本(beta)和候選版本(rc,即release candiate)描姚。
3)description
description字段用來描述這個項目包涩赢。
4)keywords
keywords字段是一個字符串?dāng)?shù)組,表示這個項目包的關(guān)鍵詞轩勘。和description一樣筒扒,都是用來增加項目包的曝光率的。
5)author
author顧名思義就是作者绊寻,表示該項目包的作者花墩。它有兩種形式,一種是字符串格式:
另一種是對象形式:
6)dependencies
dependencies字段中聲明的是項目的生產(chǎn)環(huán)境中所必須的依賴包澄步。使用 npm 或 yarn 安裝npm包時冰蘑,該npm包會被自動插入到此配置項中:
當(dāng)在安裝依賴時使用--save參數(shù),也會將新安裝的npm包寫入dependencies屬性村缸。
該字段的值是一個對象祠肥,該對象的各個成員,分別由模塊名和對應(yīng)的版本要求組成梯皿,表示依賴的模塊及其版本范圍仇箱。
"dependencies": {
? ? "@baidu/san-native-cli": "1.10.14",
? ? "@baidu/talos-san-native": "1.3.125",
? ? "axios": "0.21.1",
? ? "lodash": "^4.17.15",
? ? "san-store": "2.1.3",
? ? "san-update": "2.1.0",
? },
下面三個版本號在安裝的時候代表不同的含義:
??????? "4.17.15" 表示安裝指定的4.17.15版本
??????? "~4.17.15" 表示安裝4.17.X中的最新版本
??????? "^4.17.15" 表示安裝4.X.X中的最新版本
7)devDependencies
devDependencies中聲明的是開發(fā)階段需要的依賴包县恕,如Webpack、Eslint剂桥、Babel等忠烛,用于輔助開發(fā)。它們不同于 dependencies权逗,因為它們只需安裝在開發(fā)設(shè)備上美尸,而無需在生產(chǎn)環(huán)境中運行代碼。
當(dāng)打包上線時并不需要這些包斟薇,可以使用 npm install --save-dev <PACKAGENAME> 這些依賴添加到 devDependencies 中师坎,這些依賴依然會在本地指定 npm install 時被安裝和管理,但是不會被安裝到生產(chǎn)環(huán)境中奔垦。
8)scripts
scripts 是 package.json中內(nèi)置的腳本入口屹耐,是key-value鍵值對配置,key為可運行的命令椿猎,可以通過 npm run 來執(zhí)行命令惶岭。除了運行基本的scripts命令,還可以結(jié)合pre和post完成前置和后續(xù)操作犯眠。
"scripts": {
? ? "dev": "node index.js",
? ? "predev": "node beforeIndex.js",
? ? "postdev": "node afterIndex.js"
}
9)main?& module & browser
main按灶,module和browser 3個字段來定義npm包的入口文件。
main : 定義了 npm 包的入口文件筐咧,browser 環(huán)境和 node 環(huán)境均可使用鸯旁。
module : 定義 npm 包的 ESM 規(guī)范的入口文件,browser 環(huán)境和 node - 環(huán)境均可使用量蕊。
browser : 定義 npm 包在 browser 環(huán)境下的入口文件铺罢。
10)module
module字段可以定義 npm 包的 ESM 規(guī)范的入口文件。
11)config
config字段用來配置scripts運行時的配置參數(shù)残炮。
3韭赘、npm和yarn的區(qū)別
npm 是 Node.js 的包管理工具;npm 通過 Node.js 模塊根目錄的 package.json 文件獲取模塊元數(shù)據(jù)和依賴關(guān)系等势就。
npm 有以下問題:
1.速度慢:npm 按照隊列執(zhí)行安裝每個 package泉瞻,只有當(dāng)前 package 安裝完成之后,才會進行后面的安裝苞冯。
2.同一個項目袖牙,npm 安裝的時候無法保持一致性,由于 package.json 文件中版本號的特點舅锄。
yarn的優(yōu)點:
速度快鞭达、并行安裝:npm是按照隊列執(zhí)行每一個包,也就是必須等到當(dāng)前包安裝完成之后才能繼續(xù)后面的安裝。而yarn是并行執(zhí)行所有任務(wù)碉怔,提高了性能烘贴。
離線模式:如果之前已經(jīng)安裝過一個軟件包,用yarn再次安裝時會從緩存中獲取撮胧,就不用像npm那樣再從網(wǎng)絡(luò)下載了。
安裝版本統(tǒng)一老翘。