我怎样才能克隆一个窗口服务器端使用jQuery?

我目前使用Node.js和jsdom运行AngularJS服务器端。 它工作得很好,但我试图通过在AngularJS作用域应用到页面之前caching由jsdom生成的DOM来优化性能。 在应用给定请求的AngularJS范围之前,我试图克隆我的cachingDOM。 目前,我通过使用jQuery(服务器端)克隆caching的DOM:

var clone = cachedWindow.$("html").clone(); // This part works fine 

然后,我使用jsdom创build了一个新的窗口,其中没有html标签内容(快速):

 jsdom.env( '<!doctype html><html></html>', injectedScripts, // This is where I inject AngularJS, which works fine function(errors, newWindow) { newWindow.angular.bootstrap(newWindow.document, ['ngView']); newWindow.$("html").replaceWith(clone); // This part does not work } ); 

问题来自newWindow.$("html").replaceWith(clone); 这会产生这个错误:

 { code: 4, message: 'Wrong document' } 

我理解这个问题是因为我试图用一个来自另一个文档( cachedWindow )的DOM元素replace一个文档( newWindow )中的DOM元素,但我想不出有什么办法。 这很重要,因为克隆html元素的速度比用jsdom从头开始重buildDOM要快十倍左右。

有什么build议么?

笔记:

  • 一方面,我正在寻找的解决scheme需要使用jsdom。
  • 另一方面,我没有嫁给jQuery。 任何替代将工作得很好。
  • 需要进行窗口克隆来防止并发请求和支持会话的问题。
  • 欲了解更多背景,请查看Sutoiku上的CircularJS

解:

由Jason Livesay提供,使用document.importNode

 var original = cachedWindow.document.getElementById("app"); ... var clone = newWindow.document.importNode(original, true); newWindow.document.getElementById("app").appendChild(clone); 

当我谷歌“错误的文档”的事情,我看到一堆PHP XML的东西,提到importNode。 所以也许你可以在JavaScript中使用它: https : //developer.mozilla.org/en-US/docs/Web/API/document.importNode

或者可能是这样的: http : //jsdom.wordpress.com/2011/03/14/appendchild-problem-in-google-chrome-and-safari/

此外,如果您正在寻找优化该部分,只是为了仔细检查,你最后的HTML保存到磁盘的权利? 我的意思是你不是每个请求都呈现静态页面吗?