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

时间:2011-12-14 11:17:48

标签: node.js scope global configure global-scope

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

我为什么要问?

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

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

但是,在根目录中要求此文件有助于扩展Array.prototype的位置,但在其中定义的函数在其他模块中不可见。 (请避免讨论污染或与其他图书馆发生冲突)

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

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

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

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

2 个答案:

答案 0 :(得分:10)

您可以为global对象分配一些内容,对于Node来说,window用于浏览器,例如:

<强> test.js

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

require('./display_my_var');

<强> my_module

module.exports = "this is a string";

<强> display_my_var.js

console.log(my_var); // this will work, as my_var is now global

答案 1 :(得分:1)

我们做了什么

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

下面列出了我们应用于代码的最小变化。从中学习你可以做什么。

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 }

  • 缩小 - 我们必须解决一个没有缩小的地方 - 只需找到一种方法将其放入代码中,然后用它来解决。

  • 单元测试 - 预计每一个这样的全球都应该存在并被排除在全球范围的污染检查之外。有了这个完整的清单 - 我们再次关闭它(现在它也更好地记录了:))

也值得光顾

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

它的工作原理是在子进程中运行'脏'代码,并帮助您连接'纯'代码和'dirty-legacy'之间的任何通信。

结果是 完整 分离。例如 - 儿童过程的Array.prototype不是父母的Array.prototype - 他们每个人都可以根据自己的'犯罪'行动来增加它......

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