【发布时间】:2013-11-29 06:44:22
【问题描述】:
我是 Node.js 的新手。 Node.js 中的“包”和“模块”有什么区别?
【问题讨论】:
我是 Node.js 的新手。 Node.js 中的“包”和“模块”有什么区别?
【问题讨论】:
Modules 是 Node.js 的库。请参阅以下 API 摘录:
Node.js 有一个简单的模块加载系统。在 Node.js 中,文件和模块 是一一对应的。
模块示例:
包是组合(或打包)在一起的一个或多个模块(库)。这些通常由其他包或您自己的项目使用。 Node.js 使用package manager,您可以在其中找到并安装数千个包。
包示例:
Shapes <- Package name
- Circle.js <-
- Rectangle.js <- Modules that belong to the Shapes package
- Square.js <-
基本上,您可以安装包Shapes,并可以访问Circle、Rectangle 和Square 模块。
【讨论】:
模块是具有一些合理功能的单个 JavaScript 文件。
包是一个目录,其中包含一个或多个模块,以及一个 package.json 文件,其中包含有关包的元数据。
一个包可以非常简单,例如,underscore只有一个 JavaScript 文件(我们看到它的两个版本,常规和缩小版和 package.json)
open@open-PC MINGW64 ~/Desktop/module-package-demo/node_modules/underscore
$ dir
LICENSE README.md underscore-min.js
package.json underscore.js underscore-min.js.map
而像 Express 这样更复杂 的包在根目录中有一个 JavaScript 文件,但在其子目录中还有更多子目录中的 JavaScript 文件和更多内容
open@open-PC MINGW64 ~/Desktop/module-package-demo/node_modules/express
$ dir
History.md index.js lib LICENSE package.json Readme.md
现在人们将包称为模块是很常见的。
【讨论】:
我搜索了the Node.js documentation,发现their def for module:
在 Node.js 模块系统中,每个文件都被视为一个单独的模块。
npm 有一些官方定义 here。
包是由 package.json 文件描述的文件或目录。
module 是 node_modules 目录中的任何文件或目录,它可以由 Node.js 的 require() 函数加载。
注意:由于不需要模块有一个 package.json 文件,并不是所有的模块都是包。只有具有 package.json 文件的模块也是包。
【讨论】:
你可以require() 的一切都是一个模块。在CommonJS 世界中的大多数情况下,每个模块只有一个文件。
一个包可以包含多个模块,但您通常会加载入口点 (main),如果没有 main 属性,则在 package.json 或其 index.js 中指定该入口点提供,例如:require('express')。
但如果您知道位置,您也可以要求另一个文件(不是主文件)。例如,require("express/lib/application")(在 Node.js 中可以省略扩展名:.js)。
如果模块在package.json 的dependencies 属性中列出,则一个包可以访问来自其他包的模块。
实际上 npm 将所有包安装到 node_modules 中,这很令人困惑,因为它应该是 node_packages。
【讨论】:
每个 Node.js 应用程序都是一个 package 并且应该有一个 package.json 文件。这些应用程序充当中间件(或等效的库),旨在安装在其他应用程序中,modules。
简而言之,所有modules 都是packages,但并非所有packages 都可以用作modules,尽管很多都可以。
如果在package.json 文件中列为dependencies,模块将被安装并放入node_modules 文件夹,但npm 通过它们的package.json 文件递归添加它们所依赖的modules .
【讨论】:
package.json文件。因此,它不能是一个包。因此,您关于 “所有模块都是包” 的断言是错误的。
来自https://docs.npmjs.com/about-packages-and-modules:
关于包
package 是由 package.json 描述的文件或目录 文件。一个包必须包含一个 package.json 文件才能被 发布到 npm 注册表。
[...]
关于模块
module 是 node_modules 中的任何文件或目录 Node.js require() 函数可以加载的目录。
要被 Node.js require() 函数加载,模块必须是一个 以下内容:
- 包含 package.json 文件的文件夹,其中包含 "main" 字段。
- 其中包含 index.js 文件的文件夹。
- JavaScript 文件。
注意:由于模块 不需要有 package.json 文件,并非所有模块都有 包。只有具有 package.json 文件的模块也是 包。
在 Node 程序的上下文中,模块也是 从文件加载的东西。例如,在下面 程序:
var req = require('request')我们可以说“变量 req 指的是 request 模块”。
【讨论】:
Node.js 仅包含 modules。任何文件或目录在Node.js 中都被称为module。
(Module)
Demo
-> app.js
(Package)
Demo
-> app.js
-> package.json
加长版:
术语package 来自Node Package Manager(NPM)。由于 NPM 只接受packages 并且package 与package.json 一起设置了一个文件,它与Node.js 无关。您可以将您的module 发布为package(通过在NPM registry 中添加pacakge.json)与其他开发人员共享,以便其他开发人员可以使用它。
同样,当您从 NPM 安装 package 时,它将作为 module 安装到应用程序中。
在 Node.js 中,module 没有 package.json 文件这样的要求。因此,具有package.json 的模块将有资格在NPM registry 中发布,并且可以称为package。
例如:express 是一个 Node.js module,它在 NPM registry 中作为 package 发布。
npm install express --save
以上语句将NPM 中的express package 作为module 安装到Node.js 项目中。
const express = require('express')
将给出 express module 的 module.export 对象,该对象作为 package 从 NPM 安装。
简而言之:
module 和 package.json 文件可以称为包。
package 一词来自 Node Package Manager(NPM)。它是与package.json 一起的文件集,与Node.js 无关。您可以通过在NPM registry 中将package 发布为package(通过添加pacakge.json)与其他开发人员共享您的module,以便其他开发人员可以使用它。
【讨论】:
包:
包是由 package.json 文件描述的文件或目录。 包必须包含 package.json 文件才能发布到 npm 注册表。
模块:
模块是 node_modules 目录中可以被 Node.js 的 require() 函数加载的任何文件或目录。
要由 Node.js 的 require() 函数加载,模块必须是以下之一:
带有 package.json 文件的文件夹,其中包含“主”字段。
一个包含 index.js 文件的文件夹。 JavaScript 文件。
模块是 node_modules 目录中的任何文件或目录 可以通过 Node.js 的 require() 函数加载。
在 Node 程序的上下文中,模块也是从文件加载的东西。例如,在以下程序中:
var req = require('request')
我们可以说“变量 req 指的是请求模块”。
注意:
由于模块不需要有 package.json 文件, 并非所有模块都是包。只有具有 package.json 文件的模块也是 包。
【讨论】: