目錄
指南章節
一個快速示例
安裝包時會發生什麼
package.json 和package-lock.json
node_modules
安裝依賴項時應謹慎
什麼是npm audit?
接下來的步驟
首頁 web前端 css教學 如何安裝NPM軟件包

如何安裝NPM軟件包

Mar 15, 2025 am 09:57 AM

How to Install npm Packages

深入了解npm!前面章節我們已經學習了Node 和包管理器,甚至安裝了Node 和npm 並熟悉了Node 版本管理器(nvm)。本npm 初學者指南的下一部分將介紹您可能最關心的內容:安裝npm 包

指南章節

  1. 本指南面向誰?
  2. “npm” 到底是什麼意思?
  3. 命令行是什麼?
  4. Node 是什麼?
  5. 包管理器是什麼?
  6. 如何安裝npm?
  7. 如何安裝npm 包? (您當前位置!)
  8. npm 命令是什麼?
  9. 如何安裝現有的npm 項目?

一個快速示例

我們可以使用npm install命令(或簡寫為npm i )以及要添加到項目的包名稱來安裝我們的第一個包。例如,Sass 的Node 包簡稱為“sass”,這意味著我們可以像這樣將其添加到項目中(請確保您首先在一個為這個小項目創建的新文件夾中):

 npm install sass
登入後複製

就是這樣!輸入此命令後,npm 將立即開始工作:

幕後發生的情況是,npm 嘗試在npm 包註冊表中查找名為sass 的包。如果找到該包(確實會找到),npm 會將其安裝到項目中自動生成的node_modules文件夾(稍後會詳細介紹)中(位於項目根文件夾中),包括該包運行所需的一切。 (這就是為什麼您看到npm 添加了16 個包並審核了總共17 個npm 包,而不是僅Sass 包本身——它也有依賴項!)

運行安裝命令後,您可能會注意到,您在項目文件夾中沒有看到名為“sass”的任何內容,這與您可能預期的不同。然而,奇怪的是,我們確實在項目文件夾中看到了三個新項目:兩個名為package.jsonpackage-lock.json的JSON 文件,以及一個全新的node_modules文件夾。

這些是什麼?我們要求npm 安裝Sass,而不是所有這些東西。這不是Sass 的一部分……對吧?是的,這是正確的,但是為什麼在項目文件夾中生成這些新項目有一個很好的解釋。讓我們看看剛剛發生了什麼。

安裝包時會發生什麼

安裝(或卸載或更新)包時,npm 會執行以下四件事中的大部分甚至全部:

  1. 根據需要更新項目中的package.json文件;
  2. 更新包含所有技術細節的package-lock.json文件(稱為“鎖文件”);
  3. 安裝實際的包文件——以及原始包可能依賴的任何其他包(在node_modules文件夾內);以及
  4. 運行已安裝包的審核。

讓我們逐一進行介紹。

package.json 和package-lock.json

這兩個JSON 文件協同工作,以確保准確記錄項目中的所有依賴項(以及所有它們的依賴項,以及所有它們的依賴項的依賴項,依此類推)。兩者之間的區別有點技術性,但簡單來說:鎖文件是項目依賴項樹的深入、精確的快照,而package.json是一個高級概述,它還可以包含其他內容。您安裝的主要包可能列在package.json中,但package-lock.json是跟踪整個依賴項樹的位置。

鎖文件也不應該手動更新;只能由npm 更新。因此,請務必避免將鎖文件與package.json文件混淆。

當您與他人共享或協作處理項目時,npm 通過這兩個文件知道項目的來源以及項目中安裝的內容。由於這些信息,它可以精確地在任何其他人的機器上複製該環境。這兩個文件都應該提交到您的Git 倉庫,並作為項目的依賴項藍圖。這樣,當您的團隊中的另一位開發人員克隆倉庫並運行npm install命令時,npm 確切地知道要安裝哪些包,從而使您和您的同事保持同步。

如果您打開package.json ,您不會看到太多內容,但值得一看一下,看看發生了什麼:

 {
  "dependencies": {
    "sass": "^1.43.4"
  }
}
登入後複製

您可能不會看到確切的版本號(因為自撰寫本文以來該包已更新),但您應該在JSON dependencies對象內看到sass。數字本身(在本例中為1.43.4)指示已安裝的Sass 的特定版本。

作為簡短但重要的旁注:版本號開頭的脫字符(^) 允許npm 安裝對包的次要更新。換句話說,它告訴npm 已安裝的Sass 包必須至少為1.43.4 版本,但可以是任何更高的1.xx 版本,只要它仍在2.0.0 以下即可。 npm 通常在安裝包時選擇最新的穩定版本,但添加此內容是為了允許進行非破壞性更新。這部分稱為“語義版本控制”,它本身就是一個博文主題,但並非npm 獨有。

總之,這就是這兩個JSON 文件。接下來讓我們討論node_modules文件夾。

node_modules

node_modules是所有實際包代碼所在的位置;這是已安裝的Node 包以及使它們運行的所有內容的實際安裝位置。如果您現在在按照說明操作時打開該文件夾,您會找到一個sass 文件夾,但也會找到其他幾個文件夾。

出現其他文件夾的原因是,安裝包時,它可能需要其他包才能正常運行(Sass 顯然需要)。因此,npm 會自動完成查找和安裝所有這些依賴項的工作。正如您可能猜到的那樣,這些依賴項也可能擁有其他自己的依賴項,因此該過程會重複進行,依此類推,直到我們完成對依賴項樹到其最遠分支的爬取,並且我們所需的一切都已安裝(或者直到我們遇到某種錯誤,儘管希望不會)。

