当前位置: 首页 > 科技观察

服务端JavaScript运行环境Node.js依赖管理

时间:2023-03-18 11:53:09 科技观察

【.com快译】众所周知,Node.js是一个基于ChromeV8引擎的服务端JavaScript运行环境。它使用事件驱动、非阻塞I/O模型,轻量级且运行高效。诚然,我们可以用一个单独的js文件来编写应用程序涉及的所有内容,但这既不够灵活,也不够模块化。Node.js的出现使得编写模块化代码变得非常容易。因此,对于Node.js的核心,我们需要了解和掌握的一个重要概念就是:依赖管理。本文将和大家一起探讨依赖管理的各种模式以及Nodejs是如何加载依赖的。在深入细节之前,让我们先弄清楚什么是模块。简而言之,一个模块就是一段代码。为了共享和复用,我们需要对代码进行分组。模块允许我们将复杂的应用程序分解成小的代码块。同时,模块还可以帮助我们理解程序代码的意图,发现或修复各种错误。如果您想了解有关JavaScript模块系统的更多信息,请参阅--https://hexquote.com/javascript-module-system/。CommonJS从2009年开始实现了Javascript的模块化规范,它规定了模块的特性和模块之间的依赖关系。由于每个文件都被视为一个模块(通常,模块变量代表当前模块)并且有自己的作用域,因此每个文件中的变量、函数和类都是私有的,可供其他模块使用。无形的。模块的exports属性是外部接口。只有通过exports导出的属性才能被其他模块识别和加载。Node基于CommonJs规范实现模块的同步和加载。也就是说,我们可以在模块中调用require()方法接收模块的标识符,并根据node的模块导入规则导入其他模块,然后调用相应的属性和方法。在这里,我假设你已经掌握了以上Nodejs的基础知识。当然,如果你是Node.js新手,可以通过查看Node.js的相关介绍(https://dzone.com/articles/nodejs-introduction)了解更多的背景资料。设置应用让我们从最简单的开始。假设我为某个项目创建了一个目录。使用npminit命令对其进行初始化后,我们将创建两个JavaScript文件app.js和appMsg.js。下图是这个项目的目录结构,我们将以此作为管理的起点。如果你有兴趣,可以从文末给出的git仓库链接下载这个项目的最终源码。默认情况下,两个.js文件都是空的。让我们使用以下更改更新appMsgs.js文件。上面的代码片段演示了module.exports关键字的用法。此语法用于公开给定文件(此处为appMsgs.js)中的属性或对象,以便可以直接在另一个文件(如本例中的app.js)中使用。在这个系统中,每个文件都可以访问名为m??odule.exports的文件。因此,我们在appMsgs.js文件中暴露了一些项目,以方便观察app.js如何使用(需要)某些属性。显然,require关键字可以方便我们引用一个文件。即当我们执行require时,它会返回一个表示模块化代码段的对象。所以我们可以将它分配给一个appMsgs变量,然后简单地在console.log语句中使用该属性。当代码执行时,我们会看到如下输出:require执行JavaScript来构造一个对象,并以某种功能函数作为返回值。它们可以是类构造函数或其中包含许多元素的对象,也可以是一些简单的属性。对于不同的模式,我们可以导出多个对象,或者只导出那些复杂的对象。可以看出,通过require和module.exports,我们可以创建模块化的应用。值得注意的是,代码仅针对应用程序所需的功能加载一次。即无论执行什么代码,都不会执行第二次。那么如果其他程序也想通过require获取对象,它只会获取对象的缓存版本。接下来,让我们看看如何导出。如上面的代码片段所示,我对以前的代码进行了更改。现在,我没有公开对象,而是导出了一个函数。每次调用函数时都需要执行这段代码。接下来我们看看在app.js文件中如何使用:除了调用一个属性,更新app.js文件,我们还可以像函数一样执行。所以这里的区别主要是每次执行该代码时,函数内部的代码都会重新执行。这是我们重新运行代码片段时的输出:到目前为止,我们已经看到了module.exports的两种模式,以及它们之间的区别。另一种常见模式是将其用作构造函数方法。接下来,让我们看另一个例子:这里是改变后的app.js文件:本质上,这与您在JavaScript中创建一个伪类,并创建它的各种实例是一样的。持续的。下面是更改后的输出:接下来,让我们继续讨论此类模式的另一个示例。如下面的代码片段所示,我创建了一个名为userRepo.js的新文件。下面是更改后的app.js文件。下图就是这种变化的结果:当然,对单个文件使用require并不常见。接下来,让我们讨论另一种模式——文件夹依赖。文件夹依赖关系要了解Node.js如何查找依赖关系,让我们重温一下前面示例中的JavaScript代码:varappMsgs=require(“./appMsgs”)目录,并提取其值。我创建了一个名为logger的文件夹,并在其中创建了一个index.js文件,其中包含以下代码片段:下面是需要此模块的app.js文件:可见,在这个例子中,我们可以这样编写JavaScript代码:varlogger=require(“./logger/index.js”)上面更长的路径形式肯定是正确的。但是,我们只需要写下面的JavaScript代码:varlogger=require(“./logger”)由于没有logger.js,只有logger目录,默认情况下,Node会加载index.js作为logger的起点.我们可以使用下面的命令来验证它的输出结果:说到这里,你可能会有疑惑:为什么要费这么大的力气去创建文件夹和index.js?其背后的原因是:您可能会放置一些复杂的依赖项,这些依赖项可能还会有其他依赖项。对于需要记录器的调用者,他们不需要知道其他依赖项的存在。这是一种封装形式。我们可以在多个文件中构建更复杂的代码段;而从消费者的角度来看,他们只需要使用一个文件。显然,文件夹是管理此类依赖关系的更好方式。节点包管理器(NPM)第三类值得探索的依赖管理是NPM。顾名思义,NPM是一个Node.js包的管理和分发工具,相当于后端的Maven。它允许Javascript开发人员更轻松地共享和共享代码片段。通常,我们可以使用如下的npm命令来安装依赖:npminstallunderscore;如下代码片段所示,我们也可以在app.js中简单地require它:如你所见,我们可以使用每个下划线包项功能。同样,当我们需要使用这样一个模块时,我们不指定文件的路径,而只是使用它的名字。Node.js会自动从应用程序的node_modules文件夹中加载相应的模块。以下是代码执行的输出:总结总之,我们讨论了Node.js如何管理其依赖项。您可以从此Git存储库下载上述示例的源代码-https://github.com/jawadhasan/nodedependency。原标题:Node.js–依赖管理,作者:JawadHasanShani