【问题标题】:How does node.js know express.js locationnode.js 如何知道 express.js 的位置
【发布时间】:2016-10-11 16:22:17
【问题描述】:

我的 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.js 是否自动知道在 node_modules 中查找依赖项?" Yes.
  • @Mike C 好的 - 它知道express.js 将在node_modules\express\lib 中?可能也是一个显而易见的问题。我只是讨厌把事情想当然:D
  • 而 Express 有一个 index.js 文件(至少以前是这样)module.exports = require('./lib/express');
  • @MikeC 啊,我现在看到了;慢慢地我读到了页面上的文字大声笑

标签: javascript node.js express mean-stack requirements


【解决方案1】:

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

包安装、保存和定位

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

package.json 文件位于项目树的根目录(项目的文件夹/目录),其中包含依赖关系信息以及其他信息。 3 这是定义一个“包”。当一个人将包发布到npmjs(通过npm 安装包的(默认)注册表时,它们应该包括一个格式良好的package.json,其中列出了它自己的依赖项、要包含的文件以及什么是“主要" 文件开头,是否应该在 require 语句中使用。

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

边注

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

要求

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

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

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

【讨论】:

  • 感谢您的回答!我远没有以前那么迷惑了。
  • 我的荣幸。这当然是一件有趣的事情,尤其是当 node 和 ES2015(/ES6) 在导入方法上有所不同时。
  • “在 node 中使用 require 语句是 CommonJS 的风格,对于 node,首先在 node_modules/ 中查找”是错误的。在node_modules 文件夹之前首先搜索核心模块。当模块可以在多个位置找到时,顺序就变得很重要。
  • @wiseOne 很好的说明:核心与包模块。我看到您添加了一个说明差异的答案。
【解决方案2】:

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

  • 核心模块由 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 以进一步阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2019-02-21
    • 2012-02-04
    相关资源
    最近更新 更多