NodeJS – 如何在自执行函数中将构造函数分配给module.exports?

我试图在NodeJS中的一个自我执行的函数中分配一个构造函数。 我很确定它不工作,因为我的参数是一个variables指向module.exports,但我很好奇,如果有办法让它工作,尽可能接近自执行的格式。

这是如何调用代码…

var TemplateEngine = require('./templateEngine'); templateEngine = new TemplateEngine({engine: 'swig'}); // "object is not a function" 

这是一个很好的例子

 var assert = require('assert'); var swig = require('swig'); // Constructor var TemplateEngine = function(args) { assert.ok(args.engine, 'engine is required'); var templateEngine = {}; templateEngine.engine = args.engine; templateEngine.Render = function(templateString, model) { var result = swig.render(templateString, model); return result; }; return templateEngine; }; module.exports = TemplateEngine; 

这里是我想使用的代码样式的一个例子,但是它会产生一个“TypeError:Object不是一个函数”的错误,因为我实际上并没有分配到module.exports,只是一个variables,它复制了它所指向的任何东西至。

 (function(templateEngine) { var assert = require('assert'); var swig = require('swig'); templateEngine = function(args) { assert.ok(args.engine, 'engine is required'); var templateEngine = {}; templateEngine.engine = args.engine; templateEngine.Render = function (templateString, model) { var result = swig.render(templateString, model); return result; }; return templateEngine; }; })(module.exports); 

有没有办法让我使用上面的自执行格式,并有我的模块导出构造函数?

在你的第二个例子中,你只是覆盖templateEngine参数,这不会有任何效果。

要获得与第一个示例相同的结果,只需:

module传递到您的IIFE:

 (function(module) { })(module); 

为此分配一个属性:

 (function(module) { var assert = require('assert'); var swig = require('swig'); module.exports = function (args) { ... }; })(module);