模块化

什么是模块化

模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。 对于整个系统来说,模块是可组合、分解和更换的单元。

生活中的模块化

编程中的模块化

编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。

把代码进行模块化拆分的好处:

  • 提高了代码的复用性
  • 提高了代码的可维护性
  • 可以实现按需加载
  • etc…

模块化规范

模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的那些规则。

例如:

  • 使用什么样的语法格式来引用模块 (require(‘fs’))
  • 在模块中使用什么样的语法格式向外暴露成员 (目前没有学习,马上学习)

模块化规范的好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用, 利人利己。

我们自己写模块,也要遵守模块化的标准

Node.js 中模块的分类

Node.js 中根据模块来源的不同,将模块分为了 3 大类,分别是:

  • 内置模块(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)
  • 自定义模块(用户创建的每个 .js 文件,都是自定义模块)
  • 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)

加载模块

// 加载核心模块
const fs = require('fs');// 加载第三方模块
const express = require('express');// 加载自定义模块
const custom = require('./custom');

使用 require() 加载模块后,会缓存起来,下次再调用 require()加载相同模块的时候,直接使用缓存,而不是从新加载,从而大大提高了性能。

注意事项

  • 无论是什么模块,我们都要使用 require() 去加载,然后才能使用。
  • 加载自定义的模块,需要加 ./ ,而且可以省略后缀 .js

自定义模块的实现(重点)

Node.js中的模块作用域

在 Node.js 中,用户创建的每个 .js 文件都是自定义模块。 在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域

模块作用域的好处是避免了全局变量污染。

导出导入模块

为了能正常使用加载的模块中的成员,CommonJS给出了标准,即

  • 一个模块需要使用 module.exports 导出需要共享的内容。
  • 使用模块的JS文件需要使用 require() 导入模块。

模块导出的是什么,另一个使用模块的JS文件得到的就是什么。

了解CommonJS规范

为了实现模块化。

模块化规范的种类:

  • AMD
  • CMD
  • CommonJS — Node.js 遵循CommonJS
  • ES6

Node.js 遵循了 CommonJS 模块化规范,CommonJS 规定了模块的特性和各模块之间如何相互依赖。

CommonJS 规定:

  1. 每个模块内部,module 变量代表当前模块。
  2. module 变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口。
  3. 加载某个模块,其实是加载该模块的 module.exports 属性。require() 方法用于加载模块。

require() 加载模块的机制

加载自定义模块和其他模块的机制有相同之处,也有不同之处,所以这里分开来看。

加载自定义模块

  1. 首次加载成功,会缓存模块
  2. 下次从缓存中加载,速度更快
  3. 加载模块必须加 ./ ,如果是其他路径,对应变化,否则会把它当做核心模块或者第三方模块
  4. 加载模块的时候,如果是 require('./abc')
    1. 优先加载相同名字的文件,加载一个叫做 abc 的文件
    2. 自动补 .js 后缀,然后加载 abc.js 文件
    3. 自动补 .json 后缀,然后加载 abc.json 文件
    4. 自动补 .node 后缀,然后加载 abc.node 文件
    5. 以上文件都没有,则报错 Cannot find module './abc'

加载核心模块和第三方模块

  1. 首次加载成功,会缓存模块
  2. 下次从缓存中加载,速度更快
  3. 加载模块一定不能./ ,否则会把它当做自定义模块
  4. 加载模块的时候,如果是 require('haha')
    1. 优先加载核心模块
    2. 去查找并加载第三方模块,查找第三方模块的路径可以通过 module.paths 查看

