日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

你真的了解package.json嗎?

來源: 責編: 時間:2024-02-02 09:21:12 201觀看
導讀今天我們就來講講「package.json」。還有很多同學說,f_cli[1]啥時候開源。這里簡單說一嘴,因為f_cli現在只適配了針對vite+react的模板,然后我想著想把vite+vue/webpack+react/vue/rsPack+vue/react最起碼再適配1-2個后,

今天我們就來講講「package.json」。2xr28資訊網——每日最新資訊28at.com

還有很多同學說,f_cli[1]啥時候開源。這里簡單說一嘴,因為f_cli現在只適配了針對vite+react的模板,然后我想著想把vite+vue/webpack+react/vue/rsPack+vue/react最起碼再適配1-2個后,才有開源計劃。2xr28資訊網——每日最新資訊28at.com

1. 什么是package.json

package.json 是JS/TS項目的說明書和指導手冊2xr28資訊網——每日最新資訊28at.com

按照功能來分類,package.json具有如下的功能:(有些功能是可以相互配合使用的)2xr28資訊網——每日最新資訊28at.com

依賴管理

一個成熟的語言,不僅僅需要在語言層面功能完備,還體現在構建大型項目時是否具有低成本的依賴管理能力。2xr28資訊網——每日最新資訊28at.com

現在有許多用于依賴管理的工具,比如 Java 的 Maven,Python 的 pip,JavaScript 的 npm/pnpm /yarn,以及 Rust 的 Cargo。2xr28資訊網——每日最新資訊28at.com

每個包管理器都需要一種方式來跟蹤在「當前項目中應該使用哪些版本的哪些軟件包」。通常,會創建一個文件,將這些「依賴關系映射到它們對應的版本」上。比如,2xr28資訊網——每日最新資訊28at.com

  • JS項目開發時,在根目錄上會存在package.json
  • 在Rust項目開發時,根目錄下有Cargo.toml

我們今天的主角 -package.json的主要作用是「跟蹤項目中所需的所有依賴關系」。當運行 JS 包管理器上的 install 命令時,它將安裝在 package.json 文件中提到的軟件包的相應版本。2xr28資訊網——每日最新資訊28at.com

定義命令&執行任務

這點大家都很熟,在現在前端開發中,尤其在SPA模式開發下,我們通常會使用打包工具Vite/Webpack/rsPack分別對開發模式和生產模式進行區分。要想實現上述操作。我們就需要在一個地方定義一些操作:執行命令,并且能夠在通過npm cli命令行執行這些「操作」。2xr28資訊網——每日最新資訊28at.com

而這就是package.json中scripts的用途。我們可以定義很多操作然后執行諸如dev/build/prepare/postinstall等命令。2xr28資訊網——每日最新資訊28at.com

這個是利用npm的生命周期做一些資源整合的事情。這個我們會另寫一篇文章。這里也不再多講。2xr28資訊網——每日最新資訊28at.com

存儲元數據

在如何在 npm 上發布二進制文件?中,我們同樣有package.json,它既不是用于「依賴管理」也不是用于定義項目命令,而是通過一些字段的配置來說明包的名稱和版本信息,以及該包被用于那些操作系統和系統架構。2xr28資訊網——每日最新資訊28at.com

也就是說,2xr28資訊網——每日最新資訊28at.com

package.json還可以存儲必要的包的元數據。2xr28資訊網——每日最新資訊28at.com

2. package.json 中關鍵字段

創建package.json

我們可以使用 npm init 命令在任意我們想創建前端項目的文件夾中創建一個 package.json 文件。當我們運行該命令時,它會詢問我們一系列的問題,我們輸入的所有答案都會顯示在我們的 package.json 文件中。2xr28資訊網——每日最新資訊28at.com

圖片圖片2xr28資訊網——每日最新資訊28at.com

當我們填入我們想要的信息后,就會在項目的根目錄下創建一個package.json文件。2xr28資訊網——每日最新資訊28at.com

{  "name": "front789",  "version": "1.0.0",  "description": "專注于前端開發技術Rust及AI應用知識分享的Coder",  "main": "index.js",  "scripts": {    "test": "vitest"  },  "repository": {    "type": "git",    "url": "https://xxx/xxx"  },  "keywords": ["前端開發", "rust", "ai"],  "author": "front789 (https://xxx/xx)",  "license": "MIT"}

當然我們也可以采用手動方式在項目根目錄下創建一個package.json并填入必要的信息2xr28資訊網——每日最新資訊28at.com

如果大家看過package.json的官網[2]的話,會發現有很多屬性,并用它使用場景五花八門。2xr28資訊網——每日最新資訊28at.com

而今天我們也不打算把這些屬性都過一遍,我會有選擇的挑選一些對我們平時開發有用的屬性來講。2xr28資訊網——每日最新資訊28at.com

name

name 字段用于標識軟件包。2xr28資訊網——每日最新資訊28at.com

{  "name": "my-project"}

