1.node.js模块概述为了让node.js文件能够相互调用,node.js提供了一个简单的模块系统。模块是node.js应用程序的基本组件,文件和模块之间存在一一对应关系。也就是说,一个node.js文件就是一个模块,这个文件可能是javascript代码,json或者编译后的c/c++扩展。其中http、fs、net等是node.js提供的核心模块,用c/c++实现,外部用javascript封装。2.创建模块的两种方法创建模块有两种方法。通过exports创建通过module.exports创建2.1通过exports创建模块在node.js中,创建模块非常简单。我们创建一个main.js文件,里面引用了hello模块,代码如下,varhello=require('./hello')hello.world()上面代码中,require('./hello')引入当前目录中的hello.js文件。./代表当前目录,node.js默认后缀为js。Node.js提供了两个对象,exports和require,其中exports是模块对外暴露的接口,require用于从外部获取模块的接口,即获取模块的exports对象。接下来,我们创建hello.js文件,如下代码所示,exports.world=function(){console.log('helloworld')}在上面的例子中,hello.js使用exports对象作为访问模块的接口,在main.js中通过require('./hello')加载这个模块,然后在hello.js中可以直接访问exports对象的成员函数。2.2通过module.exports创建模块有时候我们只是想把一个对象封装成一个模块,如下格式,module.exports=function(){}按照上面的格式写一个模块,下面是hello.js代码,functionHello(){变量名称;this.setName=function(thyName){name=thyName}this.sayHello=function(){console.log('hello'+name)}}module.exports=Hello这样就可以直接获取this对象,如下main.js代码,//main.jsvarHello=require('./hello')hello=newHello()hello.setName('BYVoid')hello.sayHello()模块接口唯一的变化是使用了module.exports=你好,而不是exports.world=function(){}。当模块被外部引用时,它的接口对象是要导出的Hello对象本身,而不是原来的导出。2.3exports和module.exports的区别为了更好的说明exports和module.exports的关系,用一个简单的js例子来说明,如下代码,vara={name:1}varb=aconsole.log(a)console.log(b)b.name=2console.log(a)console.log(b)b={name:3}console.log(a)console.log(b)runtest.js结果for,{name:1}{name:1}{name:2}{name:2}{name:2}{name:3}简单解释一下上面的代码:a是一个对象,b是对一个对象的引用,此时a和b只想要同一块内存,所以前两个输出是一样的;当b被修改时,a和b只想改变同一个内存地址的内容,所以a的值变化也反映了当b被覆盖时,b只想要一块新的内存,而a仍然只想要原来的内存,所以最后两个输出是不同的。理解了上面的例子,你只需要点3点就可以理解exports和module.exports的区别了。module.exports的初始值是一个空对象{}exports只是对module.exports的引用。require()返回module.exports而不是exports意味着module.exports才是真正的接口,而exports只是它的一个辅助工具。最后返回给调用者的是module.exports而不是exports。同样,在node.js中,一个文件对应一个模块。为了方便,module中会有一个exports对象,它指向和module.exports同一个变量,所以当我们修改exports对象的时候,也会修改module.exports对象;当我们通过赋值的方式给module.exports赋值时,此时module.exports指向的变量和exports对象是不一样的,所以无论exports对象怎么变,都和module.exports没有关系目的。大胆的!大胆的!大胆的!一般来说,推荐使用module.exports,尽量少用exports。3、require搜索模块的方式node.js中有两种模块,即核心模块文件module3.1搜索核心模块核心模块直接通过名称获取,比如常用的http模块,获取使用下面的代码,varhttp=require('http')...http.createServer()简单描述一下上面的代码,node.js自带了一个模块叫做http,在上面的代码中我们请求它并赋值返回值给一个局部变量,让局部变量编程一个对象,这个对象拥有http模块提供的所有公共方法。3.2搜索文件模块在前面创建的模块的demo中,使用require('./hello')语法,如下代码,varHello=require('./hello')hello=newHello()hello.setName('BYVoid')...这里我们使用./test来获取自定义文件模块,也就是通过相对路径或者绝对路径来查找文件模块的方式。3.3搜索模块规则node.js加载模块时,遵循以下加载规则。核心模块优先级最高,直接按名称加载。当存在命名冲突时,首先加载核心模块。文件模块只能根据路径加载——相对路径或绝对路径,默认.js后缀可以省略去node_modules目录搜索。当我们调用npminstall
