了解包和模块
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_packages
和module.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()
。
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com