ブラウザ側ライブラリのランタイム環境を node.js に拡張しようとしています。そのために、ユニバーサル モジュール定義 (UMD) パターンを実装しました。これは AMD の実装で動作します<script>
が、node.js では動作しませんwindow
。
問題の依存関係はWebSocket
、、、、EventSource
です。詳細はこちらで説明されています: https://github.com/flowersinthesand/portal/issues/115では、node.js でウィンドウの依存関係を解決するための最良の方法は何ですか? 私はそれを行うために次の方法を持っています。私はnode.jsに慣れていないので、これらはやや慣れておらず、どちらが自然なのかわかりません。私は node.js をサポートしようとしていますが、何かをあまり変更したくありません。XMLHttpRequest
document
次のコード スニペットは、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 が機能せず、この状況には IE 6 が含まれる場合、スクリプト タグによる HTTP 要求を実行するために使用されるドキュメントを解決するためにも、jsdom が必要になる場合があります。現在のランタイムが何であるかを確認するブラウザのノードとスクリプトタグでサポートされていますが、それは私にとって大きな変化です。