因此,項目通常會有數百個甚至更多的node_modules子文件夾,這些文件夾在磁盤空間方面會迅速累積。 node_modules通常會變得非常龐大。

如果您想知道如何將像node_modules這樣的大型文件夾提交到項目的存儲庫,請注意:與JSON 文件不同, node_modules文件夾不應提交到Git ,甚至不應共享。事實上,幾乎每個.gitignore文件(告訴Git 在跟踪文件時應跳過哪些文件的文件)的示例都包含node_modules ,以確保Git 從不接觸或跟踪它。

那麼,您的團隊中的其他人如何獲得這些包呢?他們從命令行運行npm install (或簡寫為npm i )以直接從源下載依賴項。這樣,無需將大量數據提交到或從原始倉庫中提取。

安裝依賴項時應謹慎

這個龐大的依賴項網絡及其遠親依賴項可能會導致這種情況:某種提供有用服務的實用程序庫可能會被許多其他包採用,而這些包又會被許多其他包使用,直到最終原始代碼最終悄無聲息地安裝在很大一部分站點和應用程序上。

在安裝一個包的過程中,您實際上可能會讓很多其他東西進入,這聽起來可能很奇怪(如果不是非常可怕的話)。這感覺就像邀請一位新朋友參加您的家庭聚會,然後這位朋友帶著20 位不速之客出現。但這並沒有看起來那麼奇怪或可怕,原因如下:

  1. 大多數npm 包都是開源的。您和任何其他人都可以輕鬆查看內部工作原理,並確切了解包在做什麼。您還可以查看註冊表(npmjs.com) 上的包,以查看它安裝了多少次、上次更新時間以及其他相關信息。如果某個包相當流行,您可以合理地確定它是安全的。
  2. 存在一個龐大的功能世界,許多項目都需要這些功能。例如,考慮日期格式化、處理HTTP 請求和響應、節流、防抖或動畫。每次在新項目中使用這些內容時,重新發明輪子並手動編碼這些內容是沒有意義的。
  3. 安裝包與在手機上安裝應用程序或在WordPress 網站上安裝插件並沒有什麼不同。不同之處在於,我們不像處理包那樣能夠深入了解這些應用程序和插件的內部工作原理,以及這些應用程序和插件可能依賴的其他內容。很有可能它們也會以某種方式引入許多較小的包。

當然,在可以安裝和執行任意代碼的任何環境中,謹慎程度都是一個好主意。請不要誤解我的意思。如果我說壞人從未成功利用過此系統,我會撒謊。但是要知道,有很多流程可以防止事情出錯。如有疑問,請堅持使用最流行的包,這樣您就沒事了。

另請注意,npm 會為您運行自動安全審核,這將我們帶到本節的最後一點。

什麼是npm audit?

當我們之前安裝sass 時,我們在終端完成時看到了以下消息:

 <code>found 0 vulnerabilities</code>
登入後複製

但是,您可能會看到一些警告——就像我下面的舊項目一樣。我決定啟動它並在它至少閒置了幾年後運行npm install ( npm i )。讓我們看看它的表現如何:

npm audit 會指出具有已知漏洞的包,該審核會在您安裝包時自動運行。如果您看到這樣的消息,請不要擔心;許多漏洞,尤其是在“中等”類別中的漏洞,帶來的實際風險非常低,並且可能僅與非常具體的情況相關。 (例如,可能只有包中的一個方法在以特定方式使用時才會使其變得脆弱。)

儘管如此,最好還是解決我們所能解決的問題,這就是npm audit fix命令的作用。在末尾添加fix會告訴npm 繼續並更新具有某種已知漏洞的任何包的新的次要版本。 “次要版本”部分很重要;次要版本不應包含重大更改,而應僅包含更新。這意味著應該安全地以這種方式運行更新,而不會出現破壞項目風險。

如果將包的版本號提高一個次要版本號不起作用,您可以將--force標誌添加到原始命令中:

 npm audit fix --force
登入後複製

但是,這是一個危險的操作。授予npm “使用強制”權限意味著它現在可以安裝主要版本更新以解決漏洞——這意味著它可能會進行重大更改或引入不兼容性。除非存在npm audit fix無法解決的關鍵漏洞,並且您願意並且能夠在之後花費大量時間進行故障排除(如有必要),否則我不建議這樣做。

關於此主題的最後一點說明:有時您可以通過刪除node_modules並重新運行npm install來修復npm 項目中的一些意外問題。這是npm 的“反復開關”方法,我自己也做過很多次。

接下來的步驟

既然我們已經徹底探索了npm 幕後工作原理的兔子洞,那麼讓我們回到實際操作中來,好嗎?

← 第6 章第8 章→

以上是如何安裝NPM軟件包的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1655
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1226
24
Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

如何通過CSS選擇第一個類名為item的子元素? 如何通過CSS選擇第一個類名為item的子元素? Apr 05, 2025 pm 11:24 PM

在元素個數不固定的情況下如何通過CSS選擇第一個指定類名的子元素在處理HTML結構時,常常會遇到元素個數不�...

為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? 為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? Apr 05, 2025 pm 05:51 PM

關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? 在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? Apr 05, 2025 pm 10:21 PM

在前端開發中如何實現類似Windows...

我們如何創建一個在SVG中生成格子呢模式的靜態站點 我們如何創建一個在SVG中生成格子呢模式的靜態站點 Apr 09, 2025 am 11:29 AM

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tar​​tanify.com上,我們收集了5,000多個格子呢

See all articles