項目中的 package.json 詳解

package.json.png

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"
}],

authorcontributors 字段的功能類似。它們都是 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 字段徐许,可以既可以記錄它們又可以輕松地重用。

scriptsnpm 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.jsondependencies 字段位于項目的核心认臊,并定義項目所需的外部包圃庭。

在依賴版本中看到的插入符號(^)和波浪號(~)是 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。這意味著任何缺少的逗號遏乔、丟失的引號或其他格式錯誤都將阻止 npmpackage.json 進行交互义矛。如果確實引入了錯誤,則下次運行 npm 命令時將會看到錯誤提示盟萨。建議盡可能使用 npm CLI 更新和管理 package.json凉翻,以避免意外將錯誤引 入package.json 中。

使用 npm init 創(chuàng)建你的 package.json 將有助于確保你生成有效的文件捻激。

最好使用 npm 的命令 npm install 制轰,npm uninstallnpm update 來管理依賴項前计,這樣可以使你的 package.jsonnode_modules/ 文件夾保持同步。如果手動添加依賴項列表的話垃杖,需要你在把依賴項實際安裝到項目之前運行 npm install男杈。

因為 package.json 僅是我們記錄依賴項的位置,而 node_modules/ 文件夾是安裝依賴項代碼的實際位置调俘,所以手動更新 package.json 的依賴項字段不會立即將我們的狀態(tài)反映到 node_modules/ 文件夾伶棒。這就是為什么要用 npm 幫助管理依賴項的原因,因為它會同時更新 package.jsonnode_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)的重要組成部分繁扎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市糊闽,隨后出現(xiàn)的幾起案子梳玫,更是在濱河造成了極大的恐慌,老刑警劉巖右犹,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件提澎,死亡現(xiàn)場離奇詭異,居然都是意外死亡念链,警方通過查閱死者的電腦和手機盼忌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掂墓,“玉大人谦纱,你說我怎么就攤上這事【啵” “怎么了跨嘉?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吃嘿。 經(jīng)常有香客問我祠乃,道長梦重,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任跳纳,我火速辦了婚禮忍饰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寺庄。我一直安慰自己艾蓝,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布斗塘。 她就那樣靜靜地躺著赢织,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馍盟。 梳的紋絲不亂的頭發(fā)上于置,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音贞岭,去河邊找鬼八毯。 笑死,一個胖子當著我的面吹牛瞄桨,可吹牛的內(nèi)容都是我干的话速。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼芯侥,長吁一口氣:“原來是場噩夢啊……” “哼泊交!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柱查,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤廓俭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后唉工,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體研乒,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年酵紫,在試婚紗的時候發(fā)現(xiàn)自己被綠了告嘲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡奖地,死狀恐怖橄唬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情参歹,我是刑警寧澤仰楚,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響僧界,放射性物質(zhì)發(fā)生泄漏侨嘀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一捂襟、第九天 我趴在偏房一處隱蔽的房頂上張望咬腕。 院中可真熱鬧,春花似錦葬荷、人聲如沸涨共。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽举反。三九已至,卻和暖如春扒吁,著一層夾襖步出監(jiān)牢的瞬間火鼻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工雕崩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魁索,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓盼铁,卻偏偏與公主長得像蛾默,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捉貌,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容