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

时间:2015-11-22 02:06:54

标签: javascript node.js express require babeljs

我正在使用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

即使我没有在module.exports文件中正式定义app.js,但当我运行node server时,app.js会正确required并运行。为什么这样做?

1 个答案:

答案 0 :(得分:1)

当您需要一个模块时,该模块中的代码将被执行,但它只执行一次。对同一模块的后续require调用将无效,除非返回模块导出的任何内容。 That's the nature of node modules(查找有关'缓存'的说明)。通过使用module.exports,您基本上可以为其指定返回值。

在您的情况下,您无需导出任何内容,只要您需要app.js就会调用app.listen行。虽然您可以导出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();

我可能会误解这个问题,但我认为巴贝尔和快递并不是真的相关。