NPM的使用

1.npm是Node官方提供的包管理工具,他已經(jīng)成了Node包的標準發(fā)布平臺,用于Node包的發(fā)布、傳播、依賴控制。npm提供了命令行工具,使你可以方便地下載、安裝、升級、刪除包,也可以讓你作為開發(fā)者發(fā)布并維護包。隨著大前端技術(shù)React,webpack,Vue等的發(fā)展,它的定義變成了廣義的包管理器,可以實現(xiàn)JavaScript,webpack,Vue,JQuery,Gulp等包或者模塊管理,是目前開源里最大生態(tài)最健全的包管理器

npm是隨同Node一起安裝的包管理工具,能解決Node.js在模塊管理上的很多問題,常見的場景有以下幾種:

1.允許用戶從npm服務(wù)器下載別人編寫的第三方包到本地使用。

2.允許用戶從npm服務(wù)器下載并安裝別人編寫的命令行程序到本地使用。

3.允許用戶將自己編寫的包或命令行程序上傳到npm服務(wù)器供別人使用。

我們只要一行命令,就能安裝別人寫好的模塊 。

安裝

安裝NPM

由于新版的nodejs已經(jīng)集成了npm,所以之前npm也一并安裝好了。

?"npm -v" ---查看NPM版本

npm install npm@latest -g.

npm install npm@next -g.

安裝指定版本:npm install npm@4.0.1 -g

NPM版本介紹

NPM v2:典型的樹形依賴,層次深依賴重疊,安裝時間長(node V5以下)?

NPM v3:扁平化依賴,將依賴移到了頂層,下載速度快不少,當依賴多個版本時采用NPM v2的方式

npm必須首先遍歷所有的項目依賴關(guān)系,然后再決定如何生成扁平的node_modules目錄結(jié)構(gòu)。npm必須為所有使用到的模塊構(gòu)建一個完整的依賴關(guān)系樹,這是一個耗時的操作,是npm安裝速度慢的一個很重要的原因

圖------------------

NPM v5:自動記錄依賴書,下載使用強校驗,重寫緩存系統(tǒng),代表性的改動:新增了package-json.json用于記錄和鎖定依賴信息,與Yarn類似

將開發(fā)者從繁瑣的包管理工作(版本、依賴等)中解放出來,更加專注于功能的開發(fā)。

NPM安裝模塊

$ npm install <Module Name>

npm install --選項

本地:

? ? 無選項:不保存在packjson里

? ? --save-prod(--save或-P) :?package.json, Dependencies

? ? --save-dev:package.json,devDependencies(?為避免引用模塊消失,多人協(xié)同開發(fā),保證依賴模塊出現(xiàn)在package.json里,--save是好習慣)

????本地使用:var?lodash?=?require('lodash'); 無需指定第三方包路徑

全局

?--global(-g)安裝的模塊是全局模塊,如果是命令行模塊,會直接連接到環(huán)境變量里

兩者兼有:需要在兩個地方安裝它或使用?npm link

npm提供了一個有趣的命令npm link,它的功能是在本地包和全局包之間創(chuàng)建符號鏈接。

我們說過使用全局模式安裝的包不能直接通過require使用。但通過npm link命令可以打破這一限制。

舉個例子,我們已經(jīng)通過npm install -g express安裝了express,這時在工程的目錄下運行命令:

npm link express ./node_modules/express ->/user/local/lib/node_modules/express

我們可以在node_modules子目錄中發(fā)現(xiàn)一個指向安裝到全局的包的符號鏈接。通過這種方法,我們就可以把全局包當做本地包來使用了。 除了將全局的包鏈接到本地以外,使用npm link命令還可以將本地的包鏈接到全局。

使用方法是在包目錄(package.json所在目錄)中運行npm link命令。如果我們要開發(fā)一個包,利用這種方法可以非常方便地在不同的工程間進行測試。



語義化的版本號:

語義版本號分為X.Y.Z三位,分別代表主版本號、次版本號和補丁版本號。當代碼變更時,版本號按以下原則更新。

