前言: Node.js是成为一名优秀的前端开发工程师的必修课。Node.js中的模块是其应用程序的基本组成部分, 所以我们需要对Node中的模块系统有着清晰的认知与使用。
Node为JS提供了很多的服务器级别的API,这些API被封装到了一个个具名的核心模块中去了。我们可以很方便的使用这些模块,来完成我们想要完成的需求以及功能。
我们在使用node进行开发时,经常会引用第三方的模块,常见的第三方模块有:
时间格式化模块dateformat路由模块 router模板插件模块art-template等等等。。。同样,我们可以在开发时,为特定的功能定制化开发具有特定功能的模块。
特点:
所有的代码都运行在模块作用域中,不会对全局作用域造成污染。模块不限制加载的次数,可以多次加载。模块加载的顺序,就是按照其在代码中出现的次序。语法:
var 自定义导入模块变量名称 = require('模块') var fs = require('fs') //导入核心模块中的文件模块 var http = require('http') //导入核心模块中的http模块执行: 1. 执行被加载模块中的代码 2. 得到被加载模块中的 exports 导出对象, 3. 只有加载了模块,才能使用到处对象中的方法。
了解:
Node是模块作用域,所有文件中的成员都只在它所处的模块中有效。如果想成员被其他模块使用,就必须把这些成员挂载到exports 接口对象中,进行导出操作。模块的导出实际上是把想与其它模块共享的成员变量进行导出操作。语法: 导出多个成员
exports.a = 123; exports.b = 'hello'; exports.c = function () { console.log('ccc') } exports.d = { foo : 'bar' }此时,导出了一个对象。对象中有4个成员变量,分别是a、b、c、d。我们可以把数字、字符串、数组、函数、对象等导出。
导出单个成员:
module.exports = '你好'此时我们导出的只是一个字符串“你好”,而不是导出一个对象。
以下情况会出现导出的覆盖操作:
module.exports = 'hello' // 后者覆盖前者 module.exports = function (x, y) { return x + y; }此时导出的只是一个function 也可以通过module.exports设置为一个对象,然后把要导出的全放入这个对象中,达到导出多个变量的操作。
module.exports = { add: function (x, y) { return x + y; }, str: 'hello' }提问1:为什么有时候使用 exports 进行导出操作,而有些时候使用 module.exports 来进行导出操作呢?
事实上:Node.js中,每个模块内部都有一个module对象,而module对象中有一个成员叫做exports。所以,你会使用module.exports来进行导出操作。而Node.js为了简化操作,不用每次导出时都加一个module,所以专门提供了一个变量exports,而exports指向的就是module.exports指向的对象。所以我们会有这两种方法来进行操作导出。
**提问2:**什么时候使用exports,什么时候使用module.exports呢?
当我们要导出模块中的多个成员时,建议使用exports。 当我们要导出模块中的一个成员时,建议使用module.exports。
当一个模块需要导出单个成员的时候,直接给exports 赋值是不管用的
exports = 'hello' //不管用因为exports只是指向module.exports,而模块最后真正导出的实际上是module.exports。所以直接给exports赋值,导出后在另一个模块中是看不到’hello’的。
下面看一个示例:
//此时exports和module.exports 还是指向同一个引用,所以会把a加入到moule.exports中 exports.a = 123 //把exports重新赋值给一个新对象,此时不指向module.exports exports = {} //由于上一步的操作,此时赋值已经不能放入到module.exports中了。 exports.foo = 'bar' //在module.exports中加入b module.exports.b = 456此时模块导出的内容应该是:
{ a: 123, b: 456 }解释看上面的代码注释。主要理解了对象是一个引用这个概念就可以理解上面的原因了。
Node.js具有强大的功能,如果你觉得此篇文章对你有帮助,记得一键三连哦! 学无止境!冲!
