博客
关于我
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 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>
Multiple websites on single instance of IIS
查看>>
mysql CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>