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 ...
随机推荐
- JAVAEE_Servlet_16_HttpServletRequest中常用方法(三)
HttpServletRequest中常用方法(三) * 回顾ServletContext对象,ServletContext对象是Servlet上下文对象 - 创建ServletContext对象 S ...
- 【原创】【基础】一文搞懂严蔚敏数据结构SqList &L和SqList L、ElemType &e和ElemType e
旁白 最近小渔夫在看严蔚敏.李冬梅<数据结构 c语言版>(第2版),学到第二章顺序表的实现时,看到函数参数一会是SqList &L.一会又是SqList L.一会ElemType ...
- 探秘神奇的运动路径动画 Motion Path
CSS 中有一个非常有意思的模块 -- CSS Motion Path Module Level 1,翻译过来也就是运动路径.本文将对 motion path 一探究竟,通过本文,你可以了解到: 什么 ...
- IDEA的Debug技巧
01_Debug简介和意义 什么是程序DeBug? Debug,是程序开发人员必会的一项调试程序的技能. 企业中程序开发和程序调试的比例为1:1.5,可以说如果你不会调试程序,你就没有办法从事编程工作 ...
- Aircrack-ng破解无线WIFI密码
首先,如果kali是装在虚拟机里面的话,是不能用物理机的无线网卡的.所以,如果我们要想进行无线破解,需要外接一个无线网卡设备,并且该设备要支持 monitor 监听模式 iwconfig :系统配置无 ...
- UVA10943简单递推
题意: 给你两个数字n,k,意思是用k个不大于n的数字组合(相加和)为n一共有多少种方法? 思路: 比较简单的递推题目,d[i][j]表示用了i个数字的和为j一共有多少种情况,则 ...
- Win64 驱动内核编程-10.突破WIN7的PatchGuard
突破WIN7的PatchGuard WIN64 有两个内核保护机制,KPP 和 DSE.KPP 阻止我们 PATCH 内核,DSE 拦截我们加载驱动.当然 KPP 和 DSE 并不是不可战胜的,WIN ...
- android Javah生成JNI头文件
项目要用到c语言库,因此来学习下jni 首先是在cmd中使用javah,出现了javah不是内部或外部命令的错误提示,javah是jdk自带的工具,提示说明在系统环境变量中没有jdk的路径,或者配置错 ...
- 【jQuery】精细学习记录
[jQuery]精细学习记录 基础 基本语法: $(选择器).action(回调函数); $/jQuery //jQuery核心函数 $(选择器) //获得的jQuery对象 jQuery核心 - j ...
- $ git push -u origin master 报错
输入$ git push -u origin master报permission denied(publickey) 如下: 原因是没有与gitee上的账号成功建立密钥对,所以需要配对密钥 解决方法( ...