Nodejs前辈好,我想用require来引入自定义的模块,请进来看一下感谢。

Nodejs前辈好,我想用require来引入自定义的模块,请进来看一下感谢。

我想请教如下问题

var _db={}

module.exports=_db;

exports = module.exports =_db;


请问上面两种写法有什么不一样,请大师请解答一下感谢。

8 回复

当然可以。让我们详细分析一下这两种写法,并提供一些示例代码来帮助你理解。

示例代码

假设我们有一个文件结构如下:

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); // 输出 {}

解析

  1. 第一种写法:

    var _db = {};
    
    module.exports = _db;
    
    • 在这种写法中,module.exports 被直接赋值为 _db 对象。
    • 当你在 app.js 中使用 require('./db') 时,会得到 _db 对象的一个引用。
    • 这种方式是标准的模块导出方式,推荐使用。
  2. 第二种写法:

    exports = module.exports = _db;
    
    • 在这种写法中,exportsmodule.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.exportsexports 都可以用来导出模块中的内容。你提供的代码片段展示了两种不同的方式来导出一个对象 _db。下面是这两种写法的区别:

  1. 第一种写法:

    var _db = {};
    
    module.exports = _db;
    

    在这种写法中,直接将 _db 对象赋值给 module.exports。这样做的好处是明确且直接,避免了使用 exports 可能带来的混淆。

  2. 第二种写法:

    var _db = {};
    
    exports = module.exports = _db;
    

    这种写法尝试同时将 _db 赋值给 exportsmodule.exports。然而,这种方法有一个潜在的问题,就是它不会改变 exports 的引用。具体来说,exportsmodule.exports 的一个引用,而当你在这一行中执行 exports = module.exports = _db; 时,你只是改变了 exports 的引用指向新的 _db 对象,而不是修改原来 module.exports 中的内容。

    因此,第二种写法实际上等同于第一种写法,因为它最终的结果都是 module.exports 指向了 _db。但是,如果在这之后你再对 exports 进行任何操作(比如添加方法或属性),这些变化将不会反映到 module.exports 上。

总结:

  • 使用 module.exports 是最安全和推荐的做法,因为它明确指出了你希望导出的内容。
  • 直接使用 exports 可以简化代码,但需要小心不要改变其引用。

如果你希望确保所有导出都能正确地被加载,建议始终使用 module.exports

回到顶部