使用require('some_module.js')时运行脚本 - 良好的做​​法?

时间:2012-01-25 17:44:35

标签: javascript node.js requirejs

我说的是服务器端js(带有node.js和require.js) 我有三个文件

//1) app.js - main entry point:
//=======================================================
var myservice = require('./myservice');

rt.register('someKey', require('./XYZhandler').handler);

//2) myservice.js:
//=======================================================
var handlers = {};

exports.register = function(key, handler) {
    handlers[key] = handler;
};

//3) and finally XYZhandler.js:
//=======================================================
exports.handler = function() {
    //...do something
};

因此,在上面的设置中,我有所有在app.js中实际执行的脚本

我的替代方案是:

//1) app.js - main entry point:
//=======================================================
var myservice = require('./myservice'),
    rt = require('./XYZhandler');

//2) myservice.js: unchanged from above

//3)and finally XYZhandler.js:
//=======================================================
require('./myservice').register(function() {
    //...do that same thing
};

在后一种设置中,我在XYZhandler.js中有脚本,它实际上是在requirejs第一次遇到它时执行的(注意XYZhandler.js不会导出任何东西)。我(作为Java开发人员)将其比作静态初始化程序。但上述哪一项被认为是更好的做法?感谢。

1 个答案:

答案 0 :(得分:1)

第一种方法更好,因为它被正确解耦。

在第二种方法XYZhandler.js取决于myservice.js。如果yourhandler.jshishandler.js想要register XYZhandler.js,那么它们也必须进行硬编码。很快,您的所有模块都将依赖于彼此而您赢了没有能力单独重复使用它们,这是将这些功能首先抽象到模块的全部要点。

这是一个美容上的差异,但我可能会用这种方式写下你的第一个例子:

//1) app.js - main entry point:
//=======================================================
var myservice = require('./myservice');
var myhandler = require('./XYZhandler').handler;

rt.register('someKey', myhandler);

一步加载模块,然后初始化它们有助于我澄清他们之间的关系。

希望有所帮助!