我们给项目创建一个目录,用 npm init 进行初始化,创建了 app.js 和 appMsg.js 两个 JavaScript 文件。
此处可以看到 module.exports 的用法,该方法公开给定文件( appMsgs.js )中的属性或对象,这些属性或对象可以在另一个文件中使用。本例中该文件是 app.js 在这个系统中每个文件都可以访问 module.exports,所以 appMsgs.js 文件中的一些项就被公开了,下面是具体使用这些内容的展示:
使用 require 关键字引用文件,使用的时候它将返回一个表示模块化代码段的对象。我们将其分配给变量 appMsgs variable,然后在 console.log 语句中使用属性。得到以下输出:
接下来看看其他方法
对代码进行修改,不再公开一个对象,而是导出整个函数。每次函数调用都会执行此代码 下面是它如何在 app.js 文件中使用
不需要调用属性,只需要像执行函数一样。与函数执行不同的是每次执行这个代码,函数中的代码都会被重新执行 下面是运行结果
以上是 module.exports 的两种模式及其差异,另一个常见模式中我们需要知道如何使用它作为构造函数
下面是更新后的 app.js 文件
本质上来说这样与在 JavaScript 中创建伪类并允许创建伪类的实例时是一样的,下面是更改之后的输出
以下是该模式的另一个例子 我们创建一个名为 userRepo.js 的新文件
下面是 app.js 和此更改的执行结果
单个文件使用 require 很常见,但别忘了另一种模式:文件夹的之间的依赖关系
在正式介绍文件夹相关性之前,我们先来了解 Nodejs 如何查找依赖项,不要忽略前面例子中的这一内容:
var appMsgs = require("./appMsgs")
Node.js 会查找 appMsgs.js 文件,也会将 appMsgs 作为目录查找,无论它首先找到哪个都会进行记录。 接着我们创建一个名为 logger 的文件夹,在该文件夹中创建一个 index.js 文件
app.js 文件,它用 require 调用这个模块
在这个例子中值得注意的是:
var logger = require("./logger/index.js")
该内容完全正确,但如果改成一下内容:
var logger = require("./logger")
因为项目中没有 logger.js ,所以在有一个 logger 目录时,默认情况下会加载 index.js 作为 logger 的起点。这就是我们命名 index.js 的原因,这段代码的结果:
看到这里,你可能会疑惑为什么还要费心去完成创建文件夹和 inex.js 的额外步骤呢? 原因是,我们可能正在组合一个复杂的依赖项,这个依赖项可能还有其他依赖项。而记录器的调用者不需要知道还有很多其他依赖项存在。 这是一种封装形式,当我们构建更复杂的内容时,我们可以用多个文件构建它们,而在用户端使用单个文件。文件夹是一种管理这些依赖关系的好方法。
再次要介绍的另一个内容是 NPM,你一定了解它的功能,带来了很多便利。使用的方法也很简单。 我们可以使用 npm 安装依赖项
npm install underscore;
然后可以在 app.js 中简单地 require
我们可以看到标红位置如何使用下划线包提供的功能。除此之外,当我们需要使用这个模块时,并不指定文件路径,只需要使用它的名称,Node.js 将从应用程序中的 node\u modules 文件夹加载这个模块
下面是它的输出
本文介绍了 Nodejs 如何管理它的依赖关系,并且在我们的应用程序中看到了一些可以使用的模式。希望可以对各位的开发学习带来帮助。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.