Node — 第三天相关推荐

  1. linux pm2 权限,pm2 部署 node的三种方法示例

    Node安装以及部署 去官网下载最新版本,分两种一种是源码,一种是编译后的文件.下面是官网下载地址: https://nodejs.org/en/download/current/  分不同的版本 w ...

  2. 一头扎进Node(三) - File System

    file.open:异步模式打开文件 fs.open(path, flags[, mode], callback) 案例代码如下: var fs = require('fs');/*** 参数说明:* ...

  3. 打开浏览器的包 node_如何发布可在浏览器和Node中使用的软件包

    打开浏览器的包 node When you create a package for others to use, you have to consider where your user will ...

  4. 【鸿蒙 HarmonyOS】HarmonyOS 开发环境搭建 ( Node.js 安装 )

    文章目录 一.下载 Node.js® 安装包 二.安装 Node.js 三.验证 Node.js 鸿蒙 HarmonyOS 开发环境 DevEco Studio 安装 , 参考博客 : [鸿蒙 Har ...

  5. JS中Node节点总结

    Node的三个基本属性: 1.nodeType:表明节点类型,1是元素节点,3是文本节点. 2.nodeName:  表明节点名称,元素节点为标签名,文本节点为#text. 3.nodeValue:表 ...

  6. Linux部署Node.js应用

    Linux部署Node.js应用 文章目录 Linux部署Node.js应用 一.背景描述 二.环境准备 三.添加守护进程 四.参考链接 一.背景描述 将基于Node.js开发的应用部署到Linux系 ...

  7. PWA · 前后端协作 · Node | JTalk 掘金线下活动第七期

    通知 余票仅剩 3张,欢迎加入活动群获取更多通知.北京的小伙伴可以关注我们的 JTalk 第八期:前端安全 | 美团点评技术团队专场 ? 报名 扫码报名: 报名链接:点我报名 ? 介绍 本期 JTal ...

  8. Hadoop自学笔记(三)MapReduce简单介绍

    1. MapReduce Architecture MapReduce是一套可编程的框架,大部分MapReduce的工作都能够用Pig或者Hive完毕.可是还是要了解MapReduce本身是怎样工作的 ...

  9. 【es】Node与NodeEnvironment的实例化

    1.概述 转载:[8]elasticsearch源码深入分析--Node与NodeEnvironment的实例化 2.Node概览 前不久的分析中说到了,Node是ElasticSearch启动的重中 ...

最新文章

  1. jetbrains intellij IDEA 常用插件和配置
  2. zookeeper 3.4.6安装
  3. 修改MyEclipse/Eclipse左侧文字大小(MacOS/Windows)
  4. python shelve模块
  5. 【转】WM_MESSAGE、WM_COMMAND、WM_NOTIFY等消息有什么不同
  6. 【机器学习】XGBoost集成算法——(理论+图解+python代码比较其他算法使用天池蒸汽数据)
  7. DVWA设置mysql_dvwa安装、配置、使用教程(Linux)
  8. Oracle之批量生成数据
  9. 每日小记2017.3.7
  10. linux下的C语言开发(动态库)
  11. 温度转换的python程序_python学习阶段性小结
  12. 计算机专业sci二区论文难吗,SCI二区论文发表难度大吗
  13. Matlab实现数字转换为字符串
  14. 失业登记对养老保险是否有影响
  15. 汇编总结:无符号除法,有符号除法,取余,无符号乘法,有符号乘法指令
  16. php后端开发主要会哪些技术?
  17. 异步FIFO的原理以及可综合的Verilog代码
  18. Ant Counting
  19. 推荐专业IT电子书下载网站-https://itbook.download/
  20. 关于python语言和人工智能以下哪个说法不正确_以下关于机器学习说法正确的是?_学小易找答案...

热门文章

  1. springboot + kafka
  2. [机器学习] gcForest 官方代码详解
  3. [二叉树] 判断一个二叉树是否是平衡(剑指offer39)
  4. cygwin安装skyeye 所需的软件包列表
  5. sklearn的认识
  6. DeepR —训练TensorFlow模型进行生产
  7. 将ARM4412开发板配置成USB网卡,并且使用USB通过Ubuntu上网
  8. 联想王传东回应“宁愿放弃5G也不选华为”言论:纯属谣言
  9. Chapter 7:Statistical-Model-Based Methods
  10. python 发送邮件不显示附件_python3发送邮件(无附件)