補丁版本,解決了bug或者一些較小的更改,增加最后一位數(shù)字,如:1.0.1

小版本,增加了新特性,同時不會影響之前的版本,增加中間一位數(shù)據(jù),如:1.1.0

大版本,大改版,無法兼容之前的版本,增加第一位數(shù)字,如:2.0.0

~會匹配最近的小版本依賴包,比如~1.2.3會匹配所有1.2.x版本,但是不包括1.3.0

^會匹配最新的大版本依賴包,比如^1.2.3會匹配所有1.x.x的包,包括1.3.0,但是不包括2.0.0

*會安裝最新版本的依賴包

使用方案:

指定特定的版本號,直接寫1.2.3,前面什么前綴都沒有,這樣固然沒問題,但是如果依賴包發(fā)布新版本修復了一些小bug,那么需要手動修改package.json文件;~和^則可以解決這個問題。但是需要注意^版本更新可能比較大,會造成項目代碼錯誤,所以建議使用~來標記版本號,這樣可以保證項目不會出現(xiàn)大的問題,也能保證包中的小bug可以得到修復。版本號寫*,這意味著安裝最新版本的依賴包,但缺點同上,可能會造成版本不兼容,慎用!

Working with package.json

npm init新建一個package.json:使用-f(代表force)、-y(代表yes),則跳過提問階段

或者使用

npm set

npm set用來設(shè)置環(huán)境變量

$ npmsetinit-author-name'Your name'

$ npmsetinit-author-email'Your email'

$ npmsetinit-author-url'http://yourdomain.com'$ npmsetinit-license'MIT'

上面命令等于為npm init設(shè)置了默認值,以后執(zhí)行npm init的時候,package.json的作者姓名、郵件、主頁、許可證字段就會自動寫入預設(shè)的值。這些信息會存放在用戶主目錄的~/.npmrc文件,使得用戶不用每個項目都輸入。

dependencies:--save

應(yīng)用能夠正常運行所依賴的包。這種 dependencies 是最常見的,用戶在使用 npm install 安裝你的包時會自動安裝這些依賴。

devDependencies:--save-dev

開發(fā)應(yīng)用時所依賴的工具包。通常是一些開發(fā)、測試、打包工具,例如 webpack、ESLint、Mocha。應(yīng)用正常運行并不依賴于這些包,用戶在使用 npm install 安裝你的包時也不會安裝這些依賴。

當項目正式上線的時候,開發(fā)依賴可以刪除,生產(chǎn)依賴不可以刪除。

npm不僅可以用于模塊管理,還可以用于執(zhí)行腳本。package.json文件有一個scripts字段,可以用于指定腳本命令,供npm直接調(diào)用

更新

npm outdated 查看有哪些過時的軟件包

npm update <packageName>(禁止不加packageName)

npm install 版本號

更新的原理:

NPM組成三部分中包括歐注冊表:?是一個巨大的數(shù)據(jù)庫,保存了每個包(package)的信息

https://registry.npmjs.org/react/v0.14.6

返回的 JSON 對象里面,有一個dist.tarball屬性,是該版本壓縮包的網(wǎng)址。

模塊的安裝過程

發(fā)出npm install命令

npm 向 registry 查詢模塊壓縮包的網(wǎng)址

下載壓縮包,存放在~/.npm目錄

解壓壓縮包到當前項目的node_modules目錄

卸載:

npm uninstall (-g)<packageName>

對比

NRM:

nrm(npm registry manager )是npm的鏡像源管理工具

npm install -g nrm

nrm ls? ? ? ? ? ? ? ?

nrm test 測速:國內(nèi)CNPM和taobao更有優(yōu)勢,尤其在阿里云上部署時

nrm use taobao

npm yarn pnpm cnpm

nrm?add yourcompany http://registry.npm.yourcompany.com/

內(nèi)網(wǎng)部署NPM源的好處:

1.安裝速度快

