package.json詳解

  十二月一號,還有一個月就2020年了,親愛的小夥伴大家還好麼,這一年過得是否很充實,進步是否不少啊,我想你們都在忙着長大,忙着工做,忙着各類人情世故,可是我但願可愛的你能夠靜下心來再好好的打磨本身,咱們這一代年輕人(包括筆者我也是)都很急躁,巴不得立刻成功?亦或是短時間成爲一個很優秀的人,可是有些東西是急不得,須要沉下來仔細規劃,不負韶華,想要的東西我相信早晚有一天會到來!咱們還很年輕,可是這個世界卻慢慢的把咱們的棱角都磨平了,咱們很氣憤可是卻又無奈的只能接受,今天是個週日,我一大早也來了公司,感受世界也挺美的,週末的生活氣息相對於忙碌的工做日濃厚了許多,靜下來去享受生活。2019作最棒的本身!前端

 

Node 項目在項目根目錄中名爲 package.json 的文件中跟蹤依賴關係和元數據。這是你項目的核心。它包含名稱、描述和版本之類的信息,以及運行、開發以及有選擇地將項目發佈到 NPM 所需的信息。node

在本教程中,咱們將:ios

  • 瞭解 package.json 與項目之間的關係
  • 肯定重要字段和元數據
  • 瞭解如何管理 package.json

目標

瞭解什麼是 package.json 文件,它與你項目的關係以及須要瞭解的常見屬性。git

瞭解 package.json

若是你之前用過 Node.js,則可能會遇到 package.json 文件。它是一個 JSON 文件,位於項目的根目錄中。你的 package.json 包含關於項目的重要信息。它包含關於項目的令人類可讀元數據(如項目名稱和說明)以及功能元數據(如程序包版本號和程序所需的依賴項列表)。github

package.json 示例以下所示:express

{
        "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 文件。npm

package.json 會在項目的生命週期中扮演多個角色,其中某些角色僅適用於發佈到 NPM 的軟件包。即便你沒有把項目發佈到 NPM 註冊表中,或者沒有將其公開發布給其餘人,那麼 package.json 對於開發流程仍然相當重要。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 字段的值一般是許可證的標識符代碼——例如 MITISC 之類的字符串,它們表明MIT 許可證和 ISC 許可證。若是你不想提供許可證,或者明確不想授予使用私有或未發佈的軟件包的權限,則能夠將 UNLICENSED 做爲許可證。若是你不肯定要使用哪一個許可證, Choose a License 是對你有用的資源。

authorcontributors

"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 則能夠由多我的組成。

這些字段是列出公共項目的聯繫人以及與貢獻者共享信用的有用方法。

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.jsondependencies 字段位於項目的核心,並定義項目所需的外部包。

在依賴版本中看到的插入符號(^)和波浪號(~)是 SemVer 中定義的版本範圍的表示法。 瞭解有關依賴版本和 SemVer 的更多信息

devDependencies

"devDependencies": {
	"nodemon": "^1.18.11"
}
複製代碼

dependencies 字段相似,可是這裏列出的包僅在開發期間須要,而在生產中不須要。

例如,在開發過程當中使用工具從新加載項目,好比 nodemon,一旦程序部署並投入生產,將不會再使用它。devDependencies 屬性使咱們能夠明確地指出生產中不須要哪些依賴項。在生產環境中安裝應用程序時,能夠用 npm install --production 僅安裝 package.jsondependency 字段中列出的內容。

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 installnpm uninstallnpm update 來管理依賴項,這樣可使你的 package.jsonnode_modules/ 文件夾保持同步。若是手動添加依賴項列表的話,須要你在把依賴項實際安裝到項目以前運行 npm install

由於 package.json 僅是咱們記錄依賴項的位置,而 node_modules/ 文件夾是安裝依賴項代碼的實際位置,因此手動更新 package.json 的依賴項字段不會當即將咱們的狀態反映到 node_modules/ 文件夾。這就是爲何要用 npm 幫助管理依賴項的緣由,由於它會同時更新 package.jsonnode_modules/ 文件夾。

你固然能夠在文本編輯器中手動編輯 package.json 並進行更改,只要你注意不要引入任何 JSON 格式錯誤,這對大多數字段都適用。可是我建議你儘量使用 npm CLI 命令。

總結

package.json 文件是 Node 項目的核心。它記錄了有關發佈到 NPM 以前所須要的項目的重要元數據,它還定義了 npm 用於安裝依賴項、運行腳本以及標識包的入口點的項目功能屬性。

並不是 package.json 中全部字段都適用於你,可是咱們能夠經過其在 package.json 文件中記錄有關程序的信息來得到一些強大的好處。瞭解 package.json 的角色以及它與 npm 的關係是開發 Node.js 應用的重要組成部分,而且正日益成爲 JavaScript 生態系統的重要組成部分。

進一步瞭解

其餘資源


做者:前端先鋒
連接:https://juejin.im/post/5ddf97986fb9a071ac1a0b09
來源:掘金
相關文章
相關標籤/搜索