阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      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()

      目录
      目录