2017-01-28 12 views
1

Reactアプリケーションでsocket.io-clientを使用しようとしていて、奇妙な問題が発生しています。パッケージャが存在しないファイルをインクルードしようとしないようにするにはどうすればよいですか?

if (typeof window === 'undefined') { 
    try { 
    NodeWebSocket = require('ws'); 
    } catch (e) { } 
} 

windowは未定義ではありませんので、あなたはこのコードが何もしないと思うかもしれないが、あなたがなりたい:ディープ(socket.io-clientで必要)engine.io内のコードの以下のビットでwebsocket.jsというファイルがあります違う。

私のpackager(これまでの私が知っている限り、Reactネイティブパッケージャ)はすべてのJavascriptファイルを調べて、importrequireコマンドをすべて検索し、それらが参照するファイルをパッケージ化します。

wsモジュールは、Node.jsのためのものとはもちろんで存在して反応しないurl.jshttp.jsなどのNode.jsのモジュールを利用しますWebSocket.jsと呼ばれるファイルを、含まれているため、パッケージの試みは失敗します。

これらの5行を削除すると問題は解決し、すべてが機能しましたが、より良い方法が必要です。特定のモジュールを除外するようにパッケージャに指示することはできますか?

+0

FYI React Native Product Painsに未解決の問題があります:https://productpains.com/post/react-native/packager-support-resolvealias-ala-webpack/ - そうではないようです素晴らしい回避策。 – jevakallio

答えて

0

問題を再現できませんでしたが、wsパッケージをブラックリストに登録することができます。

How to blacklist specific node_modules of my package's dependencies in react-native's packager?

+0

私はあなたが再作成できなかった理由を発見しました。 Reactパッケージャを少し古いバージョンで使用していましたが、package.jsonの 'browser'オブジェクトの値として' false'を理解できませんでした。 – Malvolio

0

あなたは以下のコード試すことができます:提起したとして、私は私の問題を解決していないが、私は何が起こっていたかを考え出し

if (typeof window === 'undefined') { 
     try { 
     var wsNode = 'ws' // store node module name in a string 
     NodeWebSocket = require(wsNode); // dynamic require will exclude the node module to get bundled in react-native 
     } catch (e) { } 
    } 
+0

これはまさに私がやったことですが、生産に入るにはengine-ioパッケージとsocket-ioパッケージをforkする必要があります。私は別の解決策を探していた。 – Malvolio

0

を、なぜ私は他の困難を抱えていましたユーザーはいませんでした。ファイルで

node_modules/engine.io-client/package.json次のエントリでした:リアクトパッケージャの

"browser": { 
    "ws": false, 
    "xmlhttprequest-ssl": "./lib/xmlhttprequest.js" 
    }, 

私の由緒あるバージョンでは、クライアントのために構築されている場合、[WebSocketを] WSなどのスキップ」を意味する「偽」を理解していませんでした側"。パッケージャをアップグレードすると問題は解決しました。

関連する問題