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 注册表。

[...]

关于模块

modulenode_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 并且packagepackage.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 modulemodule.export 对象,该对象作为 packageNPM 安装。

简而言之

modulepackage.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 中的模块和包之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

11-《Node.js开发指南-模块和包

nj05---模块

Node.jsExpress搭建服务端应用及接收请求参数

Node.js 和前端之间共享的模块中的模块语法和依赖关系

npm与包 丨Node.js模块化

如何在 node.js 中的模块之间共享连接池?