Module模式是JavaScript编程中一个非常通用的模式,由于
问题版本
import在nodejs工具暂时还是无法支持(可以通过其他方式实现,但是太麻烦了),今天本着自己偷懒原则,不想写run.html运行测试,而是在控制台输出,在操作过程中遇到了Module,照抄作业的例子的模式,发现根本行不通,如是请教了大佬,现在好好来了解下,
Module是一个Node内部提供的构建函数。所有模块都是Module的实例。
接下来我先查阅了资料看了看Module模式的基本特征:
模块化,可重用;
封装了变量和function,和全局的namaspace不接触,松耦合;
只暴露可用public的方法,其它私有方法全部隐藏.
每个模块内部,都有一个module
对象,代表当前模块。它有以下属性。module.id 模块的识别符,通常是带有绝对路径的模块文件名。
module.filename 模块的文件名,带有绝对路径。
module.loaded 返回一个布尔值,表示模块是否已经完成加载。
module.parent 返回一个对象,表示调用该模块的模块。
module.children 返回一个数组,表示该模块要用到的其他模块。
module.exports 表示模块对外输出的值。
module.exports属性(重点来了!)
module.exports属性表示当前模块对外输出的接口,其他文件加载该模块,实际上就是读取module.exports
变量
上面模块会在加载后1秒后,发出ready事件。其他文件监听该事件,可以写成下面这样。
exports变量
为了方便,Node为每个模块提供一个exports变量,指向module.exports。这等同在每个模块头部,有一行这样的命令。
造成的结果是,在对外输出模块接口时,可以向exports对象添加方法。
注意
1、 不能直接将exports变量指向一个值,因为这样等于切断了exports与module.exports的联系。
2、 因为exports不再指向module.exports了。
下面的两种写法是无效的。
上面代码中,hello函数是无法对外输出的,module.exports被重新赋值了。
这意味着,如果一个模块的对外接口,就是一个单一的值,不能使用exports输出,只能使用module.exports输出。
这里是重重点(大坑),最近我们学习了面向对象编程,下面的这个例子很好的展现了。在有类的情况下怎么实现对外输出(后面有仔细介绍require部分):
** require命令**
Node使用CommonJS模块规范,内置的require命令用于加载模块文件。
require命令的基本功能是,读入并执行一个JavaScript文件,然后返回该模块的exports对象。如果没有发现指定模块,会报错。
require命令用于加载文件,后缀名默认为.js。
运行下面的命令,可以输出exports对象。
如果模块输出的是一个函数,那就不能定义在exports对象上面,而要定义在module.exports变量上面。
加载原则
据参数的不同格式,require命令去不同路径寻找模块文件。(绝对重要,很好的解决了我们平时引包)
(1)如果参数字符串以“/”
开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js。
(2)如果参数字符串以“./”
开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js。
(3)如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。
(4)如果参数字符串不以“./“或”/“开头,而且是一个路径,比如require('example-module/path/to/file'),则将先找到example-module的位置,然后再以它为参数,找到后续路径。
(5)如果指定的模块文件没有发现,Node会尝试为文件名添加.js、.json、.node后,再去搜索。.js件会以文本格式的JavaScript脚本文件解析,.json文件会以JSON格式的文本文件解析,.node文件会以编译后的二进制文件解析。
(6)如果想得到require命令加载的确切文件名,使用require.resolve()方法。
参考(千万不要点这个链接啊!):
http://javascript.ruanyifeng.com/nodejs/module.html#toc1
;