将节点模块variables注入到作用域

是否有可能使用节点模块来实现这种行为?

module.js:

module.exports = function () { var test.fn = function () { console.log("$test.fn()"); } var test.fn2 = function () { console.log("$test.fn2()"); } var variable = "test"; }; 

app.js:

 require("./module.js")(); test.fn(); test.fn2(); otherFunction(variable); 

我不想做这样的事情$ = require("./module.js")(); $.test.fn(); $ = require("./module.js")(); $.test.fn(); 我想注入这个variables到app.js作用域没有包装variables。

编辑:

我已经结束了使用这个:

module.js:

 module.exports = function () { eval(String(inject)); var inject = ( this.$module1 = {}, this.$module1.fn = function () { console.log("$module1.fn()"); } ); }; 

app.js:

 require("./module.js")(); $module1.fn(); 

模块中的顶层作用域实际上是一个函数作用域(node.js加载程序将每个模块包装在一个函数中,然后调用它来执行模块中的代码)。 因此,没有公开的“根”对象,我们可以编程分配属性。

所以,这意味着在一个模块中不可能在模块范围的顶层以编程方式添加新的variables,而不用在相当大的黑客中使用eval() 。 函数作用域在Javascript中不能以这种方式工作。

你也可以让这个模块给global对象分配一些东西,而不需要前缀,但是这不是一个推荐的做法。 node.js模块的重点在于避免使用任何全局variables,使得代码完全自包含,从而避免全局冲突。

或者,你可以让你的模块导出一个巨大的Javascriptstring,然后eval()在app.js中,以便在模块范围中定义新的variables。 再次 – 不推荐。

你最好的做法是做“node.js方法”,把所有东西都放在一个对象上,然后导出这个对象。 这里有一个变化:

app.js

 var test = require("./module.js")(); test.fn(); // "executing fn" test.fn2(); // "executing fn2" console.log(test.myVar); // "test" 

module.js

 module.exports = function () { return { fn: function () { console.log("executing fn"); }, fn2: function() { console.loog("executing fn2"); }, myVar: "test" } }; 

你可以用一个IIFE做这样的事情。 该方法在需要时会自动运行并返回一个对象,然后可以在应用程序中使用该对象。

module.js:

 global.test = (function() { return { fn: function() { console.log("executing fn"); }, fn2: function() { console.log("executing fn2"); }, variable: "test" } })(); 

app.js

 require("./module.js"); //just include, no need for a wrapper variable test.fn(); test.fn2(); console.log(test.variable); 

请注意,如果该技术已经存在,该技术将覆盖全局variablestest

这个答案不应该鼓励你在你的node.js模块中使用global (参见上面的jfriend00的注释),因为这会使你的代码容易受到与其他模块名称冲突的影响,从而导致你的模块移植性降低。

在module.js中,您可以访问node.js运行时环境的global对象。

module.js:

 global.test = { fn: function() { //Do something }, fn2: function() { //Do something different }, variable: "test variable" } 

app.js

 require("./module.js"); //just include, no need for a wrapper variable test.fn(); test.fn2(); console.log(test.variable); 

请注意,如果该技术已经存在,该技术将覆盖全局variablestest