澳门电玩城娱乐app

node.js模块简明详解

  我们先简单描述下模块的特点,模块是一个独立的完成某些功能的单位,它应该具有抽象性、封装性(接口),例如u盘就是一个模块,为什么这么所呢,

  3.封装性:u盘里面有哪些零件,往往从它外面是看不见的,这里这么说会有些歧义,严谨点说就是u盘里面的那些我们不需要关心的零件,u盘都包装了起来,对外只会留给我们一个使用的usb接口(接口在封装性中非常重要)

  js的模块化的发展是一个演进的过程,目的是为了解决命名冲突、文件依赖等问题,一些原始的写法、模块化的工具sea.js、requireJs、再到webpack等工具这些模块化的知识大家可以参考其他资料,这里笔者不赘述,只说关键的、跟要说的node.js模块相关的,先来看代码

  上面的代码就是js的一个模块,独立完成某些功能和抽象,这里不用说了,就是一个简单add方法,我们重点说下封装,这里使用return的方式对外开放接口, 而在函数里面的其他代码例如bar,就属于被函数封装了。那么为什么要说这一段js代码,其实不管AMD、CMD、commonJs规范或者es6的模块,它们的实现的核心就是函数自调用的这种封装。

  首先说node.js模块是采用CommonJS模块规范,那么和上面js模块有什么样的关系,先不用着急,我们先看下下面这个图:

  这是在Chrome控制台上定义一个foo,window对象就会多一个属性foo,我们在页面上加载的js代码都有这样的特点,因为window是全局对象。

  对比一下node.js的代码,node.js也有一个全局对象global,会不会和window一样呢,我们看下下面的代码:

  在一个js里面去定义全局变量foo,foo会变成global的属性,而bar没有,bar变成这个js私有的了,就如同下面这张图:

  在node.js里面,我们把一个js就看成是一个模块,它具有封装性,在这个模块里面的代码(全局变量除外)都是私有的,如果想要被外部调用,那就需要exports与module.exports曝露出去,并且用require去接收。module.exports与exports

  一个node.js模块中也就是一个js中(下面我们都用一个模块代替一个js),module.exports用法如下

  有了代码的曝露,那么也就有代码的引入,require就是用来加载模块的,这里我们先不谈模块化系统,只说加载一个简单模块,module.exports与require如下

  两种写法都可以,所以一次性曝露用module.exports,如果是曝露多个属性、方法、字符串等用exports比较简单。

  现在我们就清楚了为什么一个js里面的代码是具有封装性的了,用的是js模块那提到过的函数函数自调用的方式封装的。

  这里我们看到一个module对象,这个对象是用来存储每一个模块的信息,我们可以在模块的代码里面打印下module看一下

  如上图,module里面的exports默认是一个空对象,和我们模拟的写法一致,这也就是我们可以直接是引用module.exports.属性曝露接口的原因,parent、children是用来存被引用和引用的模块的,paths这是npm查找模块的路径,每一个被node加载的模块都有唯一的一个module存储着这个模块的信息,也说明module是动态产生的。笔者在这里只谈基础的模块,至于模块化系统,请参考其他文章。

上一篇:台风 - 简书

下一篇:没有了