在 package.json 文件中,name和version是「強制」的,它們一起被認為是唯一的。例如,如果name是 f_cli,version是 0.1.0,那么就假定f_cli@0.1.0是唯一的,不指代任何其他軟件包。2xr28資訊網——每日最新資訊28at.com

軟件包name也是有一定的限制的。2xr28資訊網——每日最新資訊28at.com

?2xr28資訊網——每日最新資訊28at.com

它需要符合^(?:(?:@(?:[a-z0-9-*~][a-z0-9-*._~]*)?/[a-z0-9-._~])|[a-z0-9-~])[a-z0-9-._~]*$正則規則2xr28資訊網——每日最新資訊28at.com

?2xr28資訊網——每日最新資訊28at.com

  • 它不能超過 214 個字符,并且只能包含小寫字母。
  • 名稱不能以點(.)或下劃線(_)開頭。
  • 此外,名稱通常是 URL 的一部分,因此必須是 URL 安全的。

軟件包名稱也可以是作用域(scope)的。例如,軟件包的名稱可以是@front/f_cli。這是@organization/package 的形式。但是這種形式時候需要花錢的。2xr28資訊網——每日最新資訊28at.com

如果將包發布到 npmjs,則 name 屬性是必需的并且必須是唯一的。如果使用和 npmjs已經存在的名稱發布包,將收到錯誤。2xr28資訊網——每日最新資訊28at.com

如果不將包發布到npmjs,那么項目的name字段就沒有那么多要求。2xr28資訊網——每日最新資訊28at.com

version

{  "version": "1.1.0",}

version 字段也是用于標識軟件包的鍵。通常,此版本號必須是可由 node-semver[3] 解析的。2xr28資訊網——每日最新資訊28at.com

「語義化版本控制」(Semantic Versioning,SemVer)是一組用于版本控制的規則,以便版本號的更改表明軟件包中的變化類型。2xr28資訊網——每日最新資訊28at.com

版本號以 MAJOR.MINOR.PATCH 的形式編寫2xr28資訊網——每日最新資訊28at.com

  • 如果新版本中有錯誤修復,則增加 PATCH。
  • 如果有新功能,則增加版本的 MINOR 部分。
  • 如果新版本有破壞性變化或與舊版本不兼容,則增加版本的 MAJOR 部分。

例如,如果軟件包的當前版本為 1.0.9:2xr28資訊網——每日最新資訊28at.com

  • 如果下一個發布僅包含錯誤修復,則新版本應為 1.0.10。
  • 如果下一個發布包含新功能,則新版本應為 1.1.0。
  • 如果下一個發布有破壞性變化,則新版本應為 2.0.0。

description

description 字段簡要描述了「軟件包的功能」。它對于 SEO 也很有用,因為它幫助其他人可以在npmjs.com 網站上找到我們的軟件包。當用戶在npmjs.com搜索包時,此字符串用于幫助顯示包。2xr28資訊網——每日最新資訊28at.com

就像我們f_li_darwin_arm64的包有如下的配置信息。2xr28資訊網——每日最新資訊28at.com

圖片圖片2xr28資訊網——每日最新資訊28at.com

當我們在npmjs中按照description搜索時也會返回對應的結果。2xr28資訊網——每日最新資訊28at.com

圖片圖片2xr28資訊網——每日最新資訊28at.com

即使我們沒有將其發布到npmjs,它也可以用作項目的說明書,來說明該項目的性質和功能。起到一個「高屋建瓴」的作用。2xr28資訊網——每日最新資訊28at.com

keywords

{  "keywords": ["f_cli", "MACOS_Intel64"]}

keywords 字段是一個「字符串數組」,與 description 類似,keywords 字段也用于 SEO。該字段由 npmjs編制索引,用于幫助在有人搜索包時找到包。數組中的每個值都是與我們的包關聯的一個關鍵字。2xr28資訊網——每日最新資訊28at.com

圖片圖片2xr28資訊網——每日最新資訊28at.com

如果我們不發布到npmjs,則此字段沒有多大用處,可以隨意省略它。2xr28資訊網——每日最新資訊28at.com

homepage

{  "homepage": "https://github.com/owner/project#readme"}

通常,我們會在此字段中鏈接到項目的網站地址。或者,我們還可以指向項目的 README 或文檔。2xr28資訊網——每日最新資訊28at.com

bugs

{  "bugs": {    "url": "https://github.com/owner/project/issues",    "email": "project@hostname.com"  }}

當別人使用了我們的包,在遇到問題后可以依據這個字段提供的url和email來提出問題,并嘗試在需要的地方尋找解決方案。2xr28資訊網——每日最新資訊28at.com

如果我們不想提供支持電子郵件,我們可以直接將 URL 分配給 bugs 屬性。2xr28資訊網——每日最新資訊28at.com

{  "bugs": "https://github.com/owner/project/issues",}

license

{  "license":"MIT"}

license 是一個重要的字段,因為它向使用包的用戶描述了我們在使用此軟件包時設置的「權限」和「限制」。理想情況下,對于開源軟件包,許可證應該是 OSI 批準[4]的許可證之一。2xr28資訊網——每日最新資訊28at.com

