使用Webpack转译Node服务器和Socket.io

6

我想使用webpack来构建我的Node服务器,该服务器使用socket.io。

这是我的简单服务器代码:

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)

我使用的版本如下:

  • node: 6.7.0
  • webpack: 1.13.2
  • socket.io: 1.5.1
1个回答

6

警告来自于一个动态require,例如:

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

通常情况下,可以忽略它。Webpack尝试使用上下文模块来处理动态requires,这基本上是所有可能匹配动态require的模块的表示。您可以在此处阅读更多信息: https://webpack.github.io/docs/context.html 关于错误,如果您不需要将socket.io捆绑到输出包中,可以将其添加到Webpack的externals配置中,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-node-externals 正是为此而设计的一个webpack插件。

如果你想使用该插件,安装完 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;

看到了你的帖子,帮助我锁定了问题。我有一个附加问题。如果我在生产环境中排除所有节点模块,那是否意味着我必须将整个node_modules文件夹与构建一起打包?不确定如何进行优化。你能详细说明一下吗? - sharman
@sharman 如果你排除所有的 node_modules,那么你将不得不随着构建一起发布 node_modules 文件夹。你也可以将你的项目创建为一个独立的包,当用户安装你的包时,它会下载所有需要的节点模块(就像安装反应一样,还会安装其他包)。关于优化,我不知道如何让 node_modules 保持外部,同时进行优化。 - omerts
你使用了 webpack-node-externals,帮我节省了好几个小时的时间,非常感谢! - Maxime Lafarie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接