了解包和模块
了解包和模块
Node.js和npm具有非常具体的包和模块定义,很容易混淆。我们将在这里讨论这些定义,使它们区别开来,并解释为什么某些默认文件以它们的方式命名。
快速摘要
- 甲
包
是受所描述的一个文件或目录package.json
。这可能以一系列不同的方式发生!有关详细信息,请参阅下面的 “什么是 package?”。
什么是package?
包是以下任何一种:
- a)包含由
package.json
文件描述的程序的文件夹。
注意到所有这些package
可能性,即使您从未将包发布到公共注册表,您仍然可以获得使用npm的许多好处:
- 如果您只想编写节点程序,和/或,
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
字段的文件的文件夹。
大多数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()
。