我一直在转换一些旧的javascript用于node.js模块,它让我想到了模块模式选项。
我见过很多使用导出的结构。 module.exports甚至原型,它让我想知道哪种方法被认为是最佳实践以及为什么?
这是我的代码以两种方式编写的减少模块示例。
选项1:
var Helper = function() {};
Helper.latin_map = {"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A"};
Helper.prototype.urlise = function(orgString){
var lower = orgString.toLowerCase();
var latinised = lower.replace(/[^A-Za-z0-9\[\] ]/g, function(a) {
return Helper.latin_map[a] || a;
});
return latinised.replace(/\s+/g, '-')
}
module.exports = new Helper();
选项2:
var latin_map = {"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A"};
module.exports = {
urlise : function(orgString){
var lower = orgString.toLowerCase();
var latinised = lower.replace(/[^A-Za-z0-9\[\] ]/g, function(a) {
return latin_map[a] || a;
});
return latinised.replace(/\s+/g, '-')
}
}
这是一个非常简单的例子,但我将扩展它以在同一模块中提供几个可访问的函数,所以在我允许事情变得太复杂之前。我想我会就哪种方法被认为是最佳实践寻求一些建议。
答案 0 :(得分:3)
我已经看到了许多使用
exports
,module.exports
甚至原型的结构,它让我想知道哪种方法被认为是最佳实践以及为什么?
具有.prototype
的东西是构造函数,并且模块将它们导出为类以进行实例化。
当您要导出"单例"时,将使用导出普通对象(通常为文字)或甚至扩展默认为空的exports
对象。具有静态属性的对象,"命名空间"所以说。
module.exports = new Helper()
This is almost always wrong。 Helper
完全没必要,通常甚至是令人反感的。
您应该使用您的选项2.如果您确实只导出了一个函数,您可能会考虑module.exports = function urlise(orgString){…}
,但要导出模块上可访问的几个函数,您的选项2就是要使用的模式。
答案 1 :(得分:2)
选项2更好。您不需要构造函数和OO实例,除非您计划在创建许多实例的情况下执行真正的OO编程,并且每个实例都有与之关联的不同数据。这段代码作为一个简单的函数更好。