十二月一號,還有一個月就2020年了,親愛的小伙伴你們還好么,這一年過得是否很充實,進步是否很多啊,我想大家都在忙着長大,忙着工作,忙着各種人情世故,但是我希望可愛的你可以靜下心來再好好的打磨自己,我們這一代年輕人(包括筆者我也是)都很急躁,恨不得馬上成功?亦或是短期成為一個很優秀的人,但是有些東西是急不得,需要沉下來仔細規划,不負韶華,想要的東西我相信遲早有一天會到來!我們還很年輕,但是這個世界卻慢慢的把我們的棱角都磨平了,我們很氣憤但是卻又無奈的只能接受,今天是個周日,我一大早也來了公司,感覺世界也挺美的,周末的生活氣息相對於忙碌的工作日濃厚了許多,靜下來去享受生活。2019做最棒的自己!
Node 項目在項目根目錄中名為 package.json 的文件中跟蹤依賴關系和元數據。這是你項目的核心。它包含名稱、描述和版本之類的信息,以及運行、開發以及有選擇地將項目發布到 NPM 所需的信息。
在本教程中,我們將:
- 了解 package.json 與項目之間的關系
- 確定重要字段和元數據
- 了解如何管理 package.json
目標
了解什么是 package.json 文件,它與你項目的關系以及需要了解的常見屬性。
了解 package.json
如果你以前用過 Node.js,則可能會遇到 package.json 文件。它是一個 JSON 文件,位於項目的根目錄中。你的 package.json 包含關於項目的重要信息。它包含關於項目的使人類可讀元數據(如項目名稱和說明)以及功能元數據(如程序包版本號和程序所需的依賴項列表)。
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"] } 復制代碼
package.json 的用途是什么?
項目的 package.json 是配置和描述如何與程序交互和運行的中心。 npm CLI(和 yarn)用它來識別你的項目並了解如何處理項目的依賴關系。package.json 文件使 npm 可以啟動你的項目、運行腳本、安裝依賴項、發布到 NPM 注冊表以及許多其他有用的任務。 npm CLI 也是管理 package.json 的最佳方法,因為它有助於在項目的整個生命周期內生成和更新 package.json 文件。
package.json 會在項目的生命周期中扮演多個角色,其中某些角色僅適用於發布到 NPM 的軟件包。即使你沒有把項目發布到 NPM 注冊表中,或者沒有將其公開發布給其他人,那么 package.json 對於開發流程仍然至關重要。
你的項目還必須包含 package.json,然后才能從 NPM 安裝軟件包。這可能是你在項目中需要它的主要原因之一。
package.json 中的常見字段
讓我們看一下 package.json 中包含的一些最常見和重要的字段,以更好地了解如何使用和管理這個基本文件。有些用來發布到 NPM,而其他一些則可以幫助 npm CLI 運行應用程序或安裝依賴項。
實際的字段比我們所介紹的要多,你可以在它的文檔中了解其余字段,但以下的是必須要了解的 package.json 屬性。
name
"name": "my-project"
復制代碼
name
字段定義包的名稱。發布到 NPM 注冊表時,這是軟件包將在其中顯示的名稱。它不能超過 214 個字符,只能是小寫字母,並且必須是URL安全的(允許連字符和下划線,但 URL 中不允許使用空格或其他字符)。
如果將軟件包發布到 NPM,則 name
屬性是必需的,並且必須是唯一的。如果嘗試用 NPM 注冊表上當前已經使用的名稱發布程序包,則會收到錯誤消息。如果你的軟件包並不是要發布到 NPM 上,則 name
不必是唯一的。
version
"version": "1.5.0",
復制代碼
version
字段對於任何已發布的軟件包都非常重要,並且在發布之前是必填的。這是 package.json 描述的軟件的當前版本。
你不需要使用 SemVer,但它是 Node.js 生態系統中使用的標准,強烈建議使用。對於未發布的程序包,此屬性不是嚴格要求的。通常在將新版本發布到 NPM 之前,根據 SemVer,版本號會增加。當不依賴程序包作為依賴項或未將程序包發布到 NPM 時,通常不使用這個工作流程。但是如果將軟件包用作依賴項,那么確保 version
字段保持最新非常重要,這樣可以確保其他人所使用的軟件包的正確版本。 了解有關語義版本控制(semantic versioning)的更多信息。
license
這是非常重要但經常被忽略的屬性。license
字段使我們可以定義適用於 package.json 所描述代碼的許可證。同樣,在將項目發布到 NPM 注冊表時,這非常重要,因為許可證可能會限制某些開發人員或組織對軟件的使用。擁有清晰的許可證有助於明確定義該軟件可以使用的術語。
license
字段的值通常是許可證的標識符代碼——例如 MIT
或 ISC
之類的字符串,它們代表MIT 許可證和 ISC 許可證。如果你不想提供許可證,或者明確不想授予使用私有或未發布的軟件包的權限,則可以將 UNLICENSED
作為許可證。如果你不確定要使用哪個許可證, Choose a License 是對你有用的資源。
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
則可以由多個人組成。
這些字段是列出公共項目的聯系人以及與貢獻者共享信用的有用方法。
description
NPM 注冊表將description
字段用於發布的軟件包,以在搜索結果中和 npmjs.com 網站上描述該軟件包。
當用戶搜索 NPM 注冊表時,該字符串用於幫助了解軟件包。這應該是軟件包的簡短摘要。
即使你沒有將其發布到 NPM 注冊表中,它也可以用作項目的簡單文檔。
keywords
"keywords": ["server", "osiolabs", "express", "compression"]
復制代碼
keywords
字段是一個字符串數組,其作用與描述相似。 NPM 注冊表會為該字段建立索引,能夠在有人搜索軟件包時幫助找到它們。數組中的每個值都是與你的程序包關聯的一個關鍵字。
如果你不發布到 NPM 注冊表,則這個字段用處不大,可以忽略它。
main
"main": "src/index.js",
復制代碼
main
字段是 package.json 的功能屬性。它定義了項目的入口點,通常是用於啟動項目的文件。
如果你的包(例如其名稱為 foo-lib
)是由用戶安裝的,則當用戶執行 require('foo-lib')
時,這是 require 返回的 main
字段中所列出的文件的 module.exports
屬性。
它的值通常是項目根目錄中的 index.js 文件,但也可以是你選擇作為包的主入口的任何文件。
scripts
"scripts": {
"start": "node index.js",
"dev": "nodemon"
}
復制代碼
scripts
字段是 package.json 中的另一種元數據功能。scripts
屬性接受一個對象,它的值為可以通過 npm run
運行的腳本,其鍵為實際運行的命令。這些通常是終端命令,我們把它們放入 scripts
字段,可以既可以記錄它們又可以輕松地重用。
scripts
是 npm CLI 用來運行項目任務的強大工具。他們可以完成開發過程中的大多數任務。 了解有關 npm 腳本的更多信息。
repository
"repository": {
"type": "git",
"url": "https://github.com/osiolabs/example.git"
}
復制代碼
你可以通過提供 repository
字段來記錄項目代碼所在的資源庫。該字段是一個對象,用於定義源代碼所在的 url 及其使用的版本控制系統的類型。對於開源項目,可能是以 Git 作為版本控制系統的 GitHub 或 Bitbucket 。
需要注意的是 URL 字段的本意是指向可從中訪問版本控制的位置,而不僅僅是指向已發布的代碼庫。
dependencies
"dependencies": {
"express": "^4.16.4",
"compression": "~1.7.4"
}
復制代碼
這是 package.json 中最重要的字段之一,它列出了項目使用的所有依賴項(項目所依賴的外部代碼)。使用 npm CLI 安裝軟件包時,它將下載到你的 node_modules/ 文件夾中,並將一個條目添加到你的依賴項屬性中,注意軟件包的名稱和已安裝的版本。
dependencies
字段是一個對象,其中的包名做為鍵,而版本或版本范圍為值。從這個列表中,當在目錄中運行 npm install
時,npm 知道要獲取和安裝哪些包(以及什么版本)。 package.json 的 dependencies
字段位於項目的核心,並定義項目所需的外部包。
在依賴版本中看到的插入符號(^
)和波浪號(~
)是 SemVer 中定義的版本范圍的表示法。 了解有關依賴版本和 SemVer 的更多信息。
devDependencies
"devDependencies": {
"nodemon": "^1.18.11"
}
復制代碼
與 dependencies
字段類似,但是這里列出的包僅在開發期間需要,而在生產中不需要。
例如,在開發過程中使用工具重新加載項目,比如 nodemon
,一旦程序部署並投入生產,將不會再使用它。devDependencies
屬性使我們可以明確地指出生產中不需要哪些依賴項。在生產環境中安裝應用程序時,可以用 npm install --production
僅安裝 package.json 的 dependency
字段中列出的內容。
devDependency 是記錄開發過程中程序需要哪些工具的好方法。要將 npm 的軟件包作為 devDependency 安裝,可以運行 npm install --save-dev
。
devDependencies
屬性的另一種用途是在我們的 npm 腳本中使用它們。 了解有關在npm腳本中使用 devDependencies
的更多信息。
管理你的 package.json
package.json 文件必須是有效的 JSON。這意味着任何缺少的逗號、丟失的引號或其他格式錯誤都將阻止 npm 與 package.json 進行交互。如果確實引入了錯誤,則下次運行 npm 命令時將會看到錯誤提示。建議盡可能使用 npm CLI 更新和管理 package.json,以避免意外將錯誤引 入package.json 中。
使用 npm init
創建你的 package.json 將有助於確保你生成有效的文件。
最好使用 npm 的命令 npm install
,npm uninstall
和 npm update
來管理依賴項,這樣可以使你的 package.json 和 node_modules/ 文件夾保持同步。如果手動添加依賴項列表的話,需要你在把依賴項實際安裝到項目之前運行 npm install
。
因為 package.json 僅是我們記錄依賴項的位置,而 node_modules/ 文件夾是安裝依賴項代碼的實際位置,所以手動更新 package.json 的依賴項字段不會立即將我們的狀態反映到 node_modules/ 文件夾。這就是為什么要用 npm 幫助管理依賴項的原因,因為它會同時更新 package.json 和 node_modules/ 文件夾。
你當然可以在文本編輯器中手動編輯 package.json 並進行更改,只要你注意不要引入任何 JSON 格式錯誤,這對大多數字段都適用。但是我建議你盡可能使用 npm CLI 命令。
總結
package.json 文件是 Node 項目的核心。它記錄了有關發布到 NPM 之前所需要的項目的重要元數據,它還定義了 npm 用於安裝依賴項、運行腳本以及標識包的入口點的項目功能屬性。
並非 package.json 中所有字段都適用於你,但是我們可以通過其在 package.json 文件中記錄有關程序的信息來獲得一些強大的好處。了解 package.json 的角色以及它與 npm 的關系是開發 Node.js 應用的重要組成部分,並且正日益成為 JavaScript 生態系統的重要組成部分。
進一步了解
- 你還可以使用什么其他格式提供存儲庫?(docs.npmjs.com)
- 如何在你的 package.json 中添加
private
字段影響發布到NPM?(docs.npmjs.com )
其他資源
- npm-package.json:npm 的 package.json 處理細節(docs.npmjs.com)
- 選擇開源許可證(choosealicense.com)
作者:前端先鋒
鏈接:https://juejin.im/post/5ddf97986fb9a071ac1a0b09
來源:掘金