NPM基本操作總結(jié)

NPM官方文檔寫的十分良心,此篇我做一些比較常用功能的積累,有些地方是翻譯,有些地方省略可以去官文看。

NPM是什么?

npm是世界上最大的軟件注冊(cè)表,
npm由3個(gè)獨(dú)立的部分組成:

  • 網(wǎng)站:開發(fā)者查找包,設(shè)置參數(shù)以及管理npm使用體驗(yàn)的途徑
  • 注冊(cè)表(registry):是一個(gè)巨大的數(shù)據(jù)庫(kù),保存了每個(gè)包的信息
  • 命令行工具(CLI):終端,使用者通過(guò)cli操作npm

NPM可以做什么?

  • 為你的項(xiàng)目引入packages
  • 下載你可以立即使用的獨(dú)立的工具
  • 在任何地點(diǎn)和npm user 共享代碼
  • 設(shè)定代碼開發(fā)權(quán)限
  • 組件虛擬團(tuán)隊(duì)
  • 管理代碼版本和依賴
  • 當(dāng)?shù)讓哟a更新時(shí),輕松的更新應(yīng)用程序
  • 為難題找到多種解決途徑
  • 找到和你解決同一個(gè)問(wèn)題的伙伴

安裝npm 并管理npm版本

npm是用node.js編寫的 ,首先要在電腦里安裝node 環(huán)境,去node官網(wǎng)下載LTS(long time support )版本。
安裝之后,run node -v
更新:
npm會(huì)在安裝nodejs之后自動(dòng)安裝,通常npm的更新比node 更加頻繁,確保你時(shí)刻是最新版本。
當(dāng)前版本:npm -v
升級(jí):npm install npm@latest -g

nvm

由于npm和node.js產(chǎn)品由不同的實(shí)體管理,因此更新和維護(hù)可能變得復(fù)雜。 此外,Node.js安裝過(guò)程將npm安裝在僅具有本地權(quán)限的目錄中。 當(dāng)您嘗試全局運(yùn)行包時(shí),這可能會(huì)導(dǎo)致權(quán)限錯(cuò)誤。為了解決這兩個(gè)問(wèn)題,許多開發(fā)人員選擇使用版本管理器或nvm來(lái)安裝npm。 版本管理器將避免權(quán)限錯(cuò)誤,并將解決更新Node.js和npm的復(fù)雜性。

如何防止權(quán)限錯(cuò)誤

當(dāng)全局安裝包時(shí)發(fā)生EACCES錯(cuò)誤,看官方文檔吧。
https://www.npmjs.com.cn/getting-started/fixing-npm-permissions/

如何安裝本地包

  • 本地安裝 (模塊依賴并通過(guò)require加載,命令的默認(rèn)行為)
  • 全局安裝(將包作為一個(gè)命令行工具 比如gruntCLI)
    選擇哪種方式安裝,取決于我如何使用這個(gè)包
    npm install <packagename>
    執(zhí)行上面這句產(chǎn)出node_modules文件夾

使用 package.json

package.json文件:

  • 列舉了項(xiàng)目所有依賴
  • 允許指定項(xiàng)目使用的包的版本
  • 使構(gòu)建過(guò)程可重現(xiàn),更容易與其他開發(fā)同學(xué)共享
    package.json命名規(guī)則:
    “name”:小寫字母,一個(gè)單詞,不可以有空白字符,可以用破折號(hào)或下劃線。
    “version”:"1.2.3"
    創(chuàng)建package.json文件:
    npm initnpm init --yes
    區(qū)別是第一個(gè)會(huì)挨個(gè)字段詢問(wèn)答完一份調(diào)查問(wèn)卷,--yes生成默認(rèn)的文件
    可以自定義一些字段比如:
npm set init.author.email "songleyigg@gmail.com"
npm set init.author.name "songleyi"
npm set init.license "MIT"

文檔詳述了如何定制調(diào)查問(wèn)卷,我不太需要這塊暫不贅述,知道可以定制就可以了。

如何更新本地安裝的包

1.在 package.json文件所在目錄執(zhí)行npm update命令
2.再執(zhí)行npm outdated不應(yīng)該有任何輸出

如何卸載本地安裝的包

刪除node_modules目錄下的package
npm uninstall <package>
如需從package.json中刪除依賴
npm uninstall --save <package>
注意:如果你將安裝的包作為 "devDependency"(也就是通過(guò) --save-dev 參數(shù)保存的),那么 --save 無(wú)法將其從 package.json 文件中刪除。所以必須通過(guò) --save-dev 參數(shù)可以將其卸載。

更新全局包

npm update -g <package>
檢查哪些包過(guò)期
npm outdated -g --depth=0
更新所有全局包
npm update -g

卸載全局包

npm uninstall -g <package>

