什么是 npm —— 寫給初學者的編程教程

原文鏈接: 什么是 npm —— 寫給初學者的編程教程

自 2009 年以來,Node.js 一直席卷全球。成千上萬個系統基于 Node.js 構建,促使開發者在社區宣稱“JavaScript 正在吞噬軟件”。

Node 成功的主要因素之一是它廣受歡迎的軟件包管理器——npm,因為 npm 使 JavaScript 開發人員可以快速方便地共享軟件包, 例如 lodash 和 moment。

NPM 是什么

npm(“Node 包管理器”)是 JavaScript 運行時 Node.js 的默認程序包管理器。

它也被稱為“Ninja Pumpkin Mutants”,“Nonprofit Pizza Makers”,以及許多其他隨機名稱,可以在 npm-expansions 上探索這些名稱。

npm 由兩個主要部分組成:

  • 用于發布和下載程序包的 CLI(命令行界面)工具
  • 托管 JavaScript 程序包的 在線存儲庫

為了更直觀地解釋,我們可以將存儲庫 npmjs.com 視為一個物流集散中心,該中心從賣方(npm 包裹的作者)那里接收貨物的包裹,并將這些貨物分發給買方(npm 包裹的用戶)。

為了促進此過程,npmjs.com 物流集散中心雇用了一群勤勞的袋熊(npm CLI),他們將被分配給每個 npmjs.com 用戶作為私人助理。 因此,dependencies(依賴項)會如下傳遞給 JavaScript 開發人員:

在這里插入圖片描述

發布 JS 軟件包的過程如下:

在這里插入圖片描述

讓我們看看這只袋熊如何協助想要在項目中使用 JavaScript 包的開發人員。下面我們還將看到它們(npm CLI)如何幫助開源向導將其出色的庫推向世界。

package.json

每個 JavaScript 項目(無論是 Node.js 還是瀏覽器應用程序)都可以被當作 npm 軟件包,并且通過 package.json 來描述項目和軟件包信息。

我們可以將 package.json 視為快遞盒子上的運輸信息。

當運行 npm init 初始化 JavaScript/Node.js 項目時,將生成 package.json 文件,文件內的內容(基本元數據)由開發人員提供:

name:JavaScript 項目或庫的名稱。
version:項目的版本。通常,在應用程序開發中,由于沒有必要對開源庫進行版本控制,因此經常忽略這一塊。但是,仍可以用它來定義版本。
description:項目的描述。
license:項目的許可證。

npm scripts

package.json 還支持一個 scripts 屬性,可以把它當作在項目本地運行的命令行工具。例如,一個 npm 項目的 scripts部分可能看起來像這樣:

{"scripts": {"build": "tsc","format": "prettier --write **/*.ts","format-check": "prettier --check **/*.ts","lint": "eslint src/**/*.ts","pack": "ncc build","test": "jest","all": "npm run build && npm run format && npm run lint && npm run pack && npm test"}
}

eslint,prettier,ncc,jest 不是安裝為全局可執行文件,而是安裝在項目本地的 node_modules/.bin/ 中。

最新引入的 npx 使我們可以像在全局安裝程序一樣運行這些 node_modules 項目作用域命令,方法是在其前面加上 npx …(即npx prettier --write ** / *。ts)。

dependencies vs devDependencies

這兩個以鍵值對象的形式出現,其中 npm 庫的名稱為鍵,其語義格式版本為值。 大家可以看看 Github 的 TypeScript 操作模板中的示例:

{"dependencies": {"@actions/core": "^1.2.3","@actions/github": "^2.1.1"},"devDependencies": {"@types/jest": "^25.1.4","@types/node": "^13.9.0","@typescript-eslint/parser": "^2.22.0","@zeit/ncc": "^0.21.1","eslint": "^6.8.0","eslint-plugin-github": "^3.4.1","eslint-plugin-jest": "^23.8.2","jest": "^25.1.0","jest-circus": "^25.1.0","js-yaml": "^3.13.1","prettier": "^1.19.1","ts-jest": "^25.2.1","typescript": "^3.8.3"}
}

