Node.js 中的模块和包之间的区别?
Posted
技术标签:
【中文标题】Node.js 中的模块和包之间的区别?【英文标题】:Difference between a module and a package in Node.js? 【发布时间】:2013-11-29 06:44:22 【问题描述】:我是 Node.js 的新手。 Node.js 中的“包”和“模块”有什么区别?
【问题讨论】:
【参考方案1】:Modules 是 Node.js 的库。请参阅以下 API 摘录:
Node.js 有一个简单的模块加载系统。在 Node.js 中,文件和模块 是一一对应的。
模块示例:
Circle.js 矩形.js Square.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 模块。
【讨论】:
引用的文本一直存在,直到 end of 2017,当它更改为以下措辞时:“在 Node.js 模块系统中,每个文件都被视为一个单独的模块”,在@userA57 的answer 中引用。【参考方案2】:模块是具有一些合理功能的单个 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
现在人们将包称为模块是很常见的。
【讨论】:
【参考方案3】:我搜索了the Node.js documentation,发现their def for module:
在 Node.js 模块系统中,每个文件都被视为一个单独的模块。
npm 有一些官方定义 here。
包是由 package.json 文件描述的文件或目录。module 是 node_modules 目录中的任何文件或目录,它可以由 Node.js 的 require() 函数加载。注意:由于不需要模块有一个 package.json 文件,并不是所有的模块都是包。只有具有 package.json 文件的模块也是包。
【讨论】:
@Dhruvil21_04 示例很棒,但这些示例仅对 React 用户有用。 我会推荐给出例子,因为它可以帮助用户快速理解。找到通用的可以添加。【参考方案4】:你可以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。
Modules | Node.js Documentation
【讨论】:
CommonJS died in late 2014. @PeterMortensen,是什么让你这么说?从您链接到的 Wiki 中:CommonJS 的模块规范今天被广泛使用,特别是用于使用 Node.js 进行服务器端 JavaScript 编程。.【参考方案5】:每个 Node.js 应用程序都是一个 package
并且应该有一个 package.json
文件。这些应用程序充当中间件(或等效的库),旨在安装在其他应用程序中,modules
。
简而言之,所有modules
都是packages
,但并非所有packages
都可以用作modules
,尽管很多都可以。
如果在package.json
文件中列为dependencies
,模块将被安装并放入node_modules
文件夹,但npm
通过它们的package.json
文件递归添加它们所依赖的modules
.
【讨论】:
根据 npm doc-docs.npmjs.com/about-packages-and-modules,为了使模块成为包,它必须遵循 3 个条件中的 1 个。所以如果模块只是js文件,不一定有package.json
文件。因此,它不能是一个包。因此,您关于 “所有模块都是包” 的断言是错误的。
另外,请参阅文档的 Note 部分。【参考方案6】:
来自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 模块”。
【讨论】:
【参考方案7】: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
,以便其他开发人员可以使用它。
财政年度:https://docs.npmjs.com/about-packages-and-modules
【讨论】:
【参考方案8】:包:
包是由 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 文件的模块也是 包。
【讨论】:
解释我的反对意见:(1)这是先前答案的近乎精确的复制品——@eyal-levin 的答案; (2) 与他的回答不同,你的回答没有引用文本的来源,这使得它看起来(错误地)就像是你的作品。我建议删除此答案或对其进行编辑以提供其他答案中尚不存在的详细信息。 是的,@waldyrious,以后会提到文本的来源。以上是关于Node.js 中的模块和包之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章