2016-10-31 8 views
3

socket.ioを使用するノードサーバーにwebpackを使用しようとしています。ノードサーバーとsocket.ioをwebpackでトランスペアリング

var server = require('http').createServer(); 
var io = require('socket.io').listen(server); 

io.on('connection', function(client) { 
    console.log('new client'); 

    client.on('hello', function(data) { 
    console.log('msg: ', data); 
    }); 

    client.on('disconnect', function(){ 
    console.log('client disconnect'); 
    }); 
}); 

server.listen(3000); 

そして、私のwebpack.config.js

var config = { 
    target: "node", 
    entry: { 
    server: ["server.js"] 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.(txt|json|osgjs|osgt|bin)$/, 
     loader: "file?name=[path][name].[ext]" 
     } 
    ], 
    noParse: ["ws"] 
    } 
    externals: ["ws"], 
    output: { 
    path: __dirname, 
    filename: "[name].js" 
    } 
} 

module.exports = config; 

私は何のエラーを持っていない "コンパイル"、単なる警告:

> NODE_ENV=development BUILD_TARGET=server webpack --display-error-details 

Hash: a692e23215bcd6caa05a 
Version: webpack 1.13.2 
Time: 672ms 
             Asset  Size Chunks    Chunk Names 
       _/node_modules/mime-db/db.json 145 kB   [emitted] 
_/node_modules/socket.io-client/package.json 4.29 kB   [emitted] 
            server.js 572 kB  0 [emitted] server 
    [0] multi server 28 bytes {0} [built] 
    [1] ./server.js 346 bytes {0} [built] 
    + 88 hidden modules 

WARNING in ../~/engine.io/lib/server.js 
Critical dependencies: 
74:43-65 the request of a dependency is an expression 
@ ../~/engine.io/lib/server.js 74:43-65 

は、私は単純なサーバーを持っています

私のサーバーを起動しようとすると:

fs.js:977 
    return binding.fstat(fd); 
       ^

Error: EBADF: bad file descriptor, fstat 
    at Error (native) 
    at Object.fs.fstatSync (fs.js:977:18) 
    at tryStatSync (fs.js:462:13) 
    at fs.readFileSync (fs.js:510:12) 
    at Object.<anonymous> (/Users/alexis/Documents/server.js:109:21) 
    at __webpack_require__ (/Users/alexis/Documents/server.js:21:30) 
    at Object.<anonymous> (/Users/alexis/Documents/server.js:56:34) 
    at __webpack_require__ (/Users/alexis/Documents/server.js:21:30) 
    at Object.<anonymous> (/Users/alexis/Documents/server.js:48:19) 
    at __webpack_require__ (/Users/alexis/Documents/server.js:21:30) 

は、私が使用:

  • ノード:6.7.0
  • のWebPACK:1.13.2
  • socket.io:1.5.1

答えて

2

警告が必要とダイナミックから来て、

const test = require('scripts/' + scriptName) 

通常は無視してください。 Webpackは、基本的に動的要求と一致するすべての可能なモジュールの表現であるコンテキストモジュールを使用して動的要求に対処しようとします。 あなたがここでそれについての詳細を読むことができます。エラーについて https://webpack.github.io/docs/context.html

を、あなたの出力バンドルにバンドルされるsocket.ioを必要としない場合、あなたはWebPACKのの外観の設定に追加することができ、およびWebPACKのはちょうど無視しますしかし、ソリューションにsocket.ioというnode_modulesフォルダが必要です。

だからあなたの構成は次のようになります。

var config = { 
    target: "node", 
    entry: { 
    server: ["server.js"] 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.(txt|json|osgjs|osgt|bin)$/, 
     loader: "file?name=[path][name].[ext]" 
     } 
    ], 
    noParse: ["ws"] 
    } 
    externals: ["ws", "socket.io"], 
    output: { 
    path: __dirname, 
    filename: "[name].js" 
    } 
} 

module.exports = config; 

実際にバックエンドのアプリケーションのためのあなたのバンドルでnode_modulesの依存関係を含めないことが好ましい、とちょうどそのためWebPACKのプラグインが存在している。 https://www.npmjs.com/package/webpack-node-externals

場合代わりにプラグインを使用したい場合、設定は(webpack-node-externalsのインストール後に)行われます:

var nodeExternals = require('webpack-node-externals') 

var config = { 
    target: "node", 
    entry: { 
    server: ["server.js"] 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.(txt|json|osgjs|osgt|bin)$/, 
     loader: "file?name=[path][name].[ext]" 
     } 
    ], 
    noParse: ["ws"] 
    } 
    externals: [nodeExternals()], 
    output: { 
    path: __dirname, 
    filename: "[name].js" 
    } 
} 

module.exports = config; 
+0

Cあなたの記事を見て、私は問題をゼロに助けました。私は質問に追加しました。すべてのノードモジュールを除外すると、本番環境ではnode_modulesフォルダ全体をビルドにバンドルする必要がありますか?それを最適化する方法がわからないあなたは精緻化できますか? – sharman

+0

@sharmanすべてのnode_modulesを除外すると、buildとともにnode_modulesフォルダを出荷する必要があります。また、スタンドアロンパッケージとしてプロジェクトを作成することもできます。ユーザーがパッケージをインストールすると、必要なすべてのノードモジュールがダウンロードされます(例えば、他のパッケージをインストールする場合など)。最適化に関して、私はnode_moduleを外部に残して最適化する方法を知らない。 – omerts

関連する問題