Node 項目在項目根目錄中名為 package.json 的文件中跟蹤依賴關(guān)系和元數(shù)據(jù)翠勉。這是你項目的核心。它包含名稱、描述和版本之類的信息嘁灯,以及運行、開發(fā)以及有選擇地將項目發(fā)布到 NPM 所需的信息够挂。
以下旁仿,我們將:
- 了解 package.json 與項目之間的關(guān)系
- 確定重要字段和元數(shù)據(jù)
- 了解如何管理 package.json
1. 了解 package.json
如果你用過 Node.js,則可能會遇到 package.json 文件孽糖。它是一個 JSON 文件枯冈,位于項目的根目錄中。你的 package.json 包含關(guān)于項目的重要信息办悟。它包含關(guān)于項目的使人類可讀元數(shù)據(jù)(如項目名稱和說明)以及功能元數(shù)據(jù)(如程序包版本號和程序所需的依賴項列表)尘奏。
package.json 示例如下所示:
{
"name": "my-project",
"version": "1.5.0",
"description": "Express server project using compression",
"main": "src/index.js",
"scripts": {
"start": "node index.js",
"dev": "nodemon",
"lint": "eslint **/*.js"
},
"dependencies": {
"express": "^4.16.4",
"compression": "~1.7.4"
},
"devDependencies": {
"eslint": "^5.16.0",
"nodemon": "^1.18.11"
},
"repository": {
"type": "git",
"url": "https://github.com/osiolabs/example.git"
},
"author": "Jon Church",
"contributors": [{
"name": "Amber Matz",
"email": "example@example.com",
"url": "https://www.osiolabs.com/#team"
}],
"keywords": ["server", "osiolabs", "express", "compression"]
}
2. package.json 的用途是什么?
項目的 package.json 是配置和描述如何與程序交互和運行的中心。npm CLI(和 yarn)用它來識別你的項目并了解如何處理項目的依賴關(guān)系病蛉。package.json 文件使 npm 可以啟動你的項目炫加、運行腳本瑰煎、安裝依賴項、發(fā)布到 NPM 注冊表以及許多其他有用的任務(wù)俗孝。npm CLI 也是管理 package.json 的最佳方法酒甸,因為它有助于在項目的整個生命周期內(nèi)生成和更新 package.json 文件。
package.json 會在項目的生命周期中扮演多個角色赋铝,其中某些角色僅適用于發(fā)布到 NPM 的軟件包插勤。即使你沒有把項目發(fā)布到 NPM 注冊表中,或者沒有將其公開發(fā)布給其他人革骨,那么 package.json 對于開發(fā)流程仍然至關(guān)重要农尖。
你的項目還必須包含 package.json,然后才能從 NPM 安裝軟件包良哲。這可能是你在項目中需要它的主要原因之一盛卡。
3. package.json 中的常見字段
讓我們看一下 package.json 中包含的一些最常見和重要的字段,以更好地了解如何使用和管理這個基本文件筑凫。有些用來發(fā)布到 NPM滑沧,而其他一些則可以幫助 npm CLI 運行應(yīng)用程序或安裝依賴項。
實際的字段比我們所介紹的要多漏健,你可以在它的文檔【https://docs.npmjs.com/files/package.json】中了解其余字段嚎货,但以下的是必須要了解的 package.json 屬性。
3.1 name
"name": "my-project"
name 字段定義包的名稱蔫浆。發(fā)布到 NPM 注冊表時殖属,這是軟件包將在其中顯示的名稱。它不能超過 214 個字符瓦盛,只能是小寫字母洗显,并且必須是URL安全的(允許連字符和下劃線,但 URL 中不允許使用空格或其他字符)原环。
如果將軟件包發(fā)布到 NPM挠唆,則 name 屬性是必需的,并且必須是唯一的嘱吗。如果嘗試用 NPM 注冊表上當前已經(jīng)使用的名稱發(fā)布程序包玄组,則會收到錯誤消息。如果你的軟件包并不是要發(fā)布到 NPM 上谒麦,則 name 不必是唯一的俄讹。
3.2 version
"version": "1.5.0",
version 字段對于任何已發(fā)布的軟件包都非常重要,并且在發(fā)布之前是必填的绕德。這是 package.json 描述的軟件的當前版本患膛。
3.3 license
這是非常重要但經(jīng)常被忽略的屬性。license 字段使我們可以定義適用于 package.json 所描述代碼的許可證耻蛇。同樣踪蹬,在將項目發(fā)布到 NPM 注冊表時胞此,這非常重要,因為許可證可能會限制某些開發(fā)人員或組織對軟件的使用跃捣。擁有清晰的許可證有助于明確定義該軟件可以使用的術(shù)語漱牵。
3.4 author 和 contributors
"author": "Jon Church jon@example.com https://www.osioslabs.com/#team",
"contributors": [{
"name": "Amber Matz",
"email": "example@example.com",
"url": "https://www.osiolabs.com/#team"
}],
author
和 contributors
字段的功能類似。它們都是 people
字段枝缔,可以是"Name" 格式的字符串布疙,也可以是具有 name,email愿卸,url 字段的對象。email 和 url 都是可選的截型。
author
只供一個人使用趴荸,contributors
則可以由多個人組成。
這些字段是列出公共項目的聯(lián)系人以及與貢獻者共享信用的有用方法宦焦。
3.5 description
NPM 注冊表將description
字段用于發(fā)布的軟件包发钝,以在搜索結(jié)果中和 npmjs.com 網(wǎng)站上描述該軟件包。
當用戶搜索 NPM 注冊表時波闹,該字符串用于幫助了解軟件包酝豪。這應(yīng)該是軟件包的簡短摘要。
即使你沒有將其發(fā)布到 NPM 注冊表中精堕,它也可以用作項目的簡單文檔孵淘。
3.6 keywords
"keywords": ["server", "osiolabs", "express", "compression"]
keywords
字段是一個字符串數(shù)組,其作用與描述相似歹篓。NPM 注冊表會為該字段建立索引瘫证,能夠在有人搜索軟件包時幫助找到它們。數(shù)組中的每個值都是與你的程序包關(guān)聯(lián)的一個關(guān)鍵字庄撮。
如果你不發(fā)布到 NPM 注冊表背捌,則這個字段用處不大,可以忽略它洞斯。
3.7 main
"main": "src/index.js",
main
字段是 package.json
的功能屬性毡庆。它定義了項目的入口點,通常是用于啟動項目的文件烙如。
如果你的包(例如其名稱為 foo-lib
)是由用戶安裝的么抗,則當用戶執(zhí)行 require('foo-lib')
時,這是 require
返回的 main
字段中所列出的文件的 module.exports
屬性厅翔。
它的值通常是項目根目錄中的 index.js
文件乖坠,但也可以是你選擇作為包的主入口的任何文件。
3.8 scripts
"scripts": {
"start": "node index.js",
"dev": "nodemon"
}
scripts
字段是package.json
中的另一種元數(shù)據(jù)功能刀闷。scripts
屬性接受一個對象熊泵,它的值為可以通過 npm run
運行的腳本仰迁,其鍵為實際運行的命令。這些通常是終端命令顽分,我們把它們放入scripts
字段徐许,可以既可以記錄它們又可以輕松地重用。
scripts
是 npm CLI
用來運行項目任務(wù)的強大工具卒蘸。他們可以完成開發(fā)過程中的大多數(shù)任務(wù)雌隅。了解有關(guān) npm 腳本的更多信息【https://heynode.com/tutorial/what-are-npm-scripts】。
3.9 repository
"repository": {
"type": "git",
"url": "https://github.com/osiolabs/example.git"
}
這是 package.json
中最重要的字段之一缸沃,它列出了項目使用的所有依賴項(項目所依賴的外部代碼)恰起。使用 npm CLI
安裝軟件包時,它將下載到你的 node_modules/
文件夾中趾牧,并將一個條目添加到你的依賴項屬性中检盼,注意軟件包的名稱和已安裝的版本。
dependencies
字段是一個對象翘单,其中的包名做為鍵吨枉,而版本或版本范圍為值。從這個列表中哄芜,當在目錄中運行 npm install
時貌亭,npm
知道要獲取和安裝哪些包(以及什么版本)。package.json
的 dependencies
字段位于項目的核心认臊,并定義項目所需的外部包圃庭。
在依賴版本中看到的插入符號(^
)和波浪號(~
)是 SemVer 中定義的版本范圍的表示法。
3.10 devDependencies
"devDependencies": {
"nodemon": "^1.18.11"
}
與 dependencies
字段類似美尸,但是這里列出的包僅在開發(fā)期間需要冤议,而在生產(chǎn)中不需要。
devDependency
是記錄開發(fā)過程中程序需要哪些工具的好方法师坎。要將 npm
的軟件包作為 devDependency
安裝恕酸,可以運行 npm install --save-dev
。
devDependencies
屬性的另一種用途是在我們的 npm
腳本中使用它們胯陋。了解有關(guān)在npm
腳本中使用 devDependencies
的更多信息【https://heynode.com/tutorial/what-are-npm-scripts】蕊温。
4.管理 package.json
package.json
文件必須是有效的 JSON
。這意味著任何缺少的逗號遏乔、丟失的引號或其他格式錯誤都將阻止 npm
與 package.json
進行交互义矛。如果確實引入了錯誤,則下次運行 npm
命令時將會看到錯誤提示盟萨。建議盡可能使用 npm CLI
更新和管理 package.json
凉翻,以避免意外將錯誤引 入package.json
中。
使用 npm init
創(chuàng)建你的 package.json
將有助于確保你生成有效的文件捻激。
最好使用 npm
的命令 npm install
制轰,npm uninstall
和 npm update
來管理依賴項前计,這樣可以使你的 package.json
和 node_modules/
文件夾保持同步。如果手動添加依賴項列表的話垃杖,需要你在把依賴項實際安裝到項目之前運行 npm install
男杈。
因為 package.json
僅是我們記錄依賴項的位置,而 node_modules/
文件夾是安裝依賴項代碼的實際位置调俘,所以手動更新 package.json
的依賴項字段不會立即將我們的狀態(tài)反映到 node_modules/
文件夾伶棒。這就是為什么要用 npm
幫助管理依賴項的原因,因為它會同時更新 package.json
和 node_modules/
文件夾彩库。
你當然可以在文本編輯器中手動編輯 package.json
并進行更改肤无,只要你注意不要引入任何 JSON
格式錯誤,這對大多數(shù)字段都適用骇钦。但是我建議你盡可能使用 npm CLI
命令舅锄。
5.總結(jié)
package.json 文件是 Node 項目的核心。它記錄了有關(guān)發(fā)布到 NPM 之前所需要的項目的重要元數(shù)據(jù)司忱,它還定義了 npm 用于安裝依賴項、運行腳本以及標識包的入口點的項目功能屬性畴蹭。
并非 package.json 中所有字段都適用于你坦仍,但是我們可以通過其在 package.json 文件中記錄有關(guān)程序的信息來獲得一些強大的好處。了解 package.json 的角色以及它與 npm 的關(guān)系是開發(fā) Node.js 應(yīng)用的重要組成部分叨襟,并且正日益成為 JavaScript 生態(tài)系統(tǒng)的重要組成部分繁扎。