从Socket.IO lib(或任何其他示例)查看以下示例:
// note, io(<port>) will create a http server for you
var io = require('socket.io')(80);
io.on('connection', function (socket) {
io.emit('this', { will: 'be received by everyone'});
socket.on('private message', function (from, msg) {
console.log('I received a private message by ', from, ' saying ', msg);
});
socket.on('disconnect', function () {
io.emit('user disconnected');
});
});
Run Code Online (Sandbox Code Playgroud)
似乎Socket.IO总是依赖于http服务器,它会为你创建一个,就像上面的例子一样.
由于websockets不是HTTP,为什么需要http服务器?如果它只是为了后备,为什么它如此集成?
我们正在尝试制作一个 webpack 捆绑包,它将在单个捆绑包中包含我们的所有依赖项。
有一个特定的包,它有来自node_modules的动态需求,而webpack无法在编译时正确解析该包。
生成错误的代码是:
// config.middlewares is a list of packages inside node_modules
Object.keys(config.middlewares).forEach(function (moduleName) {
var pkg = require(moduleName)
var alias = config.middlewares[moduleName]
helmet[alias] = pkg
})
Run Code Online (Sandbox Code Playgroud)
Webpack 将其编译为:
Object.keys(config.middlewares).forEach(function (moduleName) {
var pkg = !(function webpackMissingModule() { var e = new Error("Cannot find module \".\""); e.code = 'MODULE_NOT_FOUND'; throw e; }())
var alias = config.middlewares[moduleName]
helmet[alias] = pkg
})
Run Code Online (Sandbox Code Playgroud)
因此,我们尝试使用 Webpack 的 ContextReplacementPlugin,但无论我们尝试什么,我们都无法将其配置为更改上下文以从 node_modules 获取文件。
我们尝试过的一些事情(我们首先尝试获取一个特定的包,称为 hsts):
new ContextReplacementPlugin(/helmet.*/, /\.\.\/hsts/)
new ContextReplacementPlugin(/helmet.*/, /\.\/\.\.\/hsts/)
new ContextReplacementPlugin(/helmet.*/, /\.\/\.\.\/hsts\/index\.js/)
```
Run Code Online (Sandbox Code Playgroud)