在开发复杂Web应用的时候,一般须要把各个功能进行拆分、封装到不一样的文件并在须要的时候引用该文件,即进行代码的模块化管理。几乎全部的编程语言都有本身的模块组织方式,好比Java中的包、C#中的程序集,而Node采用CommonJS模块规范。node
模块规范编程
CommonJS旨在将运行在浏览器以外的JS进行标准化,并已经解决了大量的JS问题(如全局命名冲突)。Node对CommonJS的实现中,每一个模块都会被封装在一个单独的JS文件中,即一个文件就是一个模块,而文件路径就是模块名。在编写每一个模块时,都有如下三个预约义好的变量可供使用: require()json
该函数用于在当前模块中加载和使用别的模块,传入一个模块名,返回一个模块导出对象。模块名可使用相对路径(以./开头),也可使用绝对路径(以/或C: 之类的盘符开头)。另外,模块名中的.js 扩展名是能够省略的,此时Node会寻找同名的文件夹,若是找不到,则寻找同名的js文件。还可使用该函数加载和使用一个JSON文件,但此时.json 扩展名不可省略。 exports浏览器
该对象是当前模块的导出对象,用于导出模块公有方法和属性,默认为一个空对象{}。别的模块经过require()函数使用当前模块时获得的就是当前模块的exports对象。如下代码中导出了一个公有方法:缓存
exports.hello = function() { console.log("Hello World!"); };//欢迎加入全栈开发交流圈一块儿学习交流:864305860
module编程语言
该对象用于提供当前模块的元数据等相关信息,但用途最多的是使用其exports属性替换当前模块的导出对象。例如模块导出对象默认是一个普通对象,可使用如下方式使其变成一个函数:模块化
module.exports = function() { console.log("Hello World!"); };
注意:当使用以上方式时,对exports对象的全部修改都将被忽略!函数
模块初始化学习
一个模块中的JS代码仅在模块第一次被使用时执行一次,并在执行过程当中初始化模块的导出对象。以后,缓存起来的导出对象被重复利用。 在test.js定义一个模块ui
//定义私有变量 var name = ""; function setName(n) { name = n; } function logName() { console.log(name); }//欢迎加入全栈开发交流圈一块儿学习交流:864305860 //帮助突破技术瓶颈,提高思惟能力 //导出公有方法 exports.setName = setName; exports.logName = logName;
在main中加载test模块
//加载test模块 var test1 = require("./test.js"), test2 = require("./test.js"); //使用test1 test1.setName("Neo"); //欢迎加入全栈开发交流圈一块儿学习交流:864305860 //使用test2 test2.logName(); //Neo
可见,不管调用多少次require() ,对于同一个模块只加载一次,引用屡次获取的实际上是相同的实例。 主模块 经过命令行参数传递给Node以启动程序的模块称为主模块,主模块负责调度组成整个应用程序的其余模块协同工做。例如经过如下命令行启动程序时,main.js 就是主模块:
$ node main.js
二进制模块 Node除了可使用JS编写模块,也支持使用C/C++编写二进制模块,编译好的二进制模块除了文件扩展名是.node外,和JS模块的使用方式相同。虽然二进制模块能使用操做系统提供的全部功能,但难以跨平台使用。 结语
感谢您的观看,若有不足之处,欢迎批评指正。