无法使用 socket.io 和 React 运行 webpack
Unable to run webpack with socket.io and React
我是整个 React、webpack 和 express 框架的新手,但在我决定集成 socket.io 和 express for一些实时通知。这是我在 server.js:
中的服务器端代码
// Babel ES6/JSX Compiler
require('babel-register');
var React = require('react');
var ReactDOM = require('react-dom/server');
var Router = require('react-router');
var express = require('express');
var path = require('path');
var routes = require('./routes');
var bodyParser = require('body-parser');
var swig = require('swig');
var webpack = require("webpack");
var webpackConfig = require('./webpack.config');
var compiler = webpack(webpackConfig);
var app = express();
app.use(express.static(path.join(__dirname)));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
const PORT = process.env.PORT || 8080;
var WebpackDevServer = require("webpack-dev-server");
var server = new WebpackDevServer(compiler, {
contentBase: webpackConfig.output.path,
hot: true,
historyApiFallback: true,
filename: path.resolve(webpackConfig.output.path, webpackConfig.output.filename),
publicPath: webpackConfig.output.publicPath,
headers: { "Access-Control-Allow-Origin": "*" },
stats: { colors: true }
});
var server = require('http').createServer(app);
var io = require('socket.io')(server);
server.listen(PORT);
//Whenever someone connects this gets executed
io.on('connection', function(socket){
console.log("Welcome to the Web Portal");
socket.on('disconnect', function () {
console.log('Goodbye');
});
});
app.post("/notify", function(req, res) {
var title = req.body.title;
var description = req.body.description;
io.emit('notification', title + '\n'+ description);
res.send("Notification received");
});
这是我在 index.html 中的客户端代码:
<!DOCTYPE html>
<html class="background-grey">
<head>
<link rel="stylesheet" href="/style/style.css">
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.css">
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css">
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.0.0/codemirror.min.css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.0.0/theme/solarized.min.css" />
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</head>
<body class="background-grey">
<div class="container"></div>
<script src="/bundle.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect();
socket.on('notification', function(message) {
alert(message);
});
</script>
</body>
</html>
我基本上是通过 webpack-dev-server 渲染我的 React 组件,因为当我通过 react-middleware 以标准方式进行渲染时:
app.use(function(req, res) {
Router.match({ routes: routes.default, location: req.url }, function(err, redirectLocation, renderProps) {
if (err) {
res.status(500).send(err.message)
} else if (redirectLocation) {
res.status(302).redirect(redirectLocation.pathname + redirectLocation.search)
} else if (renderProps) {
var html = ReactDOM.renderToStaticMarkup(React.createElement(Router.RouterContext, renderProps));
var page = swig.renderFile('index.html', { html: html});
res.status(200).send(page);
} else {
res.status(404).send('Page Not Found')
}
});
});
当我试图直接转到 url 时,它给了我这个问题 Invariant Violation: Could not find "store" in either the context or props of "Connect(DashBoard)"
。
此外,当我试图注释掉 var server = require('http').createServer(app);
以便 var io = require('socket.io')(server);
将从 WebpackDevServer 调用服务器时,它会抛出此错误:
var listeners = server.listeners('request').slice(0);
^
我几乎查看了所有在线帖子和文章,但无法在我的代码中实现它们。有人可以告诉我如何 运行 我的服务器并正确呈现所有 React 组件并集成 socket.io 吗?
我不太确定我之前做错了什么,但我重新开始并重建了我的项目结构。然后我在 server.js 中设置 socket.io 并按照文档在客户端获取 send/receive 数据,并且它运行良好。我的 React、Express 和 Webpack 样板项目可以在这里找到:React Express Webpack Boilerplate Project
我是整个 React、webpack 和 express 框架的新手,但在我决定集成 socket.io 和 express for一些实时通知。这是我在 server.js:
中的服务器端代码// Babel ES6/JSX Compiler
require('babel-register');
var React = require('react');
var ReactDOM = require('react-dom/server');
var Router = require('react-router');
var express = require('express');
var path = require('path');
var routes = require('./routes');
var bodyParser = require('body-parser');
var swig = require('swig');
var webpack = require("webpack");
var webpackConfig = require('./webpack.config');
var compiler = webpack(webpackConfig);
var app = express();
app.use(express.static(path.join(__dirname)));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
const PORT = process.env.PORT || 8080;
var WebpackDevServer = require("webpack-dev-server");
var server = new WebpackDevServer(compiler, {
contentBase: webpackConfig.output.path,
hot: true,
historyApiFallback: true,
filename: path.resolve(webpackConfig.output.path, webpackConfig.output.filename),
publicPath: webpackConfig.output.publicPath,
headers: { "Access-Control-Allow-Origin": "*" },
stats: { colors: true }
});
var server = require('http').createServer(app);
var io = require('socket.io')(server);
server.listen(PORT);
//Whenever someone connects this gets executed
io.on('connection', function(socket){
console.log("Welcome to the Web Portal");
socket.on('disconnect', function () {
console.log('Goodbye');
});
});
app.post("/notify", function(req, res) {
var title = req.body.title;
var description = req.body.description;
io.emit('notification', title + '\n'+ description);
res.send("Notification received");
});
这是我在 index.html 中的客户端代码:
<!DOCTYPE html>
<html class="background-grey">
<head>
<link rel="stylesheet" href="/style/style.css">
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.css">
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css">
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.0.0/codemirror.min.css" />
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/codemirror/5.0.0/theme/solarized.min.css" />
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
</head>
<body class="background-grey">
<div class="container"></div>
<script src="/bundle.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect();
socket.on('notification', function(message) {
alert(message);
});
</script>
</body>
</html>
我基本上是通过 webpack-dev-server 渲染我的 React 组件,因为当我通过 react-middleware 以标准方式进行渲染时:
app.use(function(req, res) {
Router.match({ routes: routes.default, location: req.url }, function(err, redirectLocation, renderProps) {
if (err) {
res.status(500).send(err.message)
} else if (redirectLocation) {
res.status(302).redirect(redirectLocation.pathname + redirectLocation.search)
} else if (renderProps) {
var html = ReactDOM.renderToStaticMarkup(React.createElement(Router.RouterContext, renderProps));
var page = swig.renderFile('index.html', { html: html});
res.status(200).send(page);
} else {
res.status(404).send('Page Not Found')
}
});
});
当我试图直接转到 url 时,它给了我这个问题 Invariant Violation: Could not find "store" in either the context or props of "Connect(DashBoard)"
。
此外,当我试图注释掉 var server = require('http').createServer(app);
以便 var io = require('socket.io')(server);
将从 WebpackDevServer 调用服务器时,它会抛出此错误:
var listeners = server.listeners('request').slice(0);
^
我几乎查看了所有在线帖子和文章,但无法在我的代码中实现它们。有人可以告诉我如何 运行 我的服务器并正确呈现所有 React 组件并集成 socket.io 吗?
我不太确定我之前做错了什么,但我重新开始并重建了我的项目结构。然后我在 server.js 中设置 socket.io 并按照文档在客户端获取 send/receive 数据,并且它运行良好。我的 React、Express 和 Webpack 样板项目可以在这里找到:React Express Webpack Boilerplate Project