如何創(chuàng)建node.js模塊(發(fā)包)

node.js模塊是可以發(fā)布到npm的包,當(dāng)你創(chuàng)建一個(gè)新模塊時(shí),創(chuàng)建package.json是第一步。
1.npm init 創(chuàng)建package.json文件(name ,version 必填)-->2.index.js(模塊的入口文件)-->3.在index.js中添加一個(gè)函數(shù),作為exports對(duì)象的一個(gè)屬性--->4.require此文件之后,這個(gè)函數(shù)在其他代碼中可用。

exports.printMsg = function(){
console.log("2018/11/6");
}

如何發(fā)布或者更新package(發(fā)包)

任何含有package.json的文件夾都可以被發(fā)布。

怎樣發(fā)包

1.了解規(guī)則

開始之前,最好去看下npm政策,去了解網(wǎng)站的規(guī)則,命名規(guī)則,權(quán)限之類的限制。

2.創(chuàng)建一個(gè)用戶賬戶

如果想發(fā)包,首先你必須是npm的注冊(cè)用戶。
假如不是,用npm adduser創(chuàng)建一個(gè),是的話直接login。
terminal:
測(cè)試自己是否已經(jīng)登錄npm whoami
注冊(cè)npm adduser
登錄npm login
終端操作之后登錄https://npmjs.com/~username就能看到你自己的賬戶。

3.確定package里面涵蓋了你想要的所有信息。

包名:
名字不能重復(fù),盡量描述性。
規(guī)定:

  • 不能重名
  • 拼寫也不要像似,容易拼寫錯(cuò)誤。
  • 你的名字不要讓人誤解不知道它的作者是誰(shuí)。
  • 符合npm政策指南。 例如,不要將您的包命名為冒犯性的,也不要使用其他人的商標(biāo)名稱。
  • 在package.json文件的相應(yīng)行中指定名稱。
  • 如果你使用scope,前三條不適用。

包含readme.md文檔

npm建議你在文件夾里包含一個(gè)readme文件來(lái)記錄解釋你的package溫建名規(guī)定叫readme.md,擴(kuò)展名.md表明它是一個(gè)markdown文件,當(dāng)有人搜索到你的package時(shí),這個(gè)文檔將會(huì)在npm網(wǎng)站上展現(xiàn)。
開始之前,看看人家的readme是怎么寫的,理解他的重要性。

  1. 創(chuàng)建一個(gè)文件,用什么editor都行。
    2.將它命名為readme.md,存在項(xiàng)目文件夾里。
    3.發(fā)布之后,人們想要download你的package時(shí)會(huì)看到它。

發(fā)布啦!

npm publish
Use npm publish to publish the package.
https://npmjs.com/package/<package>就能看到你發(fā)的包了啊。

怎么update

改版本號(hào):
npm version <update_type>
其中<update_type>是語(yǔ)義版本控制版本之一,補(bǔ)丁,次要或主要版本。
這句命令會(huì)改變package.json里面的版本號(hào)。
如果關(guān)聯(lián)了git,這也會(huì)將更新后的版本號(hào)添加到您的git存儲(chǔ)庫(kù)中。
更新之后,再次runnpm publish
https://npmjs.com/package/<package>檢查版本號(hào)應(yīng)該已經(jīng)被更新。

怎么更新readme

npm version patch
npm publish

如何使用語(yǔ)義化版本

在新版本的代碼中說(shuō)明更改的范圍非常重要,因?yàn)橛袝r(shí)更新會(huì)影響到package之間的依賴關(guān)系,語(yǔ)義版本控制(semver)是旨在解決此問(wèn)題的標(biāo)準(zhǔn)。

Semver for publishers

如果你的項(xiàng)目要和別人分享,版本應(yīng)該從1.0.0開始。
大小版本號(hào)更新按照如下的規(guī)矩:


image.png

如何使用scoped的包

需要npm版本在2以上

scope用來(lái)把相關(guān)聯(lián)的包分組管理,為npm modules創(chuàng)建命名空間,比如一個(gè)domain。
名字以@開頭的package是scoped package.范圍是@和斜杠之間的所有內(nèi)容。
例如:
@username/project-name每個(gè)npm用戶都有他自己的scope
想學(xué)習(xí)更多的scope相關(guān)知識(shí),去這里https://docs.npmjs.com/misc/scope#publishing-public-scoped-packages-to-the-public-npm-registry

怎么初始化scoped package
{
  "name":"@username/project-name"
}

如果使用npm init,可以使用命令行添加。
npm init --scope=username
如果您始終使用相同的范圍,則可能需要在.npmrc文件中設(shè)置此選項(xiàng)。
npm config set scope username

發(fā)布scoped package

