2

我已经为此苦苦挣扎了一段时间,但我没有取得任何进展。我总是遇到一些意想不到的事情。

我想支持 node.js (express) 中的浏览器代码,它使用 require.js、jquery 和 d3.js 根据 http 请求输入参数构建图形 (svg)

我遇到的问题是,一旦 requirejs 被初始化,它总是会返回相同的 jquery 和 d3.v2 模块,并且这些模块(对于每个客户端 http 请求)都将开始在同一个 DOM(jsdom)实例上做他们的事情。最终结果是图表混合在一起。

一旦 require.js 不在图片中就很容易了,但这会让我更新所有大量使用 require.js 模块和依赖项 mgmt 的现有浏览器代码

所有有关如何处理此问题的提示或指向演示此设置的代码的指针将不胜感激!

谢谢

彼得

4

1 回答 1

0

最终对我有用的技巧是明确区分设置“浏览器”环境的 node.js 代码和也在浏览器中运行的实际模块。

因此,当一个 http 请求进来时,流程现在是

  • 加载 jsdom node.js 模块并创建一个 html 文档和窗口

  • 在该文档中确保添加一个加载 require.js 的脚本元素(浏览器版本,而不是 node.js r.js 脚本)

  • 在窗口“加载”事件侦听器中拾取通过 jsdom 加载的 requirejs 模块。这我可以用 var requirejs = window.require

  • 配置 requirejs 模块(requirejs.config 调用)

  • 使用 node.js require 方法显式加载所有本机节点模块(不是 requirejs 之一)

  • 最终调用“浏览器”代码

我认为有更好的方法(这肯定有点绕道),但至少现在可行。

也许其他人来到这里,发现这很有用

彼得

于 2012-12-13T21:37:00.987 回答