下面是我們常見的OSI軟件開源協議。2xr28資訊網——每日最新資訊28at.com

許可證
2xr28資訊網——每日最新資訊28at.com

版本
2xr28資訊網——每日最新資訊28at.com

主要特點
2xr28資訊網——每日最新資訊28at.com

GNU通用公共許可證(GPL)
2xr28資訊網——每日最新資訊28at.com

2.0
2xr28資訊網——每日最新資訊28at.com

允許使用、修改、復制和分發軟件,要求在修改后的軟件中保持相同的GPL許可協議。
2xr28資訊網——每日最新資訊28at.com


2xr28資訊網——每日最新資訊28at.com

3.0
2xr28資訊網——每日最新資訊28at.com

強調數字版權管理(DRM)和專利許可,以保障開源軟件的自由性和用戶權益。
2xr28資訊網——每日最新資訊28at.com

MIT許可證
2xr28資訊網——每日最新資訊28at.com

-
2xr28資訊網——每日最新資訊28at.com

允許幾乎所有情況下自由使用、修改、復制和分發軟件,只要在軟件和相關文檔中包含原許可協議和版權聲明。
2xr28資訊網——每日最新資訊28at.com

Apache許可證 2.0
2xr28資訊網——每日最新資訊28at.com

-
2xr28資訊網——每日最新資訊28at.com

允許使用、修改、復制和分發軟件,要求在分發時保留原始許可協議和版權聲明,修改后的代碼必須以某種形式標明更改。
2xr28資訊網——每日最新資訊28at.com

BSD許可證
2xr28資訊網——每日最新資訊28at.com

2-Clause
2xr28資訊網——每日最新資訊28at.com

允許自由使用、修改、復制和分發軟件,要求在分發時保留原始許可協議和版權聲明。
2xr28資訊網——每日最新資訊28at.com


2xr28資訊網——每日最新資訊28at.com

3-Clause
2xr28資訊網——每日最新資訊28at.com

在2-Clause BSD License的基礎上增加了對使用軟件名稱、作者名稱或衍生品的宣傳中的責任免除條款。
2xr28資訊網——每日最新資訊28at.com

GNU寬通用公共許可證(LGPL)
2xr28資訊網——每日最新資訊28at.com

2.1
2xr28資訊網——每日最新資訊28at.com

允許在自由和開源項目中使用該軟件,并在修改后的庫中使用不同的許可協議。
2xr28資訊網——每日最新資訊28at.com


2xr28資訊網——每日最新資訊28at.com

3.0
2xr28資訊網——每日最新資訊28at.com

強調數字版權管理(DRM)和專利許可,適用于開源項目,并在修改后的庫中使用不同的許可協議。
2xr28資訊網——每日最新資訊28at.com

如果我們不希望在任何條件下向軟件包的用戶授予任何權限,可以將此字段設置為 UNLICENSED。2xr28資訊網——每日最新資訊28at.com

如果這個項目是我們公司的項目,并且也不準備開源,應該將 package.json 文件中的 private 字段設置為 true,以防止意外發布軟件包。2xr28資訊網——每日最新資訊28at.com

author

author 字段用于提供有關軟件包開發者的信息。它包括一個name,以及一個可選的email和 url 字段。2xr28資訊網——每日最新資訊28at.com

以下是一個示例:2xr28資訊網——每日最新資訊28at.com

{  "name": "front789",  "email": "xx@gmial.com",  "url": "https://xx.io"}

所有這些信息也可以縮小成以下格式的單個字符串:2xr28資訊網——每日最新資訊28at.com

{  "author": "Name <Email> (Site)"}

例如,我們可以使用此格式指定與上述相同的作者:2xr28資訊網——每日最新資訊28at.com

{  "author": "front789 <xx@gmial.com> (https://xx.io)"}

contributors

與 author 字段類似,contributors 字段提供有關軟件包開發者的信息。它包含一個作者數組。2xr28資訊網——每日最新資訊28at.com

files

files 字段是一個「文件模式數組」,描述當「我們的包作為依賴項安裝時要包含的文件」。2xr28資訊網——每日最新資訊28at.com

