node.js-将节点配置为将函数加载到全局范围?

node.js-将节点配置为将函数加载到全局范围?,node.js,scope,global,configure,global-scope,Node.js,Scope,Global,Configure,Global Scope,在现实生活中,我看到我们可以在全局范围内配置node js来执行加载的模块,但现在我找不到该怎么做 我为什么这么问 我有一些遗留文件,它们定义了我想在服务器和客户机上使用的语言实用程序,但是这些实用程序中有许多被定义为全局作用域函数。 例如,我有像closure(fClosure)、module(fModule)这样的函数,以及更多的函数,它们只是以可读的明确方式组织代码,还有像$sb(arg,arg,arg)这样的实用程序,它是一个字符串生成器,等等 现在,这些实用程序被定义在一个类似于cor

在现实生活中,我看到我们可以在全局范围内配置node js来执行加载的模块,但现在我找不到该怎么做

我为什么这么问

我有一些遗留文件,它们定义了我想在服务器和客户机上使用的语言实用程序,但是这些实用程序中有许多被定义为全局作用域函数。 例如,我有像
closure(fClosure)
module(fModule)
这样的函数,以及更多的函数,它们只是以可读的明确方式组织代码,还有像
$sb(arg,arg,arg)
这样的实用程序,它是一个字符串生成器,等等

现在,这些实用程序被定义在一个类似于
core.js
的文件中,该文件作为第一个依赖项加载到浏览器中,并且生活很好

但是,在根目录中要求该文件有助于扩展
Array.prototype
,但在其他模块中无法看到其中定义的函数。 (请避免讨论污染或与其他LIB冲突)

我知道这不符合通用JS规范。。。但是现在我只是尝试利用这些遗留代码,而不是以一种通用的方式重新组织所有代码

我还发现了RequireJS和它提出的漂亮AMD模型,但它只回答了如何在为node.js编写的浏览器代码上运行,而不是副版本


分配给全局变量将不起作用,因为这意味着我必须重写所有遗留库。 我正在寻找一种方法,使它们在全局范围内运行,并保留它们在那里声明的所有内容,而不重写它们


那么,有没有一种方法可以要求node需要一个文件并在全局作用域上运行它?

您可以为
全局
对象分配一些内容,对于node,该对象类似于
窗口
用于浏览器,例如:

test.js

global.my_var = require('./my_module');

require('./display_my_var');
console.log(my_var); // this will work, as my_var is now global
my_模块

module.exports = "this is a string";
显示我的变量js

global.my_var = require('./my_module');

require('./display_my_var');
console.log(my_var); // this will work, as my_var is now global
我们所做的 这个答案决不是一个好例子——如上所述——这个案例从一开始就不健康

下面列出了我们应用于代码的最小更改。从中你可以学到什么

1-重构所有遗留web代码,以声明不带变量的全局变量。

之前:

var MyUtils = { ... };

window.some = value;
function foo() { ... }
之后:

MyUtils = { ... };

some = "value";
foo = function() { ... }
2-将所有全局函数声明为分配的全局变量

之前:

var MyUtils = { ... };

window.some = value;
function foo() { ... }
之后:

MyUtils = { ... };

some = "value";
foo = function() { ... }
3-解决旧代码和新节点代码之间的冲突

global.my_var = require('./my_module');

require('./display_my_var');
console.log(my_var); // this will work, as my_var is now global
嗯,这是私人的,所以没有关于这个的片段。但这里有一些关于其他东西的片段: 你应该考虑的事情:

  • 扩展到全局类原型的属性。如果你在任何一方这样做,那么现在两者都应该共存。愚蠢的示例-
    add()
    -类似于push,但返回数组

    Array.prorotype.add=函数{this.push.apply(this,arguments);返回this}

  • 小型化——我们必须解决一个小型化不好的地方——只需要找到一种不同的方式将其放入代码中,然后就可以了

  • 单元测试-每个这样的全局测试都应该存在,并且被排除在全局范围的污染检查之外。一旦有了这个完整的列表,我们就又开始了(现在更好地记录它:)
也值得一谈 在搜索过程中,我们遇到了一些很酷的沙箱工具。 沙箱意味着在沙箱上下文中运行代码。这将阻止它进入其他作用域。 这个变量的实现。 我最欣赏的是:

它通过在子进程中运行“脏”代码来工作,并帮助您连接“纯”代码和“脏遗留”代码之间的任何通信

结果是完全分离。e、 g-
Array。子进程的prototype
不是父进程的
Array。prototype
可以根据自己的“犯罪”操作需要对其进行扩充

正如我所说的——我们从未如此迫切地需要它,因为节点代码是纯的,并且没有对内置类型使用任何“扩展”——他们并不介意来自旧客户端代码的扩展。
但老实说,一旦代码混合在一起,团队中的每个人都开始使用来自客户端代码的扩展,这就变得很混乱。

分配给全局变量将不起作用,因为这意味着我必须重写所有遗留库。我正在寻找一种方法,使它们在全球范围内运行,并将它们声明的内容保留在那里,而不重写它们。我认为这是不可能的。此外,还应避免分配全局变量。最好的方法是在函数的参数中包含所需的内容。嗨!我也面临同样的问题。我真的不想重写遗留代码。你找到溶液了吗?没有干净的溶液。我们所做的是:1。声明所有不带var的全局变量,2。所有函数均为v=function(){},并以老式方式解决web代码和节点代码之间的冲突…:我为未来的观众添加了一个你可以看的。如果我正确理解它,并且它是
require
的正确源代码,那么这个问题肯定没有明确的解决方案。我担心这是故意的,通过设计。。。