90%的人都不知道的Node.js 依赖关系管理(下)
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
原文参考:https://dzone.com/articles/node-dependency-management-part2
在上篇介绍Node.js依赖关系管理的文章中,我们介绍了关于Node.js模块的基础知识,如何使用module.exports和require方法处理依赖项,以及文件夹依赖项(folder dependencies)的工作方式和工作原理。
今天我们将继续从这一点出发,来了解如何使用这个系统模块将应用程序分解成多个模块,以及这样做的优势和Node.js的工作原理。
本文内容中提及到了上篇中一些经验分享,在阅读本文之前可以阅读上篇详细了解。
在我们继正式开始了解学习如何使用多个模块设置应用程序之前,我们一起来了解Node.js模块一些其他方面的有趣内容。
Node Modules是单例模式吗
在上一篇文章中,我们讨论了Node.js一次只会加载一个模块。如果发出请求,Node.js会给出该模块的缓存副本。因此看起来这些模块的行为就像独生子女。这里我们看一个例子,来说明这种情况。
首先,我们为应用程序创建了一个项目,初始化应用程序,并创建了一个文件user.js,如下所示:
接着,在APP.JS中我们会使用用户模块(user module),并按照如下方式使用:
可以看到我们创建两了两个用户,只要对其中一个变量做出修改就会影响另一个变量的内容。我们必须意识到用户模块会被缓存,并在进行另一个请求的时间内被重用。
接下来我们把它改成一个构造函数,看看他如何进行工作
构造函数
我们在上篇内容中介绍了构造函数,实现了user.js的更改:
这一部分内容下面要继续在app.js中使用:
我们可以看到两个不同的例子,并且可以直观感受到这之间的不同。不用太担心不同的问题,后文中将会介绍其他例子和解决方案。
现在我们开始介绍关于我们本次的主题,关于如何使用模块管理应用程序。
应用程序构建
我们开始搭建一个简单的应用程序基础,接下来会在讲解的过程中不断对它进行细化。
我们已经创建了一些新的文件夹,现在程序中包含的结构如下:
首先我们给不同的模块创建了单独的文件夹。现在已经有的图书管理文件夹,另一个用于日志记录器文件夹,类似于用户管理。这样我们的每个模块都有重点,易于定位和管理。同时在每个文件夹内都有子文件夹。这里我们需要注意文件夹级别的index.js文件,它将作为模块的API。
然后在app.js中我们可以通过require引用模块,看到它按照预期工作的工程。注意我们如何通过require user.js来引用它。
现在我们来更新代码内容:
我们在图书管理模块下创建了几个项目,在这这模块中我们可以看到book.js遵循常见JavaScript构造函数模式(但与user.js中看到的构造函数示例略有不同)。
在相应的index.js文件中有以下代码:
index.js作为模块的API,让我们在app.js中使用它,如下所示:
将user.js改为与book.js相同的构造函数模式后我们的程序正按照预期工作。这里提示一点,我们可以使用Node.js中其他语言的现有JavaScript内容进行编写。根据自己的偏好进行选择就可以。
下面是代码user.js重构之后的样子:
总结
本文中介绍的应用程序内容都十分基础,我们通过学习Node.js依赖性管理的一些基础知识和一些建立项目结构的常用方法来进行了文件模块管理。
我们还看到Node.js应用程序中使用JavaScript设计模式的相关知识,并且也通过一些简单的例子进行说明。
90%的人都不知道的Node.js 依赖关系管理(下)的更多相关文章
- 90%的人都不知道的Node.js 依赖关系管理(上)
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/nodejs-dependency-mana ...
- 关于 junit4 90% 的人都不知道的特性,详解 junitperf 的实现原理
前言 上一节介绍了 https://github.com/houbb/junitperf 的入门使用. 这一节我们从源码的角度,剖析一下其实现方式. 性能测试该怎么做? Junit Rules jun ...
- 99% 的人都不知道的 Kubernetes 网络疑难杂症排查方法
原文链接:Kubernetes 网络疑难杂症排查分享 大家好,我是 roc,来自腾讯云容器服务 (TKE) 团队,经常帮助用户解决各种 K8S 的疑难杂症,积累了比较丰富的经验,本文分享几个比较复杂的 ...
- 90%的开发者都不知道的UI本质原理和优化方式
前言 很多开发者在工作中一直和UI打交道,所以认为UI非常的简单! 事实上对于90%的开发者来说,不知道UI的本质原理. 虽然在开发中,我们在接到产品的UI需求之后,可以走捷径照抄大型APP代码,但是 ...
- 很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那 ...
- 90% 前端开发者都不知道的 JavaScript 实用小技巧
面试神器之数组去重 const a = [...new Set([1, 2, 3, 3])] >> [1, 2, 3] 操作数组担心 falsy 值? const res = myArra ...
- 大部分人都不知道的8个python神操作
01 print 打印带有颜色的信息 大家知道 Python 中的信息打印函数 Print,一般我们会使用它打印一些东西,作为一个简单调试. 但是你知道么,这个 Print 打印出来的字体颜色是可以设 ...
- 震惊!90%的程序员不知道的Java知识!
震惊!90%的程序员不知道的Java知识! 初学Java的时候都会接触的代码 public static void main(String[] args){ ... } 当时就像背公式一样把这行代码给 ...
- Node.js的安装以及Node.js的模块管理
索引: Node.js的安装以及Node.js的模块管理Node.js开发环境搭建以及对ES6的支持Node.js构建Vue.js项目Vue.js单文件组件的开发基于Vue.js的UI组件(Eleme ...
随机推荐
- python进阶(16)深入了解GIL锁(最详细)
前言 python的使用者都知道Cpython解释器有一个弊端,真正执行时同一时间只会有一个线程执行,这是由于设计者当初设计的一个缺陷,里面有个叫GIL锁的,但他到底是什么?我们只知道因为他导致pyt ...
- 使用MyQR模块生成二维码
一.介绍 MyQR 模块是 python 的一个外部库,能够将文本或网址转为二维码,扫了之后就能查看文本或跳转到相应网站. 它是一个外部库,需要导入: pip install -i https://p ...
- 【DataBase】SQL45 Training 45题训练
视频地址: https://www.bilibili.com/video/BV1pp4y1Q7Yv 创建案例库: ------------创建数据库--------------- create dat ...
- git Windows下重命名文件,大小写敏感问题
作为一个重度强迫症患者,是不忍受文件名,有字母大小拼写错误的,但是在git下,已是受控版本文件要改过来,要费些周章了. 一.环境 Widnows + git version 2.24.0 + Tort ...
- 【VritualEnv】虚拟环境的介绍和基本使用
一.virtualenv的介绍: 在python开发中,我们可能会遇到一种情况,就是当前的项目依赖的是某一个版本,但是另一个项目依赖的是另一个版本,这样就会造成依赖冲突,而virtualenv就是解决 ...
- 文档翻译第002篇:Process Monitor帮助文档(Part 2)
[筛选与高亮显示] Process Monitor提供了一些方式来配置筛选器和高亮显示. 筛选器的包含与排除 您可以在筛选器中指定事件的属性,这样就可以令Process Monitor ...
- Docker网络配置进阶
Docker启动会默认创建docker0虚拟网桥,是Linux的一个bridge,可以理解成一个软件交换机.它会在挂载到它的网口之间进行转发. 之后所有容器都是在172.17.0.x的网段上,并且可以 ...
- python-内置函数-文件操作
文件操作 用的最多的就是r+,w+和a+都有局限性 w+是先清空,然后再写,之后再读 a+是无论如何调整指针位置,写时都在文件最后追加 而r+可以通过调整指针位置来确定写入的位置 文件操作之with处 ...
- 老Python带你从浅入深探究List
列表 Python中的列表(list)是最常用的数据类型之一. Python中的列表可以存储任意类型的数据,这与其他语言中的数组(array)不同. 被存入列表中的内容可称之为元素(element)或 ...
- JavaI/O流汇总
Java中常见流学习汇总 流的含义 流在Java中是指计算中流动的缓冲区. 从外部设备流向中央处理器的数据流成为"输入流",反之成为"输出流". 字符流和字节流 ...