自定义模块
开发者自己写的模块就是自定义模块。在node.js中 ,对代码的封装是以模块(一个一个的文件)为单位进行的。一般的做法是实现好某一个功能之后,封装成一个模块,然后在其它文件中使用这个模块。
使用一个模块,就是在一个js文件中去使用另一个js文件中定义的变量,常量,函数…
基本步骤
-
定义模块
新建一个js文件,用模块名给它命名。例如,模块叫myModule,则这个js文件最好叫myModule.js
-
导出模块
在myModule.js内部,定义一些函数,变量,当然,它们会根据业务要求做一些不同的工作。最后根据情况导出这些函数,变量。
//myModule.js
const myPI = 3;
function add(a, b) {
return a + b;
}
// 通过module.exports来导出
module.exports = {
myPI,
add
};
注意:
- module.exports 是固定写法,一般放在文件的最末尾,也只用一次。
- module.exports表示当前模块要暴露给其它模块的功能。当然不需要把所有在模块中定义的函数都暴露出来。
-
引入模块
在需要使用模块的文件中,使用require语句引入定义好的模块,注意使用相对路径。假设当前的文件是index.js,而希望在index.js文件中使用myModule.js中的add方法。
做法是:
// index.js
const myMath = require('./myMath');
// require()就是用来引入模块的
注意:使用自定义模块时,使用相对路径,而使用核心模块时,不需要写路径。
-
使用模块
当一个模块被成功引入之后,就可以按使用核心模块的过程一样去使用它们了。
// index.js
const myMath = require('./myMath');
// 在使用之前请先打印出来看看。
console.log(myMath);
let rs = myMath.add(23,45);
console.log(rs) // 68
导出模块的两种方式
在自定义模块过程中,有两种导出模块内容的方式:
- exports
- module.exports
参考
它们的关系是: exports是module.exports的别名,即:
exports === module.exports
所以下面两种写法的效果是一样的:
// 1 mymodule.js
exports.f = function(){ }
exports.pi = 3.1415926
// 2 mymodule.js
module.exports.f = function(){ }
module.exports.pi = 3.1415926
区别在于:
- 在引入某模块时,以该模块中module.exports指向的内容为准。
- 在定义模块时:
- 在初始时,exports和module.exports是指向同一块内存区域,其内容都是一个空对象。
- 如果直接给exports对象赋值(例如:exports={a:1,b:2}),此时,exports就不会再指向module.exports,而转而指向这个新对象,此时,exports与module.exports不是同一个对象。而在引入模块时,是以模块的中的module.exports为准,因此,此时写在exports上的对象是无法导出的。
- 在导出模块过程中,建议只用一种方式(建议直接使用module.exports)。