博客
关于我
node的module.exports和exports
阅读量:754 次
发布时间:2019-03-23

本文共 2147 字,大约阅读时间需要 7 分钟。

一、module.exports与exports

Node.js中的模块系统遵循CommonJS规范,这一规范为JavaScript模块化开发提供了统一的标准。CommonJS规范通过定义模块的标识、导出方式以及模块的导入方式,帮助开发者更好地组织和管理代码。

在Node.js中,所有的.js文件都遵循模块化的规范,而其中的核心概念是module.exports和exports。这些概念帮助文件之间相互透明地分割功能模块,形成可维护的代码体系。

需要注意的是,module.exports和exports看似有些相似,但它们的目标和使用场景有所不同。module.exports是模块外公开的出口点,而exports通常用于在内部函数或者模块之间共享变量和函数。

简单来说,Node.js会为每个.js文件创建一个module变量,该变量包含两个属性:id和exports。id是唯一的标识符,而exports对象则存储了该模块中被导出的内容。这些内容可以是函数、变量,或者其他任意类型的数据。

在编写模块代码时,module.exports和exports的关系需要特别注意。module.exports是模块自身的出口对象,而exports则是该对象的一个引用。两者在内存中指向同一个对象,因此在大多数情况下不需要显式地管理它们的关系。

比如,以下代码中,exports和module.exports其实是同一个对象:

const exports = module.exports = {}

这种设计使得在模块之间共享数据更加便捷,同时避免了命名冲突。建议在实际开发中,使用module.exports来 Explicitly导出模块的公开接口,而内部函数可以使用exports来进行交流。

二、基本使用案例

下面将通过几个实例说明如何在Node.js中使用exports和module.exports来实现模块间的通信。

1. exports与require的使用

如果你的模块只在内部使用某些函数或变量,可以选择使用exports来分享它们,而不是直接将它们挂载到module.exports中。

const myFunc1 = () => {  // 某些逻辑};const myFunc2 = () => {  // 某些逻辑};exports.myFunc1 = myFunc1;exports.myFunc2 = myFunc2;

然后,在其他模块中可以通过require来导入这些函数:

const m = require('./mymodule');m.myFunc1();m.myFunc2();

这样,导入的m对象中会包含该模块中所有通过exports方式分享的内容。

2. module.exports与require的结合使用

在生产环境中,我们经常需要使用第三方库或者模块。例如,使用Koa来创建HTTP路由。

const a = () => {  ctx.body = {    message: 'Hello from a'  };};module.exports = a;

或者,使用Koa Router创建路由:

const Router = require('koa-router');const a = require('../api/ayewu');const router = new Router();router.get('/a', a);module.exports = router;

在这里,a是被导出的函数,module.exports将它挂载到当前模块的出口对象中,从而让其他模块可以通过require导入使用。

三、再次理解

通过以上实例可以看出,module.exports和exports在Node.js中起着至关重要的作用。它们不仅简单地提供了模块之间的通信方式,同时也为代码的组织和分割提供了清晰的标准。Under the hood,Node.js会自动为每个.js文件创建一个module对象,其中包含一个exports属性。

在实际应用中,我们可以直接在module.exports中挂载需要公开的接口,而内部共享的数据则可以通过exports来实现。这种做法不仅简化了模块间的通信,同时也为代码的维护和扩展提供了更高的可读性。

此外,一个常见的做法是将module.exports中的内容以键值对的形式挂载,这样可以支持不同的模块之间的灵活扩展。例如:

function hello() {  console.log('Hello, world!');}function greet(name) {  console.log('Hello, ' + name + '!');}module.exports = {  hello: hello,  greet: greet,  someVariable: '这是一个变量'};

通过以上方式,在其他模块中只需要通过require导入该模块,并通过键名访问需要使用的内容,就可以轻松地实现模块间的通信和数据共享。这是Node.js模块系统设计后的一个非常有优势的地方。

转载地址:http://yfczk.baihongyu.com/

你可能感兴趣的文章
mysql Timestamp时间隔了8小时
查看>>
Mysql tinyint(1)与tinyint(4)的区别
查看>>
MySQL Troubleshoting:Waiting on query cache mutex
查看>>
mysql union orderby 无效
查看>>
mysql v$session_Oracle 进程查看v$session
查看>>
mysql where中如何判断不为空
查看>>
MySQL Workbench 使用手册:从入门到精通
查看>>
MySQL Workbench 数据库建模详解:从设计到实践
查看>>
MySQL Workbench 数据建模全解析:从基础到实践
查看>>
mysql workbench6.3.5_MySQL Workbench
查看>>
MySQL Workbench安装教程以及菜单汉化
查看>>
MySQL Xtrabackup 安装、备份、恢复
查看>>
mysql [Err] 1436 - Thread stack overrun: 129464 bytes used of a 286720 byte stack, and 160000 bytes
查看>>
MySQL _ MySQL常用操作
查看>>
MySQL – 导出数据成csv
查看>>
MySQL —— 在CentOS9下安装MySQL
查看>>
MySQL —— 视图
查看>>
mysql 不区分大小写
查看>>
mysql 两列互转
查看>>
MySQL 中开启二进制日志(Binlog)
查看>>