博客
关于我
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中json_extract的使用方法
查看>>
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>