2.私有模塊,僅供企業(yè)內(nèi)部使用,更安全

3.適合多團隊開發(fā)


CNPM?

cnpm跟npm用法完全一致,只是在執(zhí)行命令時將npm改為cnpm。

npm安裝插件是從國外服務(wù)器下載,受網(wǎng)絡(luò)影響大,可能出現(xiàn)異常,如果npm的服務(wù)器在中國就好了,于是淘寶團隊干了這事。來自官網(wǎng):“這是一個完整 npmjs.org 鏡像,你可以用此代替官方版本(只讀),同步頻率目前為 10分鐘 一次以保證盡量與官方服務(wù)同步?!?/p>


NPM最大的問題:::

即使不同的開發(fā)人員使用了相同的package.json文件,在他們自己的機器上也可能會安裝同一個庫的不同種版本,這樣就會存在潛在的難以調(diào)試的錯誤和“在我的電腦上…”的情形。

大多數(shù)npm庫都嚴重依賴于其他npm庫,這會導致嵌套依賴關(guān)系,并增加無法匹配相應(yīng)版本的幾率。

雖然可以通過npm config set save-exact true命令關(guān)閉在版本號前面使用^的默認行為,但這個只會影響頂級依賴關(guān)系。由于每個依賴的庫都有自己的package.json文件,而在它們自己的依賴關(guān)系前面可能會有^符號,所以無法通過package.json文件為嵌套依賴的內(nèi)容提供保證。

為了解決這個問題,npm提供了shrinkwrap命令。此命令將生成一個npm-shrinkwrap.json文件,為所有庫和所有嵌套依賴的庫記錄確切的版本。


Yarn

Yarn發(fā)布于2016年10月

Yarn一開始的主要目標是解決上一節(jié)中描述的由于語義版本控制而導致的npm安裝的不確定性問題。雖然可以使用npm shrinkwrap來實現(xiàn)可預測的依賴關(guān)系樹,但它并不是默認選項,而是取決于所有的開發(fā)人員知道并且啟用這個選項。(npm5.0之前存在的問題)

Yarn采取了不同的做法。每個yarn安裝都會生成一個類似于npm-shrinkwrap.json的yarn.lock文件,而且它是默認創(chuàng)建的。除了常規(guī)信息之外,yarn.lock文件還包含要安裝的內(nèi)容的校驗和,以確保使用的庫的版本相同。

yarn是經(jīng)過重新設(shè)計的嶄新的npm客戶端,它能讓開發(fā)人員并行處理所有必須的操作,并添加了一些其他改進。

運行速度得到了顯著的提升,整個安裝時間也變得更少

pnpm

可閱讀pnpm的作者Zoltan Kochan發(fā)表的“為什么要用pnpm?

https://blog.csdn.net/cuk0051/article/details/108341552

pnpm采用了一種巧妙的方法,利用硬鏈接和符號鏈接來避免復制所有本地緩存源文件,這是yarn的最大的性能弱點之一

使用鏈接并不容易,會帶來一堆問題需要考慮。

pnpm繼承了yarn的所有優(yōu)點,包括離線模式和確定性安裝



創(chuàng)建NPM包

包是在模塊基礎(chǔ)上更深一步的抽象,Node的包類似于C/C++的函數(shù)庫或者Java、.Net的類庫。它將某個獨立的功能封裝起來,用于發(fā)布、更新、依賴管理和版本控制。

Node根據(jù)CommonJS規(guī)范實現(xiàn)了包機制,開發(fā)了npm來解決包的發(fā)布和獲取需求。

Node的包是一個目錄,其中包含了一個JSON格式的包說明文件package.json。

嚴格符合CommonJS規(guī)范的包應(yīng)該具備以下特征:

package.json必須在包的頂層目錄下;

二進制文件應(yīng)該在bin目錄下;

JavaScript代碼應(yīng)該在lib目錄下;

文檔應(yīng)該在doc目錄下;

單元測試應(yīng)該在test目錄下。

