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

引言

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将从应用程序中的node\u modules文件夹加载这个模块

下面是它的输出

总结

本文介绍了Nodejs如何管理它的依赖关系,并且在我们的应用程序中看到了一些可以使用的模式。希望可以对各位的开发学习带来帮助。

拓展阅读

如果您已经对Node.js的内容很熟悉,还可以了解[web系统中对表格性能进行优化].((https://www.grapecity.com.cn/blogs/spread-table-performance-optimization-practice))

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

  1. 99.99%人都不知道的“##“里用法

    99.99%人都不知道的"##"里用法 转:原文链接<99.99%人都不知道的"##"里用法> 编者荐语: 来来来,学习一些C语言骚气的操作! 以下 ...

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

    在实际的应用中,我们常常需要实现在移动app和浏览器中点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面或执行一些其它操作的 需求,那在代码中怎样监听当点击微信.支付宝.百度糯米.百度钱包 ...

  3. 苹果手机小技巧大全计算机,80%的人都不知道的五个iPhone实用小技巧,不知道的话赶紧看看...

    原标题:80%的人都不知道的五个iPhone实用小技巧,不知道的话赶紧看看 现在越来越多的人使用iPhone手机,而且iPhone新机也是出了一段时间了,但是还是有很多人不知道iPhone中的一些隐藏 ...

  4. 【仿乐享微信源码免费分享】99%的人都不知道的微信功能!

    我想,99%的人都知道微营销是趋势也是座金矿!但遗憾的在,大多数人都不知道微信赚钱的商机和盈利模式!还不知道有了微信应该如何落地,如何转换成现金和钞票!! 当你每天早上.晚上一直玩着手机,看着无聊的信 ...

  5. 99%的人都不知道的90个秘密

    1.拉斯维加斯的赌场都没有钟. 2.麦当劳40%的利润来自Happy Meals的销售. 3.1996版的韦伯斯特词典有315处拼写错误. 4.每天平均有12个新生儿被交给错误的父母. 5.巧克力对于 ...

  6. 微信服务通知消息找回_80%的人都不知道的10个微信冷知识,全都超实用!

    微信发展到现在,几乎成为了使用手机的人必装的国民软件,可是大家真的会玩微信吗?微信除了聊天.发朋友圈之外还有一些鲜为人知的"冷"知识,今天让我们一起来了解一下. 01"对 ...

  7. 80%的人都不知道的排版利器,博士生都在用它!

    不知你有没有想过这样一个情况:在Word上如何排出优美的数学公式? 如果你没想过,或许是因为你不是理工科本科生或研究生.如果你想过且编辑过的话,你就会知道用Word排学术论文有多麻烦. 我在写学术论文 ...

  8. 99%的人都不知道的鸡兔同笼解法!

    鸡兔同笼 "鸡兔同笼问题"是我国古算书<孙子算经>中著名的数学问题,其内容是:"今有雉(鸡)兔同笼,上有三十五头,下有九十四足.问雉兔各几何."   ...

  9. 开源3问:95%的技术人都不知道的开源真相

    从世界上公认最早的开源软件A-2系统,到理查德·斯托曼在麻省理工学院发起的著名GNU计划,再到九十年代Linux内核被开发出来,与GNU计划强强联合成为了第一个开源操作系统,在历史的滚滚车轮下,开源在 ...

最新文章

  1. 吴恩达老师机器学习和深度学习课程文字版下载
  2. 在DWR中实现直接获取一个JAVA类的返回值的两种方法
  3. Web组件 – 构建商业化应用的基石
  4. SAP Commerce开发时的Spring学习要点记录
  5. 【渝粤教育】电大中专公共基础课程_1作业 题库
  6. java或异运算_java中与运算,或运算,异或运算,取反运算
  7. python白盒测试_白盒测试方法
  8. python3多线程第三方库_Python3标准库:concurrent.futures管理并发任务池
  9. 玩转 SpringBoot 2 快速整合 Filter 注解版
  10. 双对数坐标系matlab绘图,EXCEL自动计算液塑限并绘制图表至双对数坐标系.doc
  11. 【ubuntu】出现device not managed连接不上网络
  12. 一起谈.NET技术,基于CallContextInitializer的WCF扩展导致的严重问题
  13. svn linux客户端使用教程,linux svn 客户端安装配置
  14. 怎么在Eclipse中安装WindowsBuilder
  15. CharSequence接口
  16. 如何将dwg文件转为pdf?
  17. RAW 图像格式转换工具 bayer2rgb
  18. 没有大厂经验的前端可以这么写简历
  19. 多台显示器图像拼接组成大屏幕是怎么实现的?
  20. python实现用户账号密码登录且密码星号显示

热门文章

  1. 简单的方法爬取b站dnf视频封面步骤解释
  2. B站视频下载器,超清4k视频下载,一键解析视频合集,支持批量下载提取视频封面
  3. git clone出现fatal: unable to checkout working tree报错的解决办法
  4. Mysql时区差异异常-The server time zone value ‘xxx‘ is unrecognized or represents more than one time zone.
  5. webbench1-5源码分析
  6. GAIN: Missing Data Imputation using Generative Adversarial Nets学习笔记
  7. Vue + element-ui合并单元格后,checkbox多选单选取值问题
  8. 杰理之设置恒流充电电流【篇】
  9. 基线提升至96.45%:2022 司法杯犯罪事实实体识别+数据蒸馏+主动学习
  10. zbrush软件介绍