模块化
模块化做为一种现代化的设计方法,这个概念最早起源于生产制造行业。如今这个概念已经被各行各业来衍生应用,在软件开发中也大量的采用了模块化思想。
所谓的模块化思想,将一个大程序按照功能划分为若干个小的模块,每个小程序模块完成一个特定的功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求功能的程序设计方法。
(一)、为什么需要模块化
模块化可以使你的代码低耦合,功能模块直接不相互影响。
为什么需要模块化:
- 程序复杂度上升代码越写越多,在一个文件里代码就会越来越长,不易维护。(把完成特定功能的代码分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少)
- JavaScript 有复杂的依赖关系的时候就很容易出现一些变量的属性或方法被覆盖或改写,导致变量污染。这是因为js没有命名空间,不像其他语言通过命名空间可以有效的避免重名问题。
- 想要存在JavaScript 私有的变量
模块化思想解决问题:
- 可维护性:每个模块都是单独定义的,之间相互独立。模块尽可能的需要和外部撇清关系,方便我们独立的对其进行维护与改造。维护一个模块比在全局中修改逻辑判断要好的多。
- 命名冲突:为了避免在JavaScript中的全局污染,我们通过模块化的方式利用函数作用域来构建命名空间,避免命名冲突。
- 文件依赖:一个功能可能依赖一个或多个其他文件,使用是除了引入它本身还需要考虑依赖文件,通过模块化 我们只需要引入文件,无需考虑文件依赖(模块化可以帮助我们解决文件依赖问题)。
- 可复用性:虽然粘贴复制很简单,但是要考虑到我们之后的维护以及迭代。
(二)、什么是Nodejs模块
为了让Nodejs的文件可以相互调用,Nodejs基于CommonJS规范提供了一个简单的模块系统。(nodejs实现并遵守CommonJS规范的)。
把具有公共功能的,抽离成一个单独的js文件作位一个模块。默认情况下,模块里的方法或属性,外面是访问不到的。如果想要在外面访问这些属性,方法,就必须在模块里通过exports
和module.exports
暴露,在需要使用的地方通过require()
进行引入。
//exports语法示例
// sum.js
exports.sum = function(a,b){
return a+b;
}
// main.js
var m = require("./sum");
var num = m.sum(10,20);
console.log(num);
//modules.exports语法示例
//sum.js
function sum(a,b){
return a+b;
}
module.exports= sum;
//main.js
var sum = require('./sum');
sum(10,20);// 30
CommonJS 规定:
- 每个模块内部,module 变量代表当前模块
- module 变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口
- 加载某个模块,其实是加载该模块的 module.exports 属性。require() 方法用于加载模块。
(三)、nodejs中的模块分类与加载方式
Node.js 中根据模块来源的不同,将模块分为了 3 大类,分别是:
-
内置模块(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)
-
自定义模块(用户创建的每个 .js 文件,都是自定义模块)
-
第三方模块(包)(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
//1.加载内置模块不需要指定路径
var http = require('http');
//2.加载用户的自定义模块
var sum = require('./sum.js');
//3.加载第三方模块
const md5=require("md5");
(四)、模块作用域
- 和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。
- 模块作用域的好处:防止了全局变量污染的问题