Node對包的要求并沒有這么嚴格,只要頂層目錄下有package.json,并符合一些規(guī)范即可。當然為了提高兼容性,我們還是建議你在制作包的時候,嚴格遵守CommonJS規(guī)范。

我們也可以把文件夾封裝為一個模塊,即所謂的包。包通常是一些模塊的集合,在模塊的基礎(chǔ)上提供了更高層的抽象,相當于提供了一些固定接口的函數(shù)庫。通過定制package.json,我們可以創(chuàng)建更復雜,更完善,更符合規(guī)范的包用于發(fā)布。

Node在調(diào)用某個包時,會首先檢查包中packgage.json文件的main字段,將其作為包的接口模塊,如果package.json或main字段不存在,會嘗試尋找 index.js 或 index.node 作為包的接口。

package.json是CommonJS規(guī)定的用來描述包的文件,完全符合規(guī)范的package.json文件應(yīng)該含有以下字段: name: 包的名字,必須是唯一的,由小寫英文字母、數(shù)字和下劃線組成,不能包含空格。

description: 包的簡要說明。

version: 符合語義化版本識別規(guī)范的版本字符串。

keywords: 關(guān)鍵字數(shù)組,通常用于搜索。

maintainers: 維護者數(shù)組,每個元素要包含name、email(可選)、web(可選)字段。

contributors: 貢獻者數(shù)組,格式與maintainers相同。包的作者應(yīng)該是貢獻者數(shù)組的第一個元素。

bugs: 提交bug的地址,可以是網(wǎng)址或者電子郵件地址。

licenses: 許可證數(shù)組,每個元素要包含type(許可證的名稱)和 url(鏈接到許可證文本的地址)字段。

repositories: 倉庫托管地址數(shù)組,每個元素要包含type(倉庫的類型,如 git)、URL(倉庫的地址)和 path(相對于倉庫的路徑,可選)字段。

dependencies: 包的依賴,一個關(guān)聯(lián)數(shù)組,由包名稱和版本號組成。

包的發(fā)布

通過使用npm init可以根據(jù)交互式回答產(chǎn)生一個符合標準的package.json。創(chuàng)建一個index.js作為包的接口,一個簡單的包就制作完成了。

在發(fā)布前,我們還需要獲得一個賬號用于今后維護自己的包,使用npm adduser根據(jù)提示完成賬號的創(chuàng)建 完成后可以使用npm whoami檢測是否已經(jīng)取得了賬號。

接下來,在package.json所在目錄下運行npm publish,稍等片刻就可以完成發(fā)布了,

打開瀏覽器,訪問NPM搜索就可以找到自己剛剛發(fā)布的包了。

現(xiàn)在我們可以在世界的任意一臺計算機上使用npm install neveryumodule命令來安裝它。

如果你的包將來有更新,只需要在package.json文件中修改version字段,然后重新使用npm publish命令就行了。

如果你對已發(fā)布的包不滿意,可以使用npm unpublish命令來取消發(fā)布。





使用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 3-1.npmj介紹和使用場景 NPM是隨同NodeJs一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問...
    讀書的魚閱讀 569評論 0 1
  • npm是 Node.js 官方提供的包管理工具,它已經(jīng)成了 Node.js 包的標準發(fā)布平臺,用于 Node.js...
    沈祥佑閱讀 1,077評論 0 3
  • 本文內(nèi)容基于 npm 4.0.5 概述 npm (node package manager),即 node 包管理...
    靜默虛空閱讀 2,342評論 0 8
  • NPM是隨同NodeJS一起安裝的包管理工具,能解決NodeJS代碼部署上的很多問題,常見的使用場景有以下幾種: ...
    街角仰望閱讀 512評論 0 0
  • npm是什么? npm是node.js的一個包管理工具,方便的使用第三方庫,無需每次新建一個項目而導入第三方JS庫...
    寫前端的大叔閱讀 313評論 0 0

友情鏈接更多精彩內(nèi)容