什么需要 return 以及为什么我们需要将变量作为函数访问以获取其值 - 在 Nodejs 中?

What does require return and why do we need to access the variable as a function to get its value - in Nodejs?

https://nodejs.org/api/modules.html#requireid

require(id)# Added in: v0.1.13 id module name or path
Returns: exported module content

“模块内容”是什么意思?

const x = require('express');
const y = x();

x() 中存储了什么?
为什么我们需要将 x 作为函数访问并将其存储在 y 中?

一个module是一堆相关代码。

Express 是一个模块。

模块可以导出值(很像对象属性有值)。

导出的值可以是任何类型的值。

函数是一种值。

Express导出的值是一个函数。

你能看出来是因为 the documentation tells you to call it as a function and also by looking at the source code.

Express 导出一个函数,为了使用它,你应该调用那个函数。为了更好地了解正在发生的事情,假设您有这些文件:

function.js:

const foo = () => console.log("Hello Word");
module.exports = foo;

index.js:

const x = require('./function');
// x == foo
x(); // will log Hello Word

如果您在 function.js 中没有 module.exports = foox 将等于 {}

require(id) 是用于导入模块的 CommonJS 语法,无论是通过它们的 npm 包名称还是 js/json 文件的路径。当使用 "express" 等包名调用该函数时。该包在 node_modules 目录中查找,如果 main 文件不存在,它会尝试在 node_modules/express/package.json 文件 中找到入口点specified (as the case of express) node_modules/express/index.js 可以使用。

跟随 index.js 的导入,带你 lib/express.js 可以找到主要导出函数的地方:

/**
 * Expose `createApplication()`.
 */

exports = module.exports = createApplication;

/**
 * Create an express application.
 *
 * @return {Function}
 * @api public
 */

function createApplication() {
  var app = function(req, res, next) {
    app.handle(req, res, next);
  };

  mixin(app, EventEmitter.prototype, false);
  mixin(app, proto, false);

  // expose the prototype that will get set on requests
  app.request = Object.create(req, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  // expose the prototype that will get set on responses
  app.response = Object.create(res, {
    app: { configurable: true, enumerable: true, writable: true, value: app }
  })

  app.init();
  return app;
}

如您在上面的代码片段中所见,x 是 express 的 createApplication 函数,因为它已分配给 export 变量。至于为什么需要调用 x 函数,这只是表达选择的实例化应用程序的方式,其他包的做法不同。