默認(rèn)情況下,scoped package是私有的,想發(fā)私有module 的話,需要充值成為私有模塊用戶~~~~~emm
公共范圍模塊是免費(fèi)的,不需要付費(fèi)訂閱。 要發(fā)布公共范圍模塊,請(qǐng)?jiān)诎l(fā)布時(shí)設(shè)置訪問(wèn)選項(xiàng)。 此選項(xiàng)將保留為所有后續(xù)發(fā)布設(shè)置。
npm publish --access=public

使用scoped package

要使用scoped package ,只要當(dāng)使用包的時(shí)候在名稱里加上范圍。
package.json

{
  "dependencies":{
      "@username/project-name":"1.0.0"
    }
}

終端輸入:
npm install @username/project-name --save
引用時(shí):

var projectName = require ("@username/project-name")

如何使用dist-tag標(biāo)記包

分布標(biāo)簽(dist-tags)補(bǔ)充語(yǔ)義版本控制(例如,v0.12)。 使用它們來(lái)組織和標(biāo)記不同版本的包。 除了比semver編號(hào)更具人性可讀性之外,標(biāo)簽還允許發(fā)布者更有效地分發(fā)他們的包。

添加tag

將標(biāo)記添加到包的特定版本:
npm dist-tag add <pkg>@<version> [<tag>]

使用標(biāo)簽發(fā)布:

默認(rèn)情況下,npm發(fā)包會(huì)使用最近一次的tag。如果你使用--tag標(biāo)記,你可以指定一個(gè)tag使用。例如:
npm publish --tag beta

使用標(biāo)簽install

同publish,npm install<pkg>默認(rèn)使用最近一次的tag
。要重載此行為,使用:
npm install <pkg>@<tag>.
例如npm install somepkg@beta

注意事項(xiàng)

由于dist-tag與semver共享命名空間,為了避免沖突,最優(yōu)的做法是避免使用數(shù)字或字母V作為tag的首字符。

Understanding Packages and Modules

Node.js和npm具有非常具體的包和模塊定義,很容易混淆。 我們將在這里討論這些定義,使它們區(qū)別開來(lái),并解釋為什么某些默認(rèn)文件以它們的方式命名。

快速摘要

package:

package 是一個(gè)被package.json描述的文件或目錄,它有很多種存在方式。
package可以是以下任何一種:

  • (a)包含package.json文件描述的程序的文件夾。
  • (b)包含a的壓縮包
  • (c)解析為b的地址
  • (d)使用(c)在注冊(cè)表上發(fā)布的<name> @ <version>。
  • (e)指向(d)的<name> @ <tag>。
  • (f)具有滿足(e)的最新標(biāo)簽的<name>。
  • (g)一個(gè)git url,當(dāng)克隆時(shí),會(huì)產(chǎn)生(a)。
    注意到所有這些軟件包的可能性,即使您從未將軟件包發(fā)布到公共注冊(cè)表,您仍然可以獲得使用npm的許多好處:

module:

module是Node.js的require()可以加載的任何文件或目錄。 同樣,有幾種配置允許這種情況發(fā)生。
module可以是以下任何一種:

  • 包含主要字段的package.json文件的文件夾。
  • 其中包含index.js文件的文件夾。
  • 一個(gè)js文件。
大部分npm package 是 modules

通常,在node.js項(xiàng)目里面通過(guò)require來(lái)load packages,使他們成為modules,但是不要求npm packages是modules。
某些包(例如cli包)僅包含可執(zhí)行的命令行界面,并且不提供在Node.js程序中使用的主要字段。 這些包不是模塊。
幾乎所有的包都包(packages)含很多的模塊(modules)。
在Node程序的上下文中,模塊也是從文件加載的東西。 例如,在以下程序中:

var req = require('request')

變量req就是引入的request模塊。

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

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

  • 描述 npm從以下來(lái)源獲取配置值,按優(yōu)先級(jí)排序: 命令行標(biāo)記 在命令行上放置--foo bar設(shè)置foo配置參數(shù)為...
    竹天亮閱讀 44,494評(píng)論 0 8
  • 什么是 NPM npm之于Node,就像pip之于Python,gem之于Ruby,composer之于PHP。 ...
    ihoey閱讀 6,362評(píng)論 2 36
  • npm是什么 NPM的全稱是Node Package Manager,是隨同NodeJS一起安裝的包管理和分發(fā)工具...
    build1024閱讀 8,124評(píng)論 0 9
  • 本文參考:2018 年了,你還是只會(huì) npm install 嗎?npm 官方文檔package.json文件 -...
    雙面小Q閱讀 4,943評(píng)論 1 9
  • 喜愛的一個(gè)作家這樣寫過(guò),“大多數(shù)人都好像一片落葉,在空中飄舞、翻卷,搖搖擺擺地落到地面上??墒且灿幸恍┤?,為數(shù)不多...
    theunicole閱讀 436評(píng)論 0 0

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