文件模式遵循與.gitignore 類似的語法。唯一的區別是在.gitignore 中指定的文件被排除在外,而這些文件被包括在內。我們還可以使用像*和**/*這樣的 glob 模式,就像在.gitignore 文件中一樣。2xr28資訊網——每日最新資訊28at.com

如果未特別指定,則 files 字段默認為["*"]。2xr28資訊網——每日最新資訊28at.com

我們可以在包的根目錄或子目錄中提供 .npmignore 文件,這將防止包含文件。 .npmignore 文件的工作方式與 .gitignore 類似。2xr28資訊網——每日最新資訊28at.com

一些特殊的文件和目錄也會被包含,無論它們是否存在于 files 數組中。2xr28資訊網——每日最新資訊28at.com

  • package.json
  • README
  • LICENSE / LICENCE
  • 在main字段指定的文件
  • 在bin字段指定的文件

其中README 和 LICENSE/LICENCE 文件可以具有任何擴展名。2xr28資訊網——每日最新資訊28at.com

main

{  "main": "src/index.js",}

main 字段是 package.json 的「功能屬性」。這定義了項目的入口點,通常也是用于啟動項目的文件。2xr28資訊網——每日最新資訊28at.com

如果我們的軟件包(假設其名稱為 front789)由用戶安裝,那么當用戶執行 require('front789') 時,則將返回主模塊的導出對象。2xr28資訊網——每日最新資訊28at.com

這通常是項目根目錄中的 index.js 文件,但它可以是我們選擇用作包的主入口的任何文件。2xr28資訊網——每日最新資訊28at.com

如果未設置 main,則默認為包根文件夾中的 index.js2xr28資訊網——每日最新資訊28at.com

該字段在Node12+有另外的替代方案 - exports。2xr28資訊網——每日最新資訊28at.com

圖片圖片2xr28資訊網——每日最新資訊28at.com

exports

我們可以使用 exports 字段定義軟件包的入口點,作為 main 字段的替代方案。與 main 不同,exports 允許我們定義子路徑導出和條件導出。2xr28資訊網——每日最新資訊28at.com

例如,我們可以使用以下 exports 屬性導出項目的 submodule.js 文件:2xr28資訊網——每日最新資訊28at.com

{  "exports": {    ".": "./index.js",    "./submodule.js": "./src/submodule.js"  }}

還可以條件導出 - 具體取決于軟件包的使用者是使用 require 還是 import。2xr28資訊網——每日最新資訊28at.com

{  "exports": {    "import": "./index-module.js",    "require": "./index-require.cjs"  },  "type": "module"}

條件導出通常用于 ESM 軟件包,以確保向后兼容性,因為 import 關鍵字只能在 ESM 中使用。2xr28資訊網——每日最新資訊28at.com

type

此字段描述了當前軟件包中的.js 文件應該被視為 ESM 還是 commonjs。我們可以為 ESM 設置module類型,并為非ESM 軟件包設置 commonjs。2xr28資訊網——每日最新資訊28at.com

此外,我們還可以明確指定文件是否應該解釋為 ESM 或 commonjs,使用.mjs 擴展名表示 ESM,.cjs擴展名表示 commonjs 文件。2xr28資訊網——每日最新資訊28at.com

{  "type": "module"}

browser

此字段用于表示軟件包是否應在瀏覽器中使用,而不是在 Node.js 項目中使用,以取代 main。當我們的軟件包使用像 window 這樣的瀏覽器API,在 Node.js 環境中不可用時,就會使用它。2xr28資訊網——每日最新資訊28at.com

bin

這個我們很熟,在如何在 npm 上發布二進制文件?中,我們在定義主包時,就使用了bin字段。2xr28資訊網——每日最新資訊28at.com

bin 字段,該字段是「命令名」到「本地文件名」的映射。2xr28資訊網——每日最新資訊28at.com

在某些情況下,npm 軟件包需要安裝到 PATH 中,以便它們可以在任何目錄中直接由操作系統運行。bin 字段指定這些類似可執行文件的文件。2xr28資訊網——每日最新資訊28at.com

當此軟件包「全局安裝」時,該文件將鏈接到全局 bins 目錄內,或者將創建一個 cmd(Windows 命令文件)來執行 bin 字段中的指定文件,因此可用于由 name 或 name.cmd(在 Windows PowerShell 上)運行。2xr28資訊網——每日最新資訊28at.com

當我們在 bin 屬性中有以下配置。2xr28資訊網——每日最新資訊28at.com

{  "bin": {    "c1": "./r1.js",    "c2": "./r2.js"  }}

在全局安裝此軟件包(使用 npm install -g)后,我們將能夠直接從終端運行 c1 和 c2 等命令。2xr28資訊網——每日最新資訊28at.com

  • 這在 unix-like 操作系統上內部創建了 r1.js 文件到/usr/local/bin/c1 的符號鏈接,以及 r2.js 到/usr/local/bin/c2 的符號鏈接。
  • 在 Windows 上,會創建一個 C://Users//{Username}//AppData//Roaming//npm//c1.cmd 文件,該文件運行 r1 腳本。

bin 屬性提到的文件,都以 shebang語法 #!/usr/bin/env node 開頭,否則我們的操作系統將不會意識到該文件應在 Node.js 環境中運行。2xr28資訊網——每日最新資訊28at.com

shebang

shebang是一種在Unix/Linux系統中用于「指定腳本解釋器的約定」。在Node.js中,也可以使用shebang來指定Node.js作為腳本的解釋器。在腳本文件的開頭,添加類似于#!/usr/bin/env node的行,告訴操作系統使用Node.js來解釋執行該腳本。2xr28資訊網——每日最新資訊28at.com

  1. #!:這是shebang的起始標志,告訴操作系統下面的路徑是解釋器的路徑。
  2. /usr/bin/env:這是一個用于在環境變量中查找解釋器的工具。它允許你在不同系統上使用不同的解釋器路徑,而不是硬編碼一個固定的路徑。
  3. node:這是指定的解釋器的名稱。在這里,它告訴操作系統使用Node.js來解釋執行腳本。

Node.js的shebang行告訴操作系統找到Node.js解釋器并使用它來執行腳本。這使得腳本可以作為可執行文件直接運行,而不必在命令行中顯式調用Node.js。2xr28資訊網——每日最新資訊28at.com

案例分析

還記得f_cli的npm版本嗎。2xr28資訊網——每日最新資訊28at.com

我們在package.json中的bin字段定義f_cli_f和bin/cli直接的關系2xr28資訊網——每日最新資訊28at.com

圖片圖片2xr28資訊網——每日最新資訊28at.com

并且在bin/cli中使用shebang指定node.js作為腳本解釋器。2xr28資訊網——每日最新資訊28at.com

圖片圖片2xr28資訊網——每日最新資訊28at.com

repository

該字段來記錄項目代碼所在的地址。該字段是一個對象,它定義了源代碼所在的 url,以及它使用的版本控制系統類型。對于開源項目,大部分都是GitHub,以 Git 作為版本控制系統。2xr28資訊網——每日最新資訊28at.com

{  "repository": {    "type": "git",    "url": "https://github.com/xxx/docs.git"  }}

scripts

script 字段是 package.json 中另一個「功能性元數據」2xr28資訊網——每日最新資訊28at.com

scripts 屬性是一個包含我們可以使用 npm CLI 運行的腳本命令的「字典」。其鍵是我們可以使用 npm run <scriptName> 運行的腳本,值是實際運行的命令。這些通常是終端命令,我們將其放入腳本字段中,以便我們可以記錄它們并輕松地重用它們。2xr28資訊網——每日最新資訊28at.com

我們還可以指定在軟件包生命周期的不同時間運行的腳本。例如,我們可以添加一個 prepublish 腳本,在軟件包發布之前運行(當我們運行 npm publish 時)。2xr28資訊網——每日最新資訊28at.com

這是一個比較大的主題,我們打算另起一篇,詳細介紹一下2xr28資訊網——每日最新資訊28at.com

dependencies

{  "dependencies": {    "A": "^4.16.4",    "B": "~1.7.4"  }}

此處列出了我們的項目使用的所有依賴項。使用 npm cli 安裝軟件包時(npm install xxx@1.0.1),會將其下載到我們的 node_modules/ 文件夾中,并將添加到我們的依賴項屬性中,并注明軟件包的名稱(xxx)和安裝的版本(1.0.1)。2xr28資訊網——每日最新資訊28at.com

dependencies字段是一個對象,以包名稱作為鍵,以版本或版本范圍作為值。從這個列表中,npm 知道當 npm install 在目錄中運行時要獲取和安裝哪些包(以及什么版本)。 package.json 的 dependency 字段是項目的核心,它定義了項目所需的外部包。2xr28資訊網——每日最新資訊28at.com

我們在dependencies中看到的脫字號 (^) 和波形符 (~) 是 SemVer[5] 中定義的版本范圍的表示法。2xr28資訊網——每日最新資訊28at.com

在語義版本控制中,版本號由三個數字組成,格式如下:2xr28資訊網——每日最新資訊28at.com

`主版本號.次版本號.修訂號`
  • 脫字符號(^)表示允許更新到最新的次版本號:
  • ^1.2.3 表示 >=1.2.3 并且 <2.0.0 的最新版本
  • 波形符(~)表示允許更新到最新的修訂號:
  • ~1.2.3 表示 >=1.2.3 并且 <1.3.0 的最新版本2xr28資訊網——每日最新資訊28at.com

所以簡單來說:2xr28資訊網——每日最新資訊28at.com

  • ^ 用于鎖定主版本號和次版本號
  • ~ 用于鎖定主版本號和次版本號及修訂號

devDependencies

與 dependencies 字段類似,但適用于僅在開發期間需要而在生產中不需要的包。2xr28資訊網——每日最新資訊28at.com

例如,在前端項目中我們使用eslint/oxlint進行代碼規范處理,一旦應用程序部署并投入生產,我們就不再使用它。devDependencies 屬性讓我們明確指出生產中不需要哪些依賴項。2xr28資訊網——每日最新資訊28at.com

我們可以使用npm install --save-dev <package>安裝指定的包,并且將相關的包信息記錄到dependencies中。2xr28資訊網——每日最新資訊28at.com

但是呢,由于我們項目開發時,可以隨意引入外部包,有的同學也會將在開會環境中起作用的包安裝到dependencies中。這樣,無形中增加我們生產環境的外部資源容量。2xr28資訊網——每日最新資訊28at.com

為了解決這個問題,我們可以在生產環境中安裝應用程序時,我們可以使用 npm install --production 僅安裝 package.json 的 dependency 字段中列出的內容。2xr28資訊網——每日最新資訊28at.com

peerDependencies

peerDependencies 字段用于指定「一個包依賴于其他包的特定版本」。這是為了解決一種情況:當一個包(插件或庫)希望與另一個包協同工作,但不希望將其作為直接依賴項安裝。2xr28資訊網——每日最新資訊28at.com

當某個包 A 聲明了它的 peerDependencies,它實際上是在聲明:“我期望運行時環境中會有某個包 B 的特定版本,但我不會直接將 B 包添加為我的依賴項,而是期望它由運行時環境或其他上層的包提供。”2xr28資訊網——每日最新資訊28at.com

以下是一個簡單的示例,展示了 peerDependencies 的用法:2xr28資訊網——每日最新資訊28at.com

{  "name": "my-package",  "version": "1.0.0",  "peerDependencies": {    "some-other-package": "^2.0.0"  }}

在這個例子中,my-package 依賴于 some-other-package 的版本,但它并沒有將其添加到 dependencies 中。相反,它期望運行時環境或上層的包會提供符合 ^2.0.0 版本要求的 some-other-package。2xr28資訊網——每日最新資訊28at.com

使用 peerDependencies 的主要目的是「確保在整個項目中使用相同版本的某個包,以防止出現不一致的依賴關系導致的問題」。這有助于確保包之間的協同工作,并降低由于版本不一致而引起的潛在問題。2xr28資訊網——每日最新資訊28at.com

peerDependenciesMeta

peerDependenciesMeta 字段用于提供 peerDependencies 的額外元數據信息,以幫助管理 peerDependencies。2xr28資訊網——每日最新資訊28at.com

它是一個對象,key 是 peerDependencies 的名字,value 是關于這個依賴的額外信息。2xr28資訊網——每日最新資訊28at.com

比如:2xr28資訊網——每日最新資訊28at.com

{  "peerDependencies": {    "react": ">=16.8.0"  },  "peerDependenciesMeta": {    "react": {      "optional": true     }  }  }

這里對 react 這個 peerDependency 提供了額外的元數據:optional: true。2xr28資訊網——每日最新資訊28at.com

這個 optional 鍵指明這個 peerDependency 是可選的,如果使用者沒有顯式安裝它,也不會觸發警告。2xr28資訊網——每日最新資訊28at.com

這比直接把依賴設置為 optionalDependencies 要好,因為這樣所有的 peerDependency 都聚集在 peerDependencies 字段中,而不會分散在兩個地方。2xr28資訊網——每日最新資訊28at.com

peerDependenciesMeta 還可以用于提供其他元數據,比如說明、地位等,以便更好地幫助使用者理解和管理 peerDependencies。2xr28資訊網——每日最新資訊28at.com

bundleDependencies

bundleDependencies字段用于指定將哪些依賴包打包到最終的發布包中。2xr28資訊網——每日最新資訊28at.com

比如:2xr28資訊網——每日最新資訊28at.com

{  "name": "example-package",  "version": "1.0.0",  "bundledDependencies": [    "lodash",    "moment"   ]}

這意味著當這個包被發布時,lodash和moment這兩個依賴會被打包到發布包中,而不是作為外部依賴被安裝。2xr28資訊網——每日最新資訊28at.com

bundleDependencies的常見使用場景包括:2xr28資訊網——每日最新資訊28at.com

  • 將核心業務邏輯相關的依賴打包起來,以控制版本和優化性能
  • 將大體積的依賴打包,以減少安裝時間
  • 將易受破壞的依賴打包,以增強穩定性

使用bundleDependencies需要注意:2xr28資訊網——每日最新資訊28at.com

  • 打包的依賴無法被使用者覆蓋更新
  • 會增加發布包的體積
  • 需要同步維護依賴版本

所以需要根據實際情況權衡利弊來決定哪些依賴適合打包。2xr28資訊網——每日最新資訊28at.com

optionalDependencies

當找不到或無法安裝依賴項時,npm install 命令會退出并顯示錯誤。如果特定軟件包存在于 optionalDependencies 而不是其他任何依賴項列表/字典中,則可以阻止出現此情況。2xr28資訊網——每日最新資訊28at.com

在 package.json 中,optionalDependencies 字段用于指定哪些依賴可以被視為可選的。2xr28資訊網——每日最新資訊28at.com

例如:2xr28資訊網——每日最新資訊28at.com

{  "optionalDependencies": {    "xx": "^1.0.0"  }}

這表示 xx 這個依賴是可選的,如果安裝過程中無法滿足,npm 會繼續正常安裝,只是發出警告。2xr28資訊網——每日最新資訊28at.com

optionalDependencies 和 dependencies 的區別在于:2xr28資訊網——每日最新資訊28at.com

  • dependencies 是必需的,如果安裝失敗會導致整個安裝過程終止。
  • optionalDependencies 是可選的,如果安裝失敗會發出警告但不影響整體安裝。

optionalDependencies 的常見使用場景:2xr28資訊網——每日最新資訊28at.com

  • 對某些特定平臺的依賴,如 fsevents 主要用于 MacOS。
  • 一些可提升性能但不是必須的依賴。
  • 一些實驗性特性相關的依賴。

使用 optionalDependencies 表示可選依賴,可以很好地提升使用者的安裝體驗,避免因為某些非核心依賴而導致整個安裝失敗。2xr28資訊網——每日最新資訊28at.com

還記得我們在發布f_cli時候,通過optionalDependencies來指定相關工作環境的二進制包嗎。2xr28資訊網——每日最新資訊28at.com

圖片圖片2xr28資訊網——每日最新資訊28at.com

publishConfig

我們可以使用此選項指定軟件包是否應該是公開可訪問的,以及軟件包使用哪個標簽發布。默認情況下,軟件包是私有的,并且默認標簽是 latest。使用不同的標簽,例如 beta,允許用戶使用npm install <package-name>@beta安裝軟件包的特定版本。2xr28資訊網——每日最新資訊28at.com

在 package.json 中,publishConfig 用于配置發布這個包時的一些設置。2xr28資訊網——每日最新資訊28at.com

其中常見的配置有:2xr28資訊網——每日最新資訊28at.com

  • registry: 發布到哪個注冊表,默認是 https://registry.npmjs.org/
  • tag: 發布時添加的 tag,默認是 latest

例如:2xr28資訊網——每日最新資訊28at.com

{  "publishConfig": {    "registry": "https://私有注冊表網址",    "tag": "internal"   }}

這意味著發布這個包時會發布到私有注冊表,并打上 internal 的 tag。2xr28資訊網——每日最新資訊28at.com

publishConfig 的常見使用場景:2xr28資訊網——每日最新資訊28at.com

  • 指定私有注冊表,用于企業內部發布包
  • 為預發布的版本添加特殊 tag,如 next
  • 發布到不同注冊表的同名包,用 tag 進行區分

所以 publishConfig 可以很好地自定義包的發布過程,將其發布到特定的注冊表或添加自定義標簽。2xr28資訊網——每日最新資訊28at.com

另外,發布過程還可以通過 npm publish 命令的 --tag 參數動態配置。2xr28資訊網——每日最新資訊28at.com

workspaces

workspaces字段用于定義 monorepo 結構中的多個 package。2xr28資訊網——每日最新資訊28at.com

例如:2xr28資訊網——每日最新資訊28at.com

{  "name": "monorepo",  "workspaces": [    "packages/*"  ]}

這表示packages目錄下的「所有子目錄都會被當作獨立的 package,可以相互依賴和發布」。2xr28資訊網——每日最新資訊28at.com

啟用 workspaces 后,在根目錄運行類似npm install、npm run build等命令,會自動在所有 workspace 包中生效。2xr28資訊網——每日最新資訊28at.com

workspaces的常見使用場景:2xr28資訊網——每日最新資訊28at.com

  • 管理多個相關的包,讓它們使用同一個git倉庫和配置
  • 共享依賴以優化安裝大小
  • 統一管理命令和腳本配置

與普通的多包管理相比,workspaces 可以減少重復工作,大幅簡化 monorepo 開發。2xr28資訊網——每日最新資訊28at.com

需要注意的是,所有 workspace 需要遵循相同的npm包規則,如版本控制、發布模式等,以減少管理負擔。2xr28資訊網——每日最新資訊28at.com

這個選項在單體倉庫中非常有用。我們可以以以下方式指定工作空間的列表:2xr28資訊網——每日最新資訊28at.com

{  "workspaces": [    "./packages/client",     "./packages/server"  ]}

我們可以在 client 和 server 目錄中有單獨的 package.json 文件,其中包含單獨的腳本。運行 npm install --workspaces 將在兩個目錄中運行 npm install。2xr28資訊網——每日最新資訊28at.com

實際上,我們可以使用--workspaces 命令在指定的所有工作空間中運行任何腳本。2xr28資訊網——每日最新資訊28at.com

例如,如果在 packages/client 和 packages/server 中有單獨的 lint 腳本,在根 package.json 中,我們可以有一個 lint 腳本。現在,如果在根目錄中運行 npm run lint --workspaces --if-present,它將在所有具有 lint 腳本的工作空間中運行 lint 腳本。2xr28資訊網——每日最新資訊28at.com

--if-present 保證即使有些包沒有 lint 腳本,也不會影響其它包的執行。2xr28資訊網——每日最新資訊28at.com

lock文件

在我們的 npm 項目中安裝軟件包時,通常會出現一個神秘的 package-lock.json 文件。2xr28資訊網——每日最新資訊28at.com

正如名稱所示,package-lock.json 是一個鎖定文件,即一個「存儲了使用的軟件包及其所有依賴軟件包的確切版本號的文件」。這包括在我們的 node_modules 目錄中存在的所有軟件包。2xr28資訊網——每日最新資訊28at.com

該文件的目的是確保所有依賴項在不同的機器上以相同的方式安裝,從而保證項目在不同環境中能夠一致工作。2xr28資訊網——每日最新資訊28at.com

package-lock.json 文件還包括每個軟件包內容的加密哈希,這確保安裝的軟件包未被篡改,并且與軟件包作者發布的確切相同的軟件包。2xr28資訊網——每日最新資訊28at.com

當我們運行 npm install 時,npm 使用 package-lock.json 中的信息確定要安裝的軟件包的確切版本,并以與原始安裝相同的順序和相同的依賴項安裝它們。2xr28資訊網——每日最新資訊28at.com

其他包管理器

盡管 npm 是最流行的包管理器之一,但很多人也使用其他包管理器,如 yarn、pnpm 或 turbo。這些包管理器中仍然存在 package.json 文件,但不同的包管理器可能使用不同的名稱來命名鎖文件。例如,yarn 創建的 鎖文件 稱為 yarn.lock,看起來類似于以下內容:2xr28資訊網——每日最新資訊28at.com

# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.# yarn lockfile v1package-1@^1.0.0:  version "1.0.3"  resolved "https://registry.npmjs.org/package-1/-/package-1-1.0.3.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"package-2@^2.0.0:  version "2.0.1"  resolved "https://registry.npmjs.org/package-2/-/package-2-2.0.1.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"  dependencies:    package-4 "^4.0.0"package-3@^3.0.0:  version "3.1.9"  resolved "https://registry.npmjs.org/package-3/-/package-3-3.1.9.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"  dependencies:    package-4 "^4.5.0"package-4@^4.0.0, package-4@^4.5.0:  version "4.6.3"  resolved "https://registry.npmjs.org/package-4/-/package-4-2.6.3.tgz#a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0"

類似地,pnpm 生成一個稱為 pnpm-lock.yaml 的 鎖文件。然而,所有這些 lockfile 的目的與 npm 生成的 package-lock.json 文件相同。2xr28資訊網——每日最新資訊28at.com

3. 總結

總的來說,package.json是 Node.js 開發中使用的重要元數據文件。它有助于管理依賴關系、自動化任務并配置項目。該文件包含了項目名稱、版本號、作者、許可證、依賴關系等基本信息。2xr28資訊網——每日最新資訊28at.com

通過使用 package.json,我們可以輕松管理項目所需的依賴項,確保安裝每個軟件包的正確版本。這使得更容易維護項目并在必要時更新依賴項。2xr28資訊網——每日最新資訊28at.com

此外,它還可以用于自動化任務,如構建項目、運行測試和啟動應用程序。這可以為我們節省時間和精力,使他們能夠專注于項目的更重要方面。2xr28資訊網——每日最新資訊28at.com

最后,它允許我們將其項目發布到 npmjs,使其他用戶能夠輕松安裝和在自己的項目中使用該項目。2xr28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-71450-0.html你真的了解package.json嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 徹底理解內存泄漏,你學會了嗎?

下一篇: 前端開源項目懸賞改Bug,500 - 1000美元/個,還剩 278 個

標簽:
  • 熱門焦點
  • 一加首款折疊屏!一加Open渲染圖出爐:罕見單手可握小尺寸

    8月5日消息,此前就有爆料稱,一加首款折疊屏手機將會在第三季度上市,如今隨著時間臨近,新機的各種消息也開始浮出水面。據悉,這款新機將會被命名為&ldquo;On
  • 28個SpringBoot項目中常用注解,日常開發、求職面試不再懵圈

    前言在使用SpringBoot開發中或者在求職面試中都會使用到很多注解或者問到注解相關的知識。本文主要對一些常用的注解進行了總結,同時也會舉出具體例子,供大家學習和參考。注解
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 重估百度丨“晚熟”的百度云,能等到春天嗎?

    &copy;自象限原創作者|程心排版|王喻可2016年7月13日,百度云計算戰略發布會在北京舉行,宣告著百度智能云的正式啟程。彼時的會場座無虛席,甚至排隊排到了門外,在場的所有人幾乎都
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現&ldquo;美團直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯網企業調整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 華為Mate60標準版細節曝光:經典星環相機模組回歸

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • iQOO Neo8系列今日官宣:首發天璣9200+ 全球安卓最強芯!

    在昨日舉行的的聯發科新一代旗艦芯片天璣9200+的發布會上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品將全球首發搭載這款當前性能最強大的移動平臺
Top 主站蜘蛛池模板: 贵德县| 临夏市| 乡宁县| 牙克石市| 信丰县| 新丰县| 新建县| 潜江市| 上杭县| 绥化市| 长顺县| 嘉鱼县| 菏泽市| 西城区| 蒙自县| 克东县| 特克斯县| 儋州市| 万山特区| 黄浦区| 湘潭县| 麦盖提县| 江华| 合肥市| 周宁县| 永吉县| 青田县| 永清县| 武乡县| 沙湾县| 高陵县| 宁蒗| 观塘区| 湘阴县| 淮滨县| 太保市| 宜城市| 鄂伦春自治旗| 深圳市| 石景山区| 固安县|