转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。

原文参考: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 依赖关系管理(下)的更多相关文章

  1. 90%的人都不知道的Node.js 依赖关系管理(上)

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/nodejs-dependency-mana ...

  2. 关于 junit4 90% 的人都不知道的特性,详解 junitperf 的实现原理

    前言 上一节介绍了 https://github.com/houbb/junitperf 的入门使用. 这一节我们从源码的角度,剖析一下其实现方式. 性能测试该怎么做? Junit Rules jun ...

  3. 99% 的人都不知道的 Kubernetes 网络疑难杂症排查方法

    原文链接:Kubernetes 网络疑难杂症排查分享 大家好,我是 roc,来自腾讯云容器服务 (TKE) 团队,经常帮助用户解决各种 K8S 的疑难杂症,积累了比较丰富的经验,本文分享几个比较复杂的 ...

  4. 90%的开发者都不知道的UI本质原理和优化方式

    前言 很多开发者在工作中一直和UI打交道,所以认为UI非常的简单! 事实上对于90%的开发者来说,不知道UI的本质原理. 虽然在开发中,我们在接到产品的UI需求之后,可以走捷径照抄大型APP代码,但是 ...

  5. 很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那 ...

  6. 90% 前端开发者都不知道的 JavaScript 实用小技巧

    面试神器之数组去重 const a = [...new Set([1, 2, 3, 3])] >> [1, 2, 3] 操作数组担心 falsy 值? const res = myArra ...

  7. 大部分人都不知道的8个python神操作

    01 print 打印带有颜色的信息 大家知道 Python 中的信息打印函数 Print,一般我们会使用它打印一些东西,作为一个简单调试. 但是你知道么,这个 Print 打印出来的字体颜色是可以设 ...

  8. 震惊!90%的程序员不知道的Java知识!

    震惊!90%的程序员不知道的Java知识! 初学Java的时候都会接触的代码 public static void main(String[] args){ ... } 当时就像背公式一样把这行代码给 ...

  9. Node.js的安装以及Node.js的模块管理

    索引: Node.js的安装以及Node.js的模块管理Node.js开发环境搭建以及对ES6的支持Node.js构建Vue.js项目Vue.js单文件组件的开发基于Vue.js的UI组件(Eleme ...

随机推荐

  1. 使用Font Awesome替换EasyUI的图标

    用过EasyUI的朋友都知道,大部分组件都有一个iconCls属性,用于显示一个图标.但是EasyUI自带图标数量少.不美观,于是想到了使用Font Awesome来更换和拓展这些图标. 先看看Eas ...

  2. java面试一日一题:讲下mysql中的undolog

    问题:请讲下mysql中undo log的作用 分析:mysql中有很多日志,例,bin log undo log redo log,要弄清楚这些日志的作用,就要了解这些日志出现的背景及要解决的问题: ...

  3. 【golang】golang中结构体的初始化方法(new方法)

    准备工作: 定义结构体:Student import ( "fmt" "reflect") type Student struct { StudentId st ...

  4. 【vim】复制粘贴相关操作

    复制: 首先,可以在命令模式下输入v进入自由选取模式,选择需要剪切的文字后,按下d就可以进行剪切了. 其他命令模式下剪切命令: yy:复制当前行 nyy:n表示大于1的数字,复制n行 yw:从光标处复 ...

  5. Python多线程_thread和Threading

    目录 多线程 _thread模块 使用 _thread模块创建线程 threading 使用 threading模块创建线程 线程同步 在讲多线程之前,我们先看一个单线程的例子: import _th ...

  6. UVA10827球面上的最大和

    题意:      最大子矩阵的加强版,就是给你一个n*n的矩阵,每个格子里面都有数字,然后我们在里面选择一个矩阵,使得矩阵中所有数字的和最大,而且这个题目说这个n*n的矩阵的最右边和最左边是相邻的,最 ...

  7. Intel汇编程序设计-整数算术指令(下)

    7.5  扩展加法和减法 扩展精度的假发和减法是指任意尺寸大小数字的加法和减法.例如要求你写一个C++程序,把两个1024位的整数相加,解决方案可不是那么简单!但在汇编语言中,ADC(带进位加)指令和 ...

  8. Service Started!!!-end In Service while

    将原先的win7换成了xp,用体验换来更好的兼容 问题如下: 在虚拟机器中运行了DebugView后,就一直重复出现Service Started!!!-end In Service while, 虽 ...

  9. 【Android开发高手笔记】Dagger2和它在SystemUI上的应用

    和人类需要群居一样,程序界的进程.线程也需要通信往来.它们的交流则依赖模块之间.文件之间产生的关系.如何快速地搞清和构建这种关系,同时还能减轻彼此的依赖,需要开发者们认真思考. 我们将这种需求称之为依 ...

  10. layui中时间插件laydate的使用

    1.加载layui.js 2.html部分 <div class="layui-inline"> <label class="layui-form-la ...