這些依賴通過帶有 --save 或 --save-dev 標志的 npm install 命令安裝。 它們分別用于生產和開發/測試環境。 在下一節中,我們將更深入地研究這些軟件包的安裝。

同時,理解語義版本前面的符號非常重要(假設你已經閱讀 semver 的 major.minor.patch 模型):

  • ^:表示最新的次版本,例如, ^1.0.4 可能會安裝主版本系列 1 的最新次版本 1.3.0。
  • ?:表示最新的補丁程序版本,與 ^ 類似, ?1.0.4 可能會安裝次版本系列 1.0 的最新次版本1.0.7。

所有這些確切的軟件包版本都將記錄在 package-lock.json 文件中。

package-lock.json

該文件描述了 npm JavaScript 項目中使用的依賴項的確切版本。如果 package.json 是通用的描述性標簽,則 package-lock.json 是成分表。

就像我們通常不會讀取食品包裝袋上的成分表(除非你太無聊或需要知道)一樣,package-lock.json 并不會被開發人員一行一行進行讀取。

package-lock.json 通常是由 npm install 命令生成的,也可以由我們的 NPM CLI 工具讀取,以確保使用 npm ci 復制項目的構建環境。

用戶如何使用 NPM

從前面提到的 130 萬個發布的軟件包中,有 160 億次下載,可以推斷出,大多數 npm 用戶都朝這個方向使用 npm。所以,了解如何使用這個強大的工具會很有幫助。

npm install

這是現在我們開發 JavaScript/Node.js 應用程序時最常用的命令。

默認情況下,npm install 將安裝帶有 ^ 版本號的軟件包的最新版本。npm 項目上下文中的 npm install 將根據 package.json 規范將軟件包下載到項目的 node_modules 文件夾中,從而升級軟件包的版本(并重新生成 package-lock.json )。 npm install 可以基于 ^ 和 ? 版本匹配。

如果要在全局上下文中安裝程序包,可以在機器的任何地方使用它,則可以指定全局標志 -g(例如 live-server)。

npm 使安裝 JavaScript 軟件包非常容易,以至于經常錯誤地使用此命令。 導致一些程序員對 npm 開這樣的玩笑:

image-6

但是,npm 包太大、太深這樣的問題可以通過 --production 標志來拯救!在上一節中,我們討論了分別用于生產和開發/測試環境的 dependencies 和 devDependencies 。 這個 --production 標志是如何在 node_modules 中進行區別的。

通過將此標志附加到 npm install 命令,我們將僅從 dependencies 安裝軟件包,從而將 node_modules 的大小大大減小到應用程序正常運行所必需的大小。——不應該將 devDependencies 引入生產環境!

npm ci

因此,如果 npm install --production 對于生產環境是最佳選項,那么是否必須有一個對本地環境,測試環境最合適的選項?

答案是 npm ci。

就像如果 package_lock.json 尚不存在于項目中一樣,無論何時調用 npm install 都會生成它,npm ci 會消耗該文件來下載項目所依賴的每個軟件包的確切版本。

這樣,無論是用于本地開發的筆記本電腦還是 Github Actions 等 CI(持續集成)構建環境,我們都可以確保項目上下文在不同機器上保持完全相同。

npm audit

隨著越來越多的軟件包發布,并且易于安裝,因此 npm 軟件包容易受到惡意作者的惡意攻擊,例如這些。

意識到生態系統存在問題,npm.js 組織提出了 npm audit 的主意。 他們維護了一個安全漏洞列表,開發人員可以使用 npm audit 命令來審核項目中的依賴項。

npm audit 為開發人員提供了有關漏洞以及是否有要修復的版本的信息,例如:

image-8

如果補救措施在下一個不間斷的版本升級中可用,則可以使用 npm audit fix 來自動升級受影響的依賴項的版本。

