非常教程

npm参考手册

入门

了解包和模块

Node.js和npm具有非常具体的包和模块定义,很容易混淆。我们将在这里讨论这些定义,使它们区别开来,并解释为什么某些默认文件以它们的方式命名。

快速摘要

  • 是受所描述的一个文件或目录package.json。这可能以一系列不同的方式发生!有关详细信息,请参阅下面的 “什么是 package?”。
  • 一个模块是可以通过Node.js的加载任何文件或目录 require()。同样,有几种配置允许这种情况发生。有关详细信息,请参阅“什么是 module?” ,下面。

什么是package

包是以下任何一种:

  • a)包含由package.json文件描述的程序的文件夹。
  • b)含有(a)的压缩的压缩球。
  • c)解析为(b)的网址。
  • d)<name>@<version>与(c)一起在登记处公布的A.
  • e)A <name>@<tag>指向(d)。
  • f)<name>具有latest满足(e)的标签的A.
  • g)git克隆时产生(a)的网址。

注意到所有这些package可能性,即使您从未将包发布到公共注册表,您仍然可以获得使用npm的许多好处:

  • 如果您只想编写节点程序,和/或,
  • 如果您还希望能够在将其打包成tarball后轻松地将其安装在别处。

Git网址可以是以下形式:

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可以是任何标签,沙,或分支可以作为参数被供给git checkout。默认是master

什么是module

模块是可以require()在Node.js程序中加载的任何模块。以下是可以作为模块加载的所有事例:

  • package.json包含main字段的文件的文件夹。
  • 包含index.js文件的文件夹。
  • 一个JavaScript文件。

大多数npm包都是模块

通常,加载Node.js程序中使用的npm包require,使它们成为模块。但是,并不要求npm包是一个模块!

某些包(例如cli包)仅包含可执行的命令行界面,并且不提供main在Node.js程序中使用的字段。这些包不是模块。

几乎所有的npm软件包(至少是那些节点程序) 都包含很多模块(因为它们加载的每个文件 require()都是一个模块)。

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

var req = require('request')

我们可能会说“变量req指的是request模块”。

Node.js和npm生态系统中的文件和目录名称

那么,为什么它是node_modules文件夹,但package.json文件?为什么不node_packagesmodule.json

package.json文件定义了包。(参见 上文“什么是 package?”。)

node_modules文件夹是Node.js查找模块的位置。(参见上文“什么是 module?”。)

例如,如果您创建了一个文件,node_modules/foo.js然后有一个程序var f = require('foo.js'),它将加载该模块。但是,foo.js在这种情况下,它不是“包”,因为它没有package.json

或者,如果您创建的文件包中没有 index.js或包含"main"字段package.json,则它不是模块。即使它被安装node_modules,它也不能成为一个参数require()