node.js 怎么知道 express.js 位置

How does node.js know express.js location

我的 node.js 服务器如何知道如何找到 express.js 文件?

在我的 server.js 文件中,我需要 express:

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

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

express.js 在 lib 目录中

node.js 是否自动知道在 node_modules 中查找依赖项?任何地方都没有直接枚举路径——我没有在代码中看到它。

这是 a sample project from scotch.io,我正在尝试将其拆解并学习。我是 MEAN 堆栈的新手,我正试图从基础层面理解它。

仅供参考,这是节点 v 4.5.0

评论已经涵盖了主要答案,但我会尝试在此处将其分开,以便对该主题进行更全面的概述(并非包罗万象)。简短的版本是节点在节点的核心(内置)包中查找,然后是项目的 node_modules 模块(包,但我们通常 require 模块)匹配名称的路径。 1

包安装、保存和位置

节点使用npm安装依赖,可以是"dependency"或"devDependency";后者用于仅正常使用该模块不需要的开发问题。我们使用标志 --save--save-dev(例如 npm install express --save)将这些保存到我们项目的 package.json2

package.json 文件位于项目树的根目录(项目的 folder/directory),包含依赖信息以及其他信息。 3 This is defines a "package". When a person publishes a package to npmjs,通过 npm 安装的软件包的(默认)注册表,它们应该包含一个格式正确的 package.json,其中列出了它自己的依赖项、要包含的文件,以及什么是 "main" 文件开头,是否应该在 require 语句中使用。

您在克隆项目存储库后通过 运行 npm install 安装的依赖项,将安装 package.json 中指定的包到 node_modules 路径中你的项目的根目录(你应该从那里 运行 安装命令)。

边注

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

需要

node中的require语句的使用是CommonJS and for node, looks first (after core packages) in the node_modules/ path or, if you specify a relative path to a folder or file, you can get it directly. Path relative means that it starts with ./ for a prefix to the current working directory (that the file is executing from), ../ for the directory above the current one, etc. There are other ways of handling paths, such as as the path module that is built into node 4的风格。例如,以下是有效的:

  • require('./some-other.js') 要求在该文件的 module.exports 中,来自 some-other.js 文件 5,在当前的相对路径中
  • require('./some.json') 将从 .json 文件 6 中引入 JSON 格式的内容,在当前的相对路径
  • require('./routes') will/can 也从 routes/ 路径(目录)导入导出的内容,默认情况下从目录的 index.js 开始,如果它存在 7

最后一种方法是一种很好的方法,可以引入更复杂的需求,而无需将所有内容都放在一个过于繁忙的文件中。

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

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

如果您需要没有任何前缀的模块,例如 require('a_module'),则首先搜索 核心模块,如果未找到, 接下来搜索 包模块 See the Node.js docs here

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

需要 模块的方式

勾选 Node.js modules docs 进一步阅读。