📜  module.exports 等效打字稿 - Javascript (1)

📅  最后修改于: 2023-12-03 15:17:40.493000             🧑  作者: Mango

module.exports 等效打字稿 - Javascript

在 Node.js 中,我们经常使用 module.exports 来将模块中的代码暴露出去,以便在其他模块中使用。但是,还有一种等效的方式可以实现同样的效果,它就是使用 exports 变量。

module.exportsexports 的区别

在 Node.js 中,每个模块都有一个 module 对象,它表示当前模块。module 对象有一个 exports 属性,它是一个对象,我们可以将需要暴露的代码赋值给它,从而让这些代码可以被其他模块调用。例如:

// 模块1
function add(a, b) {
  return a + b;
}

module.exports = { add };
// 模块2
const module1 = require('./module1');

const result = module1.add(1, 2);
console.log(result);  // 3

在上面的代码中,我们将 add 函数赋值给了 module.exports 对象,然后在另一个模块中通过 require 方法加载 module1 模块,并调用 add 函数。

但是,其实在 module 对象中还有一个属性叫做 exports,它是 module.exports 的一个引用。也就是说,下面这两个语句是等效的:

module.exports.add = add;
exports.add = add;

可以简写成:

exports.add = function add(a, b) {
  return a + b;
};

当使用 exports 变量时,它指向的是 module.exports,也就是说,如果你修改了 exports 变量的指向,那么 module.exports 就会失去作用。例如:

// 模块1
exports = { add };

这样写是不起作用的,因为它只是让 exports 指向了一个新的对象,但是由于 module.exports 没有改变,所以 add 函数并没有被暴露出去。

exports 的使用

虽然 exports 只是 module.exports 的一个引用,但是它更加方便我们直接暴露一些对象或函数。例如:

// 模块1
exports.add = function add(a, b) {
  return a + b;
};

exports.sub = function sub(a, b) {
  return a - b;
};

这样写可以直接将 addsub 函数暴露出去,而不需要再写一个对象来包装它们。

总结

虽然 module.exportsexports 都可以用来将模块中的代码暴露出去,但是它们之间还是有一些细微的区别。在大多数情况下,使用哪个都可以,只要我们清楚它们的区别和语法。