3

在现实的日子里,我在某处看到我们可以配置 node-js 以在全局范围内执行加载的模块,但我现在找不到如何做到这一点。

我为什么要问?

我有一些旧文件定义了我想在服务器和客户端上使用的语言实用程序,但是其中许多实用程序被定义为全局范围函数。例如,我有像closure(fClosure)module(fModule)和更多的函数,它们可以简单地以可读的明确方式组织你的代码,以及像$sb(arg,arg,arg),它是一个字符串构建器等实用程序。

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

但是,在根目录中要求这个文件有助于它扩展的地方Array.prototype,但它在其中定义的功能在其他模块中不可见。(请避免讨论污染或与其他库冲突)

我知道这不符合 CommonJS 规范……但现在我只是想利用这些遗留代码,而不以 CommonJS 方式重新组织所有代码。

我还发现了 RequireJS 和它提出的漂亮的 AMD 模型,但它只回答了如何在为 node.js 编写的浏览器代码上运行,反之亦然。

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

那么,有没有办法让节点要求一个文件并在全局范围内运行它?

4

2 回答 2

10

您可以为global对象分配一些东西,这对于 Node 就像window是对于浏览器一样,例如:

测试.js

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

require('./display_my_var');

我的模块

module.exports = "this is a string";

display_my_var.js

console.log(my_var); // this will work, as my_var is now global
于 2011-12-14T11:23:43.003 回答
2

我们做了什么

这个答案绝不是一个很好的例子——如上所述——这个案例首先是不健康的。

下面列出了我们对代码应用的最小更改。从中吸取教训。

1 - 重构所有遗留 Web 代码以声明没有 var 的全局变量。

前:

var MyUtils = { ... };

window.some = value;

后:

MyUtils = { ... };

some = "value";

2 - 将所有全局函数声明为分配的全局变量

前:

function foo() { ... }

后:

foo = function() { ... }

3 - 解决遗留代码和新节点代码之间的冲突

好吧,这个是私人的,所以没有关于那个的片段。但这里有一些关于其他东西的片段: 你应该考虑的事情:

  • 属性增强到全局类的原型。如果你在任何一方这样做 - 现在两者都应该与之共存。愚蠢的例子——add()类似push,但返回数组

    Array.prorotype.add = function(s){ this.push.apply(this, arguments); return this }

  • 缩小 - 我们必须解决一个没有很好缩小的地方 - 只需要找到一种方法以不同的方式将其放入代码中,然后就可以了。

  • 单元测试——每个这样的全局都应该存在并且被排除在全局范围的污染检查之外。一旦有了这个完整的列表——我们又开始了(现在它也有更好的记录了:))

也值得一提

在搜索过程中,我们遇到了一些很酷的沙盒工具。沙盒意味着在沙盒上下文中运行代码。这应该可以防止它进入其他范围。这个变化的实现。最让我赞赏的是这个:https ://github.com/hflw/node-sandbox

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

结果是完全分离。例如 -Array.prototype子进程不Array.prototype属于父进程 - 他们每个人都可以根据自己的“犯罪”行动的需要来增加它......

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

于 2014-02-23T11:46:46.630 回答