模块化及node.js模块化详解

**概念:**解决一个复杂问题时,遵守固定规则,自顶向下把问题逐层分解为一个个独立并相互依赖的小模块。

**优点:**提高代码的复用性,可维护性,以及实现了代码的按需加载。

**模块化规范:**很多开发语言都具有模块化的规范,而前端语言中最主要的则是ES6规范和CommonJs规范,前者主要作用于vue等框架,而CommonJS规范则是针对于node.js的规范化规则。

CommonJS:规定了nodejs中模块规范,包括模块的特性,以及各模块之间如何相互依赖

**模块作用域:**变量只能在当前模块内访问,可以防止变量污染(html中出现多个同名变量,导致错乱)

模块化规范的重点有两个:导入导出

**导入:**导入的意思是将某个模块导入到当前js文件里,方法:例:const moment = require(‘moment’) 重点在于require(‘导入的文件’),此处moment.js中的.js省略了,因为模块必定是.js文件,所以可以省略

**导出:**导出的意思是让当前模块内的指定内容可以被其他模块使用,方法有两种:(1)通过module里面的exports属性将需要提供给外界使用的成员传出,具体用法:module.exports.函数名或变量名;(2)exports.函数名或变量名

**导出方式详解:**这两种中方式将数据以属性名和属性值的方式存在一个对象里,并且这两种方式写入内容的对象空间是同一个(系统预留的一个空间,也这两种方式的默认指向空间),只是后一种写法缩略了一点,但是,当同时使用了这两种写法时,以module.exports所指向的空间为准,此处分为几种情况:(1)exports和module.exports都没有创建新的{}空间,而是直接以exports.属性名 = 属性值的方式添加内容,此时通过这两种方式导入的内容都存在于{}空间中,都能被读取
(2)exports通过exports={a:1}创建了空间,但是module.exports.b=2没有创建空间,此时输出为b:2,原因是:被解释器承认的是module.exports所指向的空间(即module.exports具有开辟空间的能力,但是exports没有,不被承认)
(3)exports.a=1 module.exports={b:2} 即exports是添加的属性到系统设置的预留空间,而module.exports是创建了一个新的空间,结果是{b:2},原因是系统识别的依据是module.exports所指向的空间,而并不一定是系统预留的那个空间
(4)exports = {a:1} module.exports = exports module.exports.b = 2 此种方式输出结果为{a:1,b:2} ,原因是虽然exports创建的空间不被承认,但是经过module.exports的指向之后,它就被承认了(本质上还是承认的module.exports所指向的空间)
**总结:**在实际使用时,一般不会通过exports或module.exports去自行创建空间,这样会引出这两者的数据生效问题,以及空余了一个系统预留的空间导致的空间浪费;一般的使用方式都是通过点语法直接往预留空间里面添加属性名和属性值。

你可能感兴趣的