module.exports 是否必须在 require()-ing 文件时定义?

Does module.exports have to be defined when require()-ing a file?

我正在使用 Babel 在 Express 服务器上即时转换我的 ES6 文件。在我的 server.js 文件(vanilla JS)中,我输入了 require('babel-core/register')require('./app').

app.js (ES6) 中,我做所有正常的 Express 事情:

import express from 'express';

let app = express();
app.listen(3000, () => {
  console.log('Server listening on port 3000');
});
... etc

即使我没有在我的 app.js 文件中正式定义 module.exports,当我 运行 node serverapp.js 得到正确的 required 和 运行s。为什么这样做有效?

当你需要一个模块时,该模块内的代码将被执行,但它只执行一次。随后对同一模块的 require 调用将没有任何效果,除了 return 模块导出的任何内容。 That's the nature of node modules(查找 'caching' 上的注释)。通过使用 module.exports,您基本上是在为其指定一个 return 值。

您不需要导出任何内容,app.listen 行会在您需要 app.js 时立即调用。尽管您可以导出 API 或类似的内容,但如果您愿意:

/*app.js*/

import express from 'express';

let app = express();

module.exports = {
    start:function(){
        app.listen(3000, () => {
        console.log('Server listening on port 3000');
    })
}

/*server.js*/
require('babel-core/register');

var app = require('./app');

app.start();

我可能误解了这个问题,但我不认为 babel 和 express 真的相关。