作者如何使用 NPM

我們已經了解了作為用戶,如何通過 NPM CLI 有效得使用 NPM,但是作為作者又如何使用呢?

npm publish
將軟件包發送到 npmjs.com 非常容易,因為我們只需要運行 npm publish 。 棘手的部分(并非專門針對 npm 軟件包作者)是確定軟件包的版本。

根據 semver.org 的經驗法則:

當你進行不兼容的 API 更改時使用 MAJOR 版本
以向后兼容的方式添加功能時使用 MINOR 版本
進行向后兼容的 bug 修復時使用 PATCH 版本

在發布軟件包時,遵循上述規則尤為重要,可以確保你不會破壞任何人的代碼,因為 npm 中匹配的默認版本是^(又稱下一個次版本)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166331.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166331.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166331.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前k個高頻單詞(C++實現)

前k個高頻單詞 題目思路代碼代碼講解 題目 思路 通過統計字符串的出現次數,并根據出現次數和字典序對字符串進行排序,找出出現頻率最高的前k個字符串。使用一個自定義的仿函數作為排序的比較函數,通過map容器進行統計,然后將結果…

Linux:strace 簡介

文章目錄 1. 前言2. 什么是 strace ?3. 使用 strace3.1 追蹤指定進程3.1.1 通過程序名追蹤進程3.1.2 通過 進程 ID (PID) 追蹤程序3.1.3 追蹤 子進程 或 線程 3.2 系統調用情況統計3.3 追蹤過濾3.3.1 追蹤指定的系統調用集合3.3.2 追蹤對指定文件句柄集合操作的系統調用3.3.3 …

前端已死?看看我的秋招上岸歷程

背景 求職方向:web前端 技術棧:vue2、springboot(學校開過課,簡單的學習過) 實習經歷:兩段,但都是實訓類的,說白了就是類似培訓,每次面試官問起時我也會坦誠交代&…

關于鴻蒙網絡請求的問題

https://developer.huawei.com/consumer/cn/forum/topic/0204136145853212268?fid0102683795438680754 鴻蒙OS 代碼 import http from ohos.net.http;export const httpUtils (url: string, data: any) > {return new Promise((resolve, reject) > {let httpRequest …

創意設計與個性化定制:酒精壁爐的獨特之處

在當今家居裝飾的潮流中,人們越來越注重個性化和創意,而酒精壁爐正是在這一趨勢中嶄露頭角。它不僅成為家居的溫馨之選,更因其設計的靈活性而成為創意焦點,吸引了越來越多注重家居設計的人群。 酒精壁爐的設計靈活性為家居注入了新…

vue的package.json詳細說明

前言 package.json 文件是一個非常重要的文件,它用于存儲關于項目的元信息以及依賴項。在 Vue.js 項目中,package.json 文件描述了項目的名稱、版本、描述、作者、依賴項、腳本命令等信息。 說明 package.json 文件常見的 詳細說明: 1.名稱 (name): 項目的名稱。遵循反向…

工作流引擎架構設計

一個應用MIS的系統的架構離不開工作流引擎,具有流程引擎思維的架構人員設計系統的時候就有流程的思維,他區別于過程思維,過程思維開發出來的系統,用戶面對的是菜單、模塊。而流程思維設計出來的系統就是發起、待辦、在途、查詢、近…

SELinux refpolicy詳解(2)

