1

ブラウザ側ライブラリのランタイム環境を node.js に拡張しようとしています。そのために、ユニバーサル モジュール定義 (UMD) パターンを実装しました。これは AMD の実装で動作します<script>が、node.js では動作しませんwindow

問題の依存関係はWebSocket、、、、EventSourceです。詳細はこちらで説明されています: https://github.com/flowersinthesand/portal/issues/115では、node.js でウィンドウの依存関係を解決するための最良の方法は何ですか? 私はそれを行うために次の方法を持っています。私はnode.jsに慣れていないので、これらはやや慣れておらず、どちらが自然なのかわかりません。私は node.js をサポートしようとしていますが、何かをあまり変更したくありません。XMLHttpRequestdocument

次のコード スニペットは、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 が必要になる場合があります。現在のランタイムが何であるかを確認するブラウザのノードとスクリプトタグでサポートされていますが、それは私にとって大きな変化です。

4

1 に答える 1