一、模块的概念
在node出现之前,js
并没有模块系统的概念,后来出现了CommonJS
规范,弥补了javaScript
没有模块的缺陷。
CommonJS
对模块的定义十分简单:模块引用
、模块引用
、模块标识
。
虽然说,我们之前使用的例如jQuery
是一个模块,但一方面,这样的模块并不是很多。另一方面,就拿jQuery
来说,内部的很多插件模块在使用的时候必须按序导入,这样看来,其实并不是一个理想的模块系统。
node的出现,形成了较好的模块系统,使得开发更加的高效。
二、语法
1.引入其他的模块
简单来说,引入模块,就相当于在html
中引入jQuery
。
- 在
node.js
中,通过require()函数来引入外部的模块。require()
可以是传递一个文件的路径作为参数,node
将会自动根据该路径来引入外部模块。
- 这里的路径,如果使用相对路径,必须以
.
或..
开头。 - 使用require()引入外部模块时,使用的就是模块标识,我们可以通过模块标识来找到指定的模块。
- 当所需模块在node_module这个文件夹下的话,在引入的时候可以不写完整路径,只写node_modules下的文件夹的名字,node系统会自动找下面文件名为
index.js
的文件(注意这里必须是index.js) - 模块分成两大类:核心模块:由node引擎提供的模块(核心模块的标识就是,模块的名字);文件模块:由用户自己创建的模块(模块的标识就是绝对路径,相对路径)。
- 使用require()引入模块以后,该函数会返回一个对象,这个对象代表的是引入的模块。
- 在
node
中一个js
文件就是一个模块。 - 在node中,每一个
js
文件中的js
代码都是独立运行在一个函数中。而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问。 - 这个最顶部的函数是这样的:
function(exports,requrie,module,_filename,_dirname){}
- 这个函数是由node的引擎所调用,而在内部所使用的方法都是通过参数传进去的。比如下面的
require
,exports
。
我们分别介绍一下这5个参数
exports -该对象用来将变量或函数暴露到外部
require -函数,用来引入外部的模块
module -module 代表的是当前模块本身 exports就是module的属性 exports==module.exports
_filename -当前模块的完整路径
_dirname -当前模块所在文件夹的完整路径
//引入module.js模块,使用变量md接收一个对象
var md=require("./module.js")
console.log(md)
- node在使用模块的名字来引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块。如果有则直接使用,如果没有则去上一级目录寻找,直到找到为止。直到找到磁盘的根目录,如果依然没有,则会报错。
三、.向外暴露属性或方法
1.我们可以通过exports
或者module.exports
(两者是同一个对象)来向外部暴露变量和方法 只需要将需要暴露给外部的变量或方法设置为exports的属性即可。
exports.x="我是module.js中的x";
exports.y=function(){}
//引入上面的模块
var obj=require('./module.js');
console.log(obj); //结果是{x:"我是module.js中的x"}
2.exports
/modules.exports
的区别
//可以使用module.exports导出一个对象
module.exports={
name:"lhh",
age:28,
sayName:function(){
console.log(this.name)
}
}
- exports是
module.exports
的一个引用,所以通过exports.name
或者是exports.age
的方式导出一个对象,此时和module.exports
指向的是同一个对象。但如果使用exports={}的方式导出一个对象,相当于exports指向了一个新的对象,但是再导入模块的时候,所寻找的是本模块,也就是module下的exports对象,所以使用exports导出这时候不会导出一个所想要的对象。 - 在用法上
exports
只能 使用.
的方式导出,而module.exports
可以通过对象的方式导出。
四、全局对象global
在node中有一个全局对象global,它的作用和网页中window类似 在全局中创建的便来哪个都会作为global的属性保存 在全局中创建的函数都会作为global的方法保存。