开发者必看那些你不知道的Node。js依赖关系管理(上)
引言
Node.js中的一个重要概念是依赖关系管理。本文就将带大家了解依赖管理的各种模式以及Node.js如何加载依赖。
Node.js编写模块化代码非常简单,我们可以使用单个js文件非模块化的编写所有应用程序的内容。
在这里你可能会问,模块(module)是什么,它又有什么作用。
大型项目的实施之中,会有很多分工协作,为了可以让分工更加方便和顺利,我们可以将编写好的代码封装起来,重复使用或者提供给第三方使用。在项目封装阶段将所有模块组织编译成一个完整程序。
总而言之,模块是代码为了便于在开发中共享和重用,而进行的分组。这些模块使我们可以将复杂的应用程序分解。以便让我们更好地理解代码,发现并修复Bug。基于CommonJS,Node.js中使用require这个关键字来获取一个JavaScript文件。开始
我们给项目创建一个目录,用npm init 进行初始化,创建了app.js和appMsg.js两个JavaScript文件。
此时两个.js文件都是空的,我们来继续更新appMsgs.js文件
此处可以看到module.exports的用法,该方法公开给定文件(appMsgs.js)中的属性或对象,这些属性或对象可以在另一个文件中使用。本例中该文件是app.js
在这个系统中每个文件都可以访问module.exports,所以appMsgs.js文件中的一些项就被公开了,下面是具体使用这些内容的展示:
使用require关键字引用文件,使用的时候它将返回一个表示模块化代码段的对象。我们将其分配给变量appMsgs variable,然后在console.log语句中使用属性。得到以下输出:
执行JavaScript,构造一个返回对象。这个对象可以是一个类构造函数,也可以是一个包含许多元素或一些简单属性的对象。
因此,通过管理require和module.exports,我们可以创建这些模块化应用程序。
所需的功能加载代码并只加载一次。如果其他人通过require请求这个对象,只会得到这个对象的缓存版本。
接下来看看其他方法:
对代码进行修改,不再公开一个对象,而是导出整个函数。每次函数调用都会执行此代码
下面是它如何在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的额外步骤呢?
原因是,我们可能正在组合一个复杂的依赖项,这个依赖项可能还有其他依赖项。而记录器的调用者不需要知道还有很多其他依赖项存在。
这是一种封装形式,当我们构建更复杂的内容时,我们可以用多个文件构建它们,而在用户端使用单个文件。文件夹是一种管理这些依赖关系的好方法。Node Package Manager (NPM)
再次要介绍的另一个内容是NPM,你一定了解它的功能,带来了很多便利。使用的方法也很简单。
我们可以使用npm安装依赖项npm install underscore;
然后可以在app.js中简单地require
我们可以看到标红位置如何使用下划线包提供的功能。除此之外,当我们需要使用这个模块时,并不指定文件路径,只需要使用它的名称,Node.js将从应用程序中的nodeu modules文件夹加载这个模块。
下面是它的输出:
总结
本文介绍了Nodejs如何管理它的依赖关系,并且在我们的应用程序中看到了一些可以使用的模式。希望可以对各位的开发学习带来帮助。
拓展阅读
如果您已经对Node.js的内容很熟悉,还可以点击下方"了解更多"了解web系统中如何对表格性能进行优化。
阳光学院一项重大教改项目入选省级教改典型案例库为充分发挥优秀教改成果的示范引领和辐射带动作用,福建省教育科学研究所组织编印第二册福建省本科高校教育教学改革研究典型案例汇编。阳光学院达新宇教授的新工科背景下应用型本科AIX人才培
iPhone14系列延期发布?库克亲自辟谣几乎所有供应链已恢复受多重因素影响,有消息称iPhone14系列将延期发布,不排除推迟12个月时间亮相,引发了广大果粉的关注。面对网上传闻,苹果公司CEO蒂姆库克亲自辟谣供应链几乎全部恢复。库克表示我
一篇就够了,MySQL索引(建议收藏)目录1。介绍2。索引的原理2。1索引原理2。2索引的影响2。3磁盘IO与预读3。索引的数据结构4。聚集索引与辅助索引4。1聚集索引4。2辅助索引5。MySQL索引管理5。1功能5。
蓝厂vivox80值得购买吗值得买!要说vivoX80的缺点,唯遗憾的就是屏幕不支持2K分辨率,但是VivoX80配备的这块6。78英寸三星E5曲面屏,支持120Hz屏幕刷新率,100P3广色域,局部峰值亮度
猛将余承东,为晚节而呐喊撰文文烨豪冷泽林编辑吴先之我们华为手机回来了。新机预热视频中,余承东带着笑意如是说道。而此前数日,脸上涂着厚厚脂粉的他出现在了测评人吴佩的访谈中。一开始,余承东还是凭着背熟的话术,
存活了4亿年,却被人类残忍抽血,只因血液是蓝色眼前这种生物,只因拥有稀缺的蓝色血液,就成为人类的血奴!每一个打过疫苗的人都应该感谢,拥有蓝色血液的鲎,这样一个存活了4。5亿年的远古生物,如今被捆绑在固定架子上,长管插到心包附近
诺奖得主与顶级棋士AI能写出挪威的森林吗?作者张文静人类棋士为什么会输给人工智能(AI)?未来人类会被AI控制吗?有哪些事情人类可以做到,而AI做不到?AI能写出村上春树的小说吗?十年后百年后,这个世界会变成什么模样?在新
iPhone13Pro和iPhone14选哪个?根据目前信息来看,iPhone14有可能在秋季发布,有可能取消mini版本,但依然保留4个版本,分别是iPhone14,iPhone14max,iPhone14Pro和iPhone
华为重大官宣,孟晚舟身份突变任正非还是食言了近日,华为有了一个大动作。华为官网的轮值董事长界面上,出现了孟晚舟的名字。华为副董事长CFO孟晚舟接替郭平,成为新任轮值董事长。这也意味着,孟晚舟拿到了华为接班人角逐赛道的入场券,
阿里巴巴对平台商品收税达5,怪不得网上的商品也不便宜了截至2021年3月31日止的12个月,阿里年交易金额突破8万亿元人民币,收入达到约7172亿元,剔除云计算600亿元,预计阿里巴巴平台对商品收税5。阿里对商家的全部扣点达9,净利润
做量子领域的孤勇者我们的新时代做量子领域的孤勇者讲述人中国科学技术大学教授,国家重点基础研究发展计划项目A类(超级973)首席科学家郭国平我与量子结缘,是在1998年。那年,我在中国科学技术大学读大