网上有很多关于Node.js模块机制的文章,说了在Node.js中是如何加载模块的,这是一个模块载入的策略问题。今天主要讲解一下Node.js中模块的使用,讲解为何可以将一个模块引入到项目中,或者是任意的文件中。
说道模块,其实前端也有,就是使用<script>标签将外部的javascript文件引入,然后可以使用所引入的javascript文件中所定义的变量,对象,函数等等,同样的,在Node.js中模块,其实就是这一个个相互独立,又可以组织在一起的javascript文件,但是每个文件都有自己的组织。
举个例子,自己任意写一个文件test.js
#testModule.js
这样我恩就写完了一个自定义的模块,下面我们对这个模块进行测试:
#test1.js
运行一下代码:
看了上面的这个小demo,你大概猜到我要讲什么了,我要讲的是:
所谓的模块其实不是很神秘,很特别的东西,它就是javascript文件,就跟你使用<script>引入外部的javascript一样,只是为了更好的管理代码,更好的扩展,更好的复用代码。
这样讲是不是就感觉模块这个东西不是很难理解了??
查看Node.js的API,或者查看Node.js的源代码,你会发现有一个类 叫 module,module类下面还有一个成员叫 exports,也是一个对象。
在我们自己写的模块里我们使用的是:
exports.say= say;
这是简写,完整的写法如下所示:
module.exports.say = say;
这句话是什么意思呢??就是将say函数赋值给变量say,并将这个变量保存在对象exports中。作为其成员。
在要引入模块的文件中,我们使用的是require()函数。
这样就打通了加载testModule模块的通道。我们可以访问testModule的方法和属性了。
在这里要重点将的问题:那就是把谁暴露在外面。我们自己写的模块中,我们把say函数暴露在外面,引入了文件testModule后就可以调用它里面定义了函数了
其实接口暴露的方式很多的,或者直接执行代码。只要我们理解了这个原理就可以在查看模块源代码后知道其用法。
还是要强调一下,那就是模块其实就是javascript的文件,引入模块,可以理解成把模块中的代码全部拷到当前的javascript文件里。这样使用API或者理解其结构也比较简单了。
举个例子:
很多人在群里问express框架的启动方式,有的是node app.js/有时候变成了 node ./bin/www,其实这没有什么差别的,只是把app当成一个模块,然后在bin目录下的www文件中引入这个模块,我上面讲的话来理解的话就是把app.js里面的代码全部拷贝到www文件里面,然后使用node ./bin/www来运行代码跟node app.js不是一样的嘛,并没有规定必须要使用app.js,那我们上面不是也用node test1.js 了嘛。
理解了这个东西后,想软件设计里面的MVC架构或者什么的,统统都可以按照自己要的来,甚至你也可以自己搭建类似express的项目结构,把需要独立的出来的代码独立出来放在想要放的文件夹里面,文件之间使用require来链接就可以了,剩下的都是javascript面向对象等知识,可以创建控制类,不同的控制类有不同的成员方法什么的。随便你想怎么搞都行。