这个问题可能是由于使用了client-side rendering而不是server-side rendering引起的。为了让Google爬虫或curl能够正确加载路由,需要进行server-side rendering。代码示例:
- 安装相关库
npm install --save react react-dom react-router-dom express
npm install --save-dev babel-cli babel-core babel-loader babel-preset-env babel-preset-react nodemon webpack webpack-dev-middleware
- 创建一个Express服务器
const express = require('express');
const path = require('path');
const app = express();
app.use(express.static(__dirname + '/build'));
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, 'build', 'index.html'));
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
此代码会在3000端口启动一个Express服务器,当用户访问任何路由时,都会返回构建好的静态文件index.html。
- 配置Webpack
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'build')
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader'
}
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: './public/index.html',
filename: 'index.html'
}),
new UglifyJSPlugin()
]
};
此代码将所有的源代码打包成一个bundle.js文件,并且使用HtmlWebpackPlugin插件将它注入到index.html文件中。
- 配置Babel
{
"presets": [
"env",
"react"
],
"plugins": [
"transform-object-rest-spread",
"transform-class-properties"
]
}
此代码告诉Babel如何转换代码,比如使用env和react的预设,以及使用transform-object-rest-spread和transform-class-properties插件。
- 修改React组件
你需要将你的React组件更改为在服务器上运行。在组件的根目录下添加下面的代码:
import ReactDOMServer from 'react-dom/server';
const appString = ReactDOMServer.renderToString(<YourComponent />);
res.send(`
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Your Title</title>
</head>
<body>
<div id="root">${appString}</div>
<script src="bundle.js"></script>
</body>
</html>
`);
这个代码会先用ReactDOMServer将React组件渲染成HTML字符串,然后将它嵌入到index.html文件中,并在文件底部添加一个引用以指向打包好的bundle.js文件。
通过这个过程,你的React静态网站现在可以在服务器端运行,并且可以在Google爬虫或curl中