Nodejs前辈好,我想用require来引入自定义的模块,请进来看一下感谢。
Nodejs前辈好,我想用require来引入自定义的模块,请进来看一下感谢。
我想请教如下问题
var _db={}
module.exports=_db;
exports = module.exports =_db;
请问上面两种写法有什么不一样,请大师请解答一下感谢。
当然可以。让我们详细分析一下这两种写法,并提供一些示例代码来帮助你理解。
示例代码
假设我们有一个文件结构如下:
project/
├── db.js
└── app.js
db.js
// 第一种写法
var _db = {};
module.exports = _db;
// 第二种写法
// exports = module.exports = _db;
app.js
const db = require('./db');
console.log(db); // 输出 {}
解析
-
第一种写法:
var _db = {}; module.exports = _db;
- 在这种写法中,
module.exports
被直接赋值为_db
对象。 - 当你在
app.js
中使用require('./db')
时,会得到_db
对象的一个引用。 - 这种方式是标准的模块导出方式,推荐使用。
- 在这种写法中,
-
第二种写法:
exports = module.exports = _db;
- 在这种写法中,
exports
和module.exports
都被赋值为_db
对象。 - 然而,
exports
实际上是一个指向module.exports
的引用。如果你直接将exports
赋值为一个新的对象或值(例如exports = {}
),它将不再指向module.exports
。 - 因此,这种写法可能会导致意外的行为,尤其是在你尝试重新赋值
exports
时。 - 推荐避免这种写法,除非你明确知道你在做什么。
- 在这种写法中,
总结
- 推荐使用第一种写法 (
module.exports = _db;
),因为它更清晰且不易出错。 - 避免使用第二种写法 (
exports = module.exports = _db;
),因为这可能导致意外行为,尤其是当你试图重新赋值exports
时。
希望这些解释对你有所帮助!
简单的说exports 是module.exports 的别名。分别定义的话.module.exports会覆盖exports
module.exports 是根。可以不用 exports
感谢,明白了一点,想成根,命名空间一样对吗?
如module.exports =_db;写法是不是,在module.exports增加了一个_db方法
如下写法
exports = module.exports =_db;//是不是把原有的_db覆盖了保证是最新的,exports中只有一个新的_db呢?
第一你要记住一定要让他们保持一致。也就是不要同时分别定义他们两个。 第二,假如要选择的话。输出一个对象的话首选module。exports 。输出许多函数或是变量的话首选exports。 很抽象。其实除了你的程序有BUG否则这种特性一般没人在意。
理论上来说, “module”变量对应与模块的全局变量的根作用域, 所以 module.exports = _db; exports = _db; exports = module.exports =_db; 这三种写法的效果是一样的
在Node.js中,module.exports
和 exports
都可以用来导出模块中的内容。你提供的代码片段展示了两种不同的方式来导出一个对象 _db
。下面是这两种写法的区别:
-
第一种写法:
var _db = {}; module.exports = _db;
在这种写法中,直接将
_db
对象赋值给module.exports
。这样做的好处是明确且直接,避免了使用exports
可能带来的混淆。 -
第二种写法:
var _db = {}; exports = module.exports = _db;
这种写法尝试同时将
_db
赋值给exports
和module.exports
。然而,这种方法有一个潜在的问题,就是它不会改变exports
的引用。具体来说,exports
是module.exports
的一个引用,而当你在这一行中执行exports = module.exports = _db;
时,你只是改变了exports
的引用指向新的_db
对象,而不是修改原来module.exports
中的内容。因此,第二种写法实际上等同于第一种写法,因为它最终的结果都是
module.exports
指向了_db
。但是,如果在这之后你再对exports
进行任何操作(比如添加方法或属性),这些变化将不会反映到module.exports
上。
总结:
- 使用
module.exports
是最安全和推荐的做法,因为它明确指出了你希望导出的内容。 - 直接使用
exports
可以简化代码,但需要小心不要改变其引用。
如果你希望确保所有导出都能正确地被加载,建议始终使用 module.exports
。