使用requirejs创建完全独立的上下文堆栈



我有一个现有的网站,它使用requirejs进行从加载库(如jQuery和Backbone)到定义Backbone视图、模型等的所有操作。我正试图用node.js在服务器端渲染它,因此每个请求都需要一个完全独立的上下文堆栈。

Requirejs的多版本支持几乎满足了我的需求。它允许为将来的加载声明一个特殊的上下文。var context1=require.config({context:"abc123"});这样就允许:context1(['item'],function(item){});其中"item"将单独加载,即使它已经加载。不幸的是,我需要所需的项也能够要求和定义隔离到该上下文堆栈中的项。

Requirejs几乎通过内部takeGlobalQueue函数设置了这一特性。不幸的是,此函数期望获取自最近调用以来定义的所有项,因此可能获取在不同上下文堆栈上定义的项。

我需要的是一种方法,让requirej给我一个真正独立的define/require实例,通过未来的调用来保持这种分离。

我不想重写我的整个网站,不使用requirejs和/或为我所有的requirejs调用需要一些插件。我应该为此攻击r.js源代码吗?这是违反AMD规范的吗?

更新1:比如说,在nodejs上,我使用domino/jsdom创建了一个窗口上下文。然后,我将jQuery/zepto和Backbone的副本附加到该窗口,以便Backbone.View.make在该窗口中创建一个元素。然后我可以加载我的实际应用程序堆栈,然后它继承了backone的副本,这样一切都"正常工作",就像它在浏览器中一样。无需破解jquery/主干网源代码。但我需要一个单独的Backbone副本,指向一个不同的同时请求的单独窗口,这意味着我的视图/模型等的单独上下文堆栈。

我没有足够的上下文来回答这个问题,如何分段加载,但听起来与这个问题相似,所以可能有一些提示:

如何在节点express Web服务器中使用requirejs、jquery和d3

不确定,但在新的vm上下文中运行代码也可能是解决方案的一部分:

http://nodejs.org/api/vm.html#vm_vm_runinnewcontext_code_sandbox_filename

最新更新