在node.js中运行时解决窗口依赖的build议

我试图将我的浏览器库的运行时环境扩展到node.js. 我实现了通用模块定义(UMD)模式来做到这一点。 它与AMD实现和<script>工作,但在node.js中不起作用,因为没有window

有问题的依赖关系是WebSocketEventSourceXMLHttpRequestdocument 。 详细信息在这里描述: https : //github.com/flowersinthesand/portal/issues/115那么解决node.js窗口依赖的最佳方法是什么? 我有以下方式来做到这一点。 由于我刚接触node.js,所以这些都不太熟悉,我不知道哪一种方式是自然的。 虽然我试图支持node.js,但我不想改变太多东西。

以下代码片段来自https://github.com/flowersinthesand/portal/blob/master/portal.js

使用jsdom

 (function(root, factory) { if (typeof define === 'function' && define.amd) { // AMD define(function() { // Passes the window return factory(root); }); } else if (typeof exports === 'object') { // Node module.exports = factory(require('jsdom').something); } else { // Browser globals, Window root.portal = factory(root); } }(this, function(window) { 

如果jsdom支持上面的依赖关系,这看起来最好。 但是,如果它工作,我不知道为什么sockjs,socket.io和engine.io的客户端不使用jsdom。 也许,他们是为了节点而不是浏览器? 性能?

使窗口成为一个普通的依赖对象

 (function(root, factory) { if (typeof define === 'function' && define.amd) { // AMD define(function() { // Passes the window return factory(root); }); } else if (typeof exports === 'object') { // Node module.exports = factory({ WebSocket: require('package name for WebSocket').something, EventSource: require('package name for EventSource').something, document: require('jsdom').hmm, // ... }); } else { // Browser globals, Window root.portal = factory(root); } }(this, function(window) { 

它看起来挑剔,有点不舒服,做一组依赖,窗口,但是,我想保留现有的代码,如果可能的话。 此外,当XMLHttpRequest由于跨域或卸载事件而无法工作时,jsdom也可能需要通过脚本标记来parsing用于执行HTTP请求的文档,并且这种情况包括IE 6.可以使用文档分离逻辑来使用某些东西在浏览器中的节点和脚本标记支持检查当前运行时是什么,但这对我来说是一个巨大的变化。

 (function(root, factory) { if (typeof define === "function" && define.amd) { // AMD define(function() { return factory(root); }); } else if (typeof exports === "object") { // Node module.exports = factory(function() { // Prepare the window powered by jsdom var window = require("jsdom").jsdom().createWindow(); window.WebSocket = require("ws"); window.EventSource = require("eventsource"); return window; }()); // node-XMLHttpRequest 1.x conforms XMLHttpRequest Level 1 but can perform a cross-domain request module.exports.support.corsable = true; } else { // Browser globals, Window root.portal = factory(root); } }(this, function(window) {