npm包和Node.js模块区别

🌙
手机阅读
本文目录结构

前言

Node.js和npm具有非常具体的包和模块定义,很容易混淆。我们将在这里讨论这些定义,使它们区别开来,并解释为什么某些默认文件以它们的方式命名。

快速摘要

  • 甲包是受所描述的一个文件或目录package.json。这可能以一系列不同的方式发生!
    • 有关详细信息,请参阅下面的 “什么是 package?”。
  • 一个模块是可以通过Node.js的加载任何文件或目录 require()
    • 同样,有几种配置允许这种情况发生。有关详细信息,请参阅“什么是 module?”

什么是package?

包是以下任何一种:

  • a)包含由package.json文件描述的程序的文件夹。
  • b)含有(a)的压缩的tarball。
  • c)解析为(b)的网址。
  • d)<name>@<version>与(c)一起在登记处公布的A.
  • e)A <name>@<tag>指向(d)。
  • f)<name>具有latest满足(e)的标签的A.
  • g)git克隆时产生(a)的网址。

注意到所有这些package可能性,即使您从未将包发布到公共注册表,您仍然可以获得使用npm的许多好处:

  • 如果您只想编写节点程序,和/或,
  • 如果您还希望能够在将其打包成tarball后轻松地将其安装在别处。

Git网址可以是以下形式

    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

commit-ish可以是任何标签,

分支可以作为参数被供给git checkout。默认是master

什么是module?

模块是可以require()在Node.js程序中加载的任何模块。以下是可以作为模块加载的所有事例:

  • package.json包含main字段的文件的文件夹。
  • 包含index.js文件的文件夹。
  • 一个JavaScript文件。

大多数npm包都是模块

通常,加载Node.js程序中使用的npm包require,使它们成为模块。但是,并不要求npm包是一个模块!

某些包(例如cli包)仅包含可执行的命令行界面,并且不提供main在Node.js程序中使用的字段。这些包不是模块。

几乎所有的npm软件包(至少是那些节点程序) 都包含很多模块(因为它们加载的每个文件 require()都是一个模块)。

在Node程序的上下文中,module也是从文件加载的东西。例如,在以下程序中:

var req = require('request')

我们可能会说“变量req指的是request模块”。

Node.js和npm生态系统中的文件和目录名称

那么,为什么它是node_modules文件夹,package.json文件?为什么不node_packagesmodule.json

package.json文件定义了包。

node_modules文件夹是Node.js查找模块的位置。

例如,如果您创建了一个文件,node_modules/foo.js然后有一个程序var f = require('foo.js'),它将加载该模块。

但是,foo.js在这种情况下,它不是“包”,因为它没有package.json

或者,如果您创建的文件包中没有 index.js或包含"main"字段package.json,则它不是模块。

即使它被安装node_modules,它也不能成为一个参数require()

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了