npm 包和模塊的了解

2024-04-26 09:54 更新

Node.js 和 npm 對包和模塊有非常具體的定義,很容易混淆。我們將在這里討論它們的定義以及他們之間的不同,并解釋為什么某些默認(rèn)文件以它們的方式命名。

快速總結(jié)

  • 包是通過package.json描述的一個(gè)文件或目錄。這可能以多種不同的方式發(fā)生!有關(guān)更多信息,請參閱下面的“什么是包??”。
  • 模塊是可以通過Node.js的?require()加載任何文件或目錄。同樣,有幾種配置允許這種情況發(fā)生。有關(guān)詳細(xì)信息,請參閱下面的“什么是模塊?”?。

什么是包(package)?

包是以下任何一種:

  • a) 包含由package.json文件描述的程序的文件夾
  • b) 包含(a)的gzip壓縮包。
  • c) 解析為(b)的url
  • d) 使用(c)在注冊表上發(fā)布的<name>@<version>
  • e) 指向(d)的<name>@<tag>
  • f) 具有latest滿足(e)的標(biāo)簽<name>。
  • g) 一個(gè) git?url, 當(dāng)克隆時(shí),結(jié)果為 (a).

注意到所有這些package可能性,即使你從未將包發(fā)布到公共注冊表,你仍然可以從使用 npm 中獲得很多好處:

  • 如果只想編寫一個(gè)節(jié)點(diǎn)程序,和/或,
  • 如果還希望能夠在將其打包成 tarball 后輕松地將其安裝到其他地方。

Git 網(wǎng)址可以采用以下形式:

git://github.com/user/project.git#commit-ish
git+ssh://user@hostname:project.git#commit-ish
git+http://user@hostname/project/blah.git#commit-ish
git+https://user@hostname/project/blah.git#commit-ish

commit-ish可以是任何標(biāo)簽,sha,或分支可以作為參數(shù)被供給git checkout。默認(rèn)值為master.

什么是模塊(module)?

模塊是可以require()在 Node.js 程序中加載的任何東西。以下是可以作為模塊加載的所有示例:

  • package.json包包含main字段的文件的文件夾。
  • 一個(gè)文件夾,里面有一個(gè)index.js文件。
  • 一個(gè) JavaScript 文件。

大多數(shù) npm 包都是模塊

通常,在 Node.js 程序中使用的 npm 包通過 加載require,使它們成為模塊。然而,沒有要求 npm 包是一個(gè)模塊!

一些包,例如cli包,只包含一個(gè)可執(zhí)行的命令行界面,不提供main在 Node.js 程序中使用的字段。這些包不是模塊。

幾乎所有的 npm 包(至少,那些是 Node 程序的包)?都包含許多模塊(因?yàn)樗鼈兗虞d的每個(gè)文件?require()都是一個(gè)模塊)。

在 Node 程序的上下文中,module也是從文件加載的東西。例如,在以下程序中:

var req = require('request')

我們可能會說“變量req是指request模塊”。

Node.js 和 npm 生態(tài)系統(tǒng)中的文件和目錄名稱

那么,為什么是node_modules文件夾和package.json文件?為什么不是node_packages或者module.json?

package.json文件定義了包。(參見上面的?“什么是包??”

node_modules文件夾是 Node.js 查找模塊的地方。(參見上面的“什么是模塊?”

例如,如果你在node_modules/foo.js創(chuàng)建一個(gè)文件,然后有一個(gè)執(zhí)行var f = require('foo.js')的程序,它將加載該模塊。但是,foo.js在這種情況下不是“包”,因?yàn)樗鼪]有 package.json

或者,如果你創(chuàng)建的包在文件中沒有?index.js"main"字段package.json,則它不是模塊。即使它安裝在 中node_modules,也不能成為require().node_modules

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號