前端包浆记

NodeJs之初体验08--啥是模块

2019-02-12  本文已影响0人  水云楼

在Node环境中,一个.js文件就称之为一个模块(module)
Node.js 提供了 exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
那么使用模块有什么好处呢?

1、 提高了代码的可维护性
2、 提高了代码的延展性,当一个模块编写完毕,就可以被其他地方引用。
3、 避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中。

一个js文件就是一个模块,那么我们先简单创建一个学生模块

let name = '张三';
function studen1(){
    console.log('这是我的一个学生:',name)
}
function studen2(){
    let age = 14;
    console.log('这是我的一个学生:',name,'今年',age,'岁了')
}
exports.studen1 = studen1;
exports.studen2 = studen2;

然后我们在别的模块对其进行调用:

let mode = require('./student');
mode.studen1();
mode.studen2();
调用结果

1、 首先我们创建一个student.js的文件,他就是我们的student模块啦,在这个模块我们虚拟了一个学生-张三,里面提供了两个方法,用来介绍姓名,和姓名年龄。并且使用exports关键字将方法暴露出去。
2、 我们创建一个测试文件module_test.js,在里面使用require()引入student模块
3、 执行student模块暴露出来的api方法。得到输出结果
前面提到exports是负责将模块的api暴露出去的,通过在特殊的 exports 对象上指定额外的属性,函数和对象可以被添加到模块的根部。
我们查看node-module模块的api发现其实暴露api的方式有两种,分别是:


上面我们已经证实可以使用exports.xxx = ${ functionName };的方式将属性或函数暴露出去,通过写法我们可以判断其实node.js提供了一个空的对象变量exports,因为JavaScript是弱编码语言,所以我们可以将需要暴露的api或属性通过点的方式绑定到exports对象上,经由exports对象传递出去。
那么module.exportsexports有什么不同呢?
官方给出的介绍是:

在每个模块中,module 的自由变量是一个指向表示当前模块的对象的引用。 为了方便,module.exports 也可以通过全局模块的 exports 对象访问。 module 实际上不是全局的,而是每个模块本地的。

我们用一个例子测试一下,

let name = '张三';
function studen1(){
    console.log('这是我的一个学生:',name)
}
function studen2(){
    let age = 14;
    console.log('这是我的一个学生:',name,'今年',age,'岁了')
}
exports.s1 = studen1;
exports.s2 = studen2;
exports.name = name;

console.log('exports--->',exports);
console.log('module.exports--->',module.exports);
console.log(exports===module.exports)

我们用exports暴露api 同时比对原对象的module.exports,结果如下:



发现他们其实是一回事,我们将module打印出来



Module对象的exports就是我们暴露的exports
那么我们用module.exports暴露呢?
module.exports = {s1:  studen1, s2:studen2, name: '张三'}

输出的结果exports变为了空对象,自然两者对比为false
至此我们得出结论

上一篇下一篇

猜你喜欢

热点阅读