Node.js 和 npm 对于包和模块的定义,都有非常明确的定义,然后都是非常的容易造成混淆的。下面就来慢慢解释下。
摘要(Quick Summary)
包(package):package是一个使用package.json文件描述的文件或目录。
模块(Module):模块是任何的文件或目录可以被Node.js's的require().此外,几个配置文件允许这样发生 。
什么是package?可以是如下:
a) 一个目录包含一个程序,由package.json
b) 一个gzipped tarball(打包工具)包含(a)
c) 一个url处理(b)
d) 在(c)注册的账户,被发布的包<name>@<version>
e) A <name>@<tag> 指向(d)
f) 一个 <name> 有一个最新的标签满足(e)
g) 一个git url,当克隆的时候,会生成一个如下的包
注意所有这些包的可能性,即使你从来没有发布你的包到公共注册信息当中。你仍然会从npm中得到很多好处
- 如果你仅仅想写一个node程序
- 如果你想要能够在打包后轻易的安装
git url 将会使下列格式之一
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
The commit-ish can be any tag, sha, or branch which can be supplied as an argument to git checkout. The default is master.
什么是一个模块?
模块是一个可以在Node.js被require()加载的程序。如下是所有的例子:
1. 一个文件夹包含一个package.json 文件,并且package.json包含一个main字段
2. 一个包含index.js的文件夹
3. 一个Javascript文件
Most npm packages are modules
一般来说,npm包被用于Node.js程序当中,通过require()来加载,来使他们变成模块。可是,没有必要说一个npm package就是一个模块
一些包像:cli packages,仅仅包含可执行的命令行接口也并不包含用于Node.js程序的main字段。那么这些包就不是模块。
几乎所有的npm package都包含多个模块(因为每个通过require()加载的文件都是一个模块)
在Node程序的环境当中,模块也是可以从文件当中加载的:
var req = require( 'request' ); // req关联模块request
在Node.js中的文件和目录命令以及npm生态系统
所以,为什么是node_modules文件夹,而package.json文件呢?为什么不是node_packages或者module.json呢?
package.json文件定义package
目录node_modules文件夹是Node.js寻找模块的地方。
比如:你创建了一个node_modules/foo.js,然后有一个程序有这样一段代码:var f = require( "foo.js");, 那么它就会加载这个模块。可是,foo.js不是一个包因为它没有一个package.json的文件
另一种情况是,如果你创建一个没有index.js文件的包,或者package.json文件没有main字段,那么这就不是一个模块。即使它被安装在node_modules当中,也不能被require()加载
网友评论