Я пытаюсь расширить среду выполнения моей библиотеки на стороне 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 в браузере, проверяя, что такое текущая среда выполнения, но для меня это большое изменение.