node.js如何知道express.js的位置

我的node.js服务器如何知道如何findexpress.js文件?

在我的server.js文件中我有一个express的要求:

 var express = require('express'); var app = express(); 

我的server.js文件位于app文件夹中,而express.js位于app\node_modules\express\lib文件夹中:

Server.js文件

express.js在lib目录中

Express.js文件

node.js是否自动知道在node_modules查找依赖关系? 没有任何地方的path的直接枚举 – 我没有在代码中看到它。

这是一个来自scotch.io的示例项目 ,我试图分开学习。 我对MEAN堆栈相当陌生,我试图在基本层面上理解这一点。

仅供参考,这是节点v 4.5.0

这些意见已经涵盖了主要的答案,但是我会尝试在这里分解出来,稍微更全面地了解这个主题(并不是全部)。 简短版本是节点在节点核心(内置)包中查找,然后是项目的模块(包,但通常require模块)的node_modulespath与名称匹配。 1

包安装,保存和位置

节点使用npm来安装依赖关系,这可以是“依赖关系”或“devDependency”; 后者被用于发展关注点,而这正是通常使用模块所不需要的。 我们使用标志--save--save-dev (比如npm install express --save )将这些保存到项目的package.json 。 2

package.json文件位于项目树的根目录(项目的文件夹/目录),并包含依赖信息以及其他信息。 3这是定义一个“包”。 当一个人向npmjs发布软件包( npmjs )的默认registry时,他们应该包含一个格式良好的package.json ,它列出了它自己的依赖关系,要包含的文件以及什么是要启动的“main”文件与,应该用在一个require声明。

在克隆项目存储库之后,通过运行npm install的依赖关系会将package.json指定的package.json安装到项目根目录中的node_modulespath中(您应该从中运行install命令)。

边注

在检查了您引用的文章列出的GitHub仓库后,您似乎已经创build了app/目录中的每个文件。

要求-ING

在节点中使用require语句的方式是CommonJS和节点,在node_modules/ path中首先查找(在核心软件包之后),或者如果指定文件夹或文件的相对path,则可以直接获取它。 相对path表示它以./开头,以当前工作目录的前缀(文件正在执行), ../为当前目录之上的目录等等。还有其他方式处理path,例如内置于节点4中的path模块。 例如,以下内容是有效的:

  • require('./some-other.js')需要在该文件的module.exports ,从some-other.js文件中5 ,在当前的相对path
  • require('./some.json')会从require('./some.json')文件中引入JSON格式的内容6 ,在当前的相对path
  • require('./routes')将/也可以从routes/path(目录)中获取导出的内容,默认情况下该目录以index.js开头,如果存在的话7

最后一种方法是能够引入更复杂的需求,而不是将所有内容都保存在一个过于繁忙的文件中的好方法。

我们来考虑模块的可能来源:

  • 核心模块由Node.js提供
  • 打包模块从做npm install 。 这些模块存储在通常位于项目根目录下的node_modules文件夹中。
  • 您项目中任何其他位置的模块(通常由您创build的模块)

如果你需要没有任何前缀的模块,例如require('a_module')首先search核心模块 ,如果找不到,接下来search软件包模块 。 在这里查看Node.js文档

如果您需要带有/./前缀的模块,例如require('/another_module')require(./another_module)another_module被认为是相对于所需文件的位置。 这就是你如何在其他地方需要模块

检查Node.js模块文档以供进一步阅读。