Node.js(npm)中的包和模块

 2016年04月08日    194     声明


Node.js 基于npm包管理系统,建立了强大的模块生态圈。在Node.jsnpm中,对包(package)和模块(module)有非常具体的定义,但我们确经常将它们混淆。本文根据个人经验并参照官方文档,解释和讨论二者的异同。


  1. 包和模块的定义
  2. 什么是包
  3. 什么是模块

1. 包和模块的定义

包和模块有很多相似之处,但也有些不同。二者定义如下:

  • package)是一个由package.json定义的文件或目录
  • 模块module)是任何可以由Node.js的require()加载的文件或目录。

可以看出,包和模块都可以是一个文件或目录;不同的是,包是由package.json文件定义和描述的,而只要可以被Node.js的require()方法加载就可以认为是模块。


2. 什么是包

一个包可以是以下形式之一:

  • a. 可以是一个由package.json文件定义的文件夹
  • b. 一个gzip压缩包(包含(a)定义)
  • c. 一个url(指向(b))
  • d. 由<name>@<version>形式指定的包(已经发布的(c))
  • e. 由<name>@<tag>形式指定的包(指向(c))
  • f. 由<name>形式表示的的((e)的最后版本)
  • g. 一个giturl(最终会指向(a))


3. 什么是模块

模块是一个任何形式的,可以被require()加载的Node.js程序。require()可以加载以下几种形式的模块:

  • 一个由package.json文件定义且包含main字段的文件夹
  • 一个包含index.js文件的文件夹
  • 一个JavaScript文件


包与模块

通过以上说明,我们可以总结出二者之间的异同如下:

通常来说,npm包可以Node.js中由require()方法加载,我们可以认为npm包就是一个模块,但并不要求将npm包封装成模块。

在一些包,如:cli包,只提供了命令行接口并没有提供用于Node.js程序的main入口点,这些包并不能认为是模块。

大多数的npm包中,又通过require()引用了很多模块;而模块,可以从包或文件中加载一些功能。所以二者之间是相互包含的关系。