Node模块机制-模块化编程

本章要点 1、模块化编程的概念 2、模块化编程的优势 3、模块化编程的演变 4、常见的处理模块化的方法 5、全局函数及函数作用域 6、对象命名空间 1、什么是模块化? 模块化是一种设计思想。利用模块化可以把一个非常复杂的系统细化到一个个具体的功能点,每一个功能点都可以看做一个模块,通过某种规则就可以把这些小的模块组合到一起,构成模块化系统。 规则:CommonJS规范 1.1、模块化开发的优点 1、开发效率高,方便代码重用。开发好的模块可以直接使用。 2、维护成本低,在软件开发周期中,由于需求的改变,会对业务逻辑进行改动,模块化开发只针对特定模块进行维护。 1.2、非模块化开发存在的问题 1、命名冲突 在多个开发者的项目中,在引入的多个文件中,会存在命名冲突的问题。 2、文件依赖 在引入的多个文件中,会存在多个文件的依赖,一个文件的使用,会用到第三方文件中的内容。 1.2.1 命名冲突 在一个页面中引入a.js文件和b.js文件 a.js文件内容为 // 声明全局变量 var urlName = "www.baidu.com"; b.js文件内容为 // 声明全局变量 var urlName = "www.jd.com"; 所以,在一个页面中分别引入a.js和b.js,就会造成同名变量“urlName”的命名冲突。因为两个都是全局属性,后引入的文件就会覆盖先引入的文件。 1.2.2 文件依赖 在一个页面引入多个文件 命名冲突 如上面引入文件所示,基本上不同文件之间是不能体现一个依赖关系,如果aa.js文件的执行,用到了a.js文件中的变量和方法,在页面中是体现不出来。如果删掉或漏掉a.js文件的引入,那么此页面执行就会报错。 2、模块化编程的演变 在使用非模块化编程模式时,越大型的网站或项目,命名冲突或文件依赖度越高。这样页面代码的复用和维护就会变得越来越困难。 2.1全局函数 在javascript中,函数内部声明的变量是局部变量,函数外部声明的变量是全局变量。 在全局声明的函数就是全局函数,在全局声明的所有函数,都是window对象下的方法。 全局函数这种编程方式不可取,因为所有的变量和函数都暴露在全局,无法保证全局变量不与其它模块的变量发生冲突。 2.2对象命名空间 对于开发中使用全局函数出现的命名冲突问题,可以使用对象的命名空间来解决。 // 对象命名空间 var calculator = {}; // 加法 calculator.add = function(a,b){ return a + b; } // 减法 calculator.subtract = function(a,b){ return a - b; } // 乘法 calculator.multiply = function(a,b){ return a * b; } // 除法 calculator.divide = function(a,b){ return a / b; } 由上面的代码可以知道哪些函数属于同一模块,对于声明的四个函数也相应的减少了命名冲突的可能。这仅仅是理论上减少了命名的冲突,命名冲突仍然存在,会在声明同样的对象名称和函数名称时,才会出现命名冲突。 2.3、函数作用域(闭包) 全局函数和对象的命名空间都不能很好的解决命名冲突的问题,而且在开发过程中,有一些不想被外部访问的私有属性该怎么处理。 1、javascript通过封装函数的私有空间,让一些属性和方法私有化,也就是所谓的**闭包**。 2、JavaScript函数作用域的特点,通过匿名自执行函数,进行私有变量分离。 用于计算的四个方法封装到匿名自执行函数中,如果不添加返回值,外部是访问不到的。添加到返回值后,在全局可以通过“匿名函数”."函数名()"的形式调用。 这种方式对于外部即开发了公共的方法,又保存了私有属性和元素,私有空间的函数和变量也不会影响全局作用域。 在原来基础上进行模块的扩展,很多框架都是基于匿名自执行函数处理的。在匿名自执行函数传递一个对象做参数 "cal || {}",如果对象存在就使用,如果不存在就重新创建对象。 模块化是一种设计思想,利用模块化可以把一个非常复杂的系统结构细化到具体的功能点,把每个功能点都作为一个模块,然后通过某种规则把这些小的模块组合到一起。 模块化的优点:开发效率高,维护成本低。

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):