commonjs即模块化,需要理解的有2个主要的地方:
1.module.exports
2.require()
我们一般用module.exports开放模块,在需要引入的地方用require()引入这个模块。举例说明:
新建dog.js文件,并写入以下代码:
let dog = {
name:'大黄',
id:9527,
dosomething:function(str){
return this.name+'正在玩'+str;
}
}
module.exports = dog;
这样,我们就制作完成了一个js模块,并将整个模块(dog)开放了出来
如果我们需要引用这个dog.js模块,只需要用require()方法引入即可:
我们再新建一个home.js文件,把dog.js引入进来,代码如下:
let homedog = require(./dog.js)
let id = homedog.id,
name = homedog.name;
console.log(id)
console.log(name)
我们打开命令窗口输入(需要提前安装node):node home.js ,可以看到打印出来:
9527
大黄
能看到打印的结果,说明引入成功
另外,有2点注意:
1.模块也可不完全开放,部分开放也是可以的
比如:在dog.js中,我们之前是把整个dog对象开放出去的(module.exports = dog;),这次我们只开放它的一个方法,改成:
module.exports = dog.dosomething;
那么,在home.js中我们也要修改下引入
let dosomething = require(./dog.js)
let play = dosomething('皮球')
console.log(play)
得到的打印结果是:undefind正在玩皮球
这里扩展下:
这个结果说明部分引用是没有问题的。但bug还是有的,undefind怎么来的呢?
说下原因:这是个常见的this转移问题,模块化的引用,我们是把dog.js里,对象dog的dosomething方法的引用地址,赋给了home.js的dosomething属性,因此,在调用的时候,this.name找不到了(this指向的是window),变成了undefind.
2.模块全部开放,引入时可以部分引入。
比如:dog.js里我们还是把整个dog对象开放出来(module.exports = dog;),但在home.js中,我们只引用它的方法,就可以这样写:
let dosomething = require(./dog.js).dosomething;
这样,就做到了完全开放模块,按需引入模块的作用