2013-11-13 1 views
1

Я пытаюсь расширить среду выполнения моей библиотеки на стороне node.js. Для этого я применил шаблон универсального модуля (UMD). Он работает с реализацией AMD и <script>, но не работает в node.js, так как нет window.Рекомендации по разрешению зависимости окна при работе в node.js

Заинтересованными сторонами являются WebSocket, EventSource, XMLHttpRequest, document. Деталь описана здесь: 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) { 

Это выглядит разборчивы и несколько неудобно, чтобы сделать группу зависимостей, окна, Но я хочу, чтобы сохранить текущий код, если это возможно. Кроме того, может потребоваться jsdom, чтобы разрешить документ, используемый для выполнения запроса HTTP тегом скрипта, когда XMLHttpRequest не может работать из-за междоменного или разгрузочного события, и эта ситуация включает IE 6. Можно использовать логику, используя документ, чтобы использовать что-то поддерживается в теге node и script в браузере, проверяя, что такое текущая среда выполнения, но для меня это большое изменение.

ответ

1
(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) { 
Смежные вопросы