接前一篇文章:SELinux refpolicy詳解(1) 本文內容引自: Documentation SELinuxProject/refpolicy Wiki GitHub 4. 入門指南 文檔是參考策略的主要目標之一。入門指南(https://github.com/SELinuxProject/refpolicy/wiki/GettingStarted)提供了有關編寫參考策略模塊的…

關于vue3項目中 vite.config.js項目配置 多個請求地址代理配置

關于VUE3 vite.config.js文件配置相關 提示:本文記錄了我們項目中使用到了多個不同的接口請求前綴地址配置代理,如果有更好的優化方案歡迎大佬指點呀: 以下是我最近項目中的vite.config.js文件配置,由于剛開始vue3不久&#xff…

JS 類型轉換機制

這篇寫得不錯: 百度安全驗證 包括顯示轉換(就是調用函數)、隱式轉換(運算符 - 時自動轉換成數字/字符串) 注意到: abc-1 //NaN 非法字符轉換為數字 結果是NaN

LeetCode 1410. HTML 實體解析器:字符串匹配

【LetMeFly】1410.HTML 實體解析器:字符串匹配 力扣題目鏈接:https://leetcode.cn/problems/html-entity-parser/ 「HTML 實體解析器」 是一種特殊的解析器,它將 HTML 代碼作為輸入,并用字符本身替換掉所有這些特殊的字符實體。…

【點云surface】基于多項式重建的平滑和法線估計

1 介紹 基于多項式重建的平滑和法線估計(Smoothing and normal estimation based on polynomial reconstruction)是一種常用的點云處理方法,用于平滑點云數據并估計每個點的法線信息。 該方法基于Moving Least Squares(MLS&…

docker安裝nacos,實現和mysql容器的通信

1.下載nacos鏡像 docker pull nacos/nacos-server2. 啟動nacos 啟動命令如下: docker run -d -p 8848:8848 --name nacos \ -e JVM_XMS256m \ -e JVM_XMX256m \ -e MODEstandalone \ -e SPRING_DATASOURCE_PLATFORMmysql \ -e MYSQL_SERVICE_HOST192.168.131.223…

連接的原理(待修改)

搞數據庫?個避不開的概念就是Join,翻譯成中?就是連接。 相信很多?伙伴在初學連接的時候有些?臉懵逼,理解了連接的語義之后?可能不明?各個表中的記 錄到底是怎么連起來的,以?于在使?的時候常常陷?下邊兩種誤區: 誤區?&…

linux磁盤清理

目錄 排查過程1、查看磁盤占用情況2. 按照占用大小進行倒排-當前目錄及其子目錄3.當前目錄磁盤占用情況 清理命令 排查過程 1、查看磁盤占用情況 df -hdf -h 命令用于顯示磁盤空間的使用情況,以人類可讀的方式呈現,其中:df 是 “disk free”…

“AI就緒”新計劃,亞馬遜云科技到2025年向200萬人提供免費AI技能培訓

AI就緒(AI Ready)計劃 到2025年為全球200萬人提供 免費人工智能(AI)技能培訓和教育資源 亞馬遜云科技宣布啟動“AI就緒(AI Ready)”計劃,旨在到2025年為全球200萬人提供免費人工智能&#xff08…

Python與設計模式--適配器模式

7-Python與設計模式–適配器模式 一、外包人員系統兼容 假設某公司A與某公司B需要合作,公司A需要訪問公司B的人員信息,但公司A與公司B協議接口不同, 該如何處理?先將公司A和公司B針對各自的人員信息訪問系統封裝了對象接口。cla…

易點易動固定資產管理系統:全生命周期管理的理想選擇

在現代企業中,固定資產管理是一項至關重要的任務。為了確保企業的資產安全、提高資產利用率,全面管理固定資產的生命周期至關重要。易點易動固定資產管理系統為企業提供了一種全面的解決方案,實現了從固定資產申購、采購、入庫、領用、退庫、…

linux 內存回收mglru算法代碼注釋2

mglru與原lru算法的兼容 舊的lru算法有active與inactive兩代lru,可參考linux 內存回收代碼注釋(未實現多代lru版本)-CSDN博客 新的算法在引入4代lru的同時,還引入了tier的概念。 新舊算法的切換的實現在lru_gen_change_state&a…

ELK企業級日志分析平臺——elasticsearch

集群部署 文檔:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/index.html 下載:https://elasticsearch.cn/download/ 主機 ip 角色 k8s1 192.168.92.11 cerebro elk1 192.168.92.31 elasticsearch elk2 192.168.92.32 elasti…