why react-snap only pre-render main page in SPA application?
我有一个基于react和react-router-4的简单项目SPA应用程序,我的项目中有多个路由,例如:
- www.mySite / build /#/
- www.mySite / build /#/ page1 / page12
- www.mySite / build /#/ page2
当我使用react-snap预先渲染我的项目并在浏览器中打开路线时,仅预渲染了主要路线(www.mySite / build /#/),因此Google机器人无法抓取其他路线和页面。
我的package.json配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | { "name":"react-boilerplate", "version":"1.0.0", "description":"", "main":"index.js", "scripts": { "start":"webpack-dev-server --mode development --open --hot", "build":"webpack --mode production", "postbuild":"react-snap" }, "keywords": [], "author":"", "license":"ISC", "devDependencies": { "@babel/core":"^7.1.2", "@babel/preset-env":"^7.1.0", "@babel/preset-react":"^7.0.0", "babel-loader":"^8.0.4", "css-loader":"^1.0.0", "html-webpack-plugin":"^3.2.0", "react-snap":"^1.23.0", "style-loader":"^0.23.0", "webpack":"^4.20.2", "webpack-cli":"^3.1.1", "webpack-dev-server":"^3.1.14" }, "dependencies": { "react":"^16.5.2", "react-dom":"^16.5.2", "react-redux":"^7.1.0", "react-router":"^5.0.1", "react-router-dom":"^5.0.1", "redux":"^4.0.4" } } |
我的webpack配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { entry:"./src/index.js", output: { path: path.join(__dirname,"/build"), filename:"index-bundle.js" }, module: { rules: [ { test: /\\.js$/, exclude: /node_modules/, use: ["babel-loader"] }, { test: /\\.css$/, use: ["style-loader","css-loader"] } ] }, plugins: [ new HtmlWebpackPlugin({ template:"./src/index.html" }) ] }; |
index.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import React from"react"; import {Route, HashRouter as Router, Switch} from 'react-router-dom'; import App from"./components/App.js"; import Page1 from"./components/Page1"; import Page12 from"./components/Page12"; import Page2 from"./components/Page2"; import { hydrate, render } from"react-dom"; const route = ( <Router> <Switch> <Route exact path="/" component={App}/> <Route exact path="/page1" component={Page1}/> <Route exact path="/page1/page12" component={Page12}/> <Route exact path="/page2" component={Page2}/> </Switch> </Router> ); const rootElement = document.getElementById("root"); if (rootElement.hasChildNodes()) { hydrate(route, rootElement); } else { render(route, rootElement); } |
App.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import React, { Component } from"react"; import '../styles/App.css'; import {NavLink} from 'react-router-dom'; class App extends Component { render() { return ( My React App! <br/> <NavLink exact to="/page1">???? 1</NavLink> <br/> <NavLink exact to="/page1/page12">???? 12</NavLink> <br/> <NavLink exact to="/page2">???? 2</NavLink> <br/> ); } } export default (App); |
第1页中的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import React, { Component } from"react"; class Page1 extends Component { render() { return ( we are in page1 ); } } export default(Page1); |
其他页面如第1页。
Google漫游器将忽略您网址中
www.mySite/build/#/page1/page12 => www.mySite/build/#/
为了使您的预渲染工作正常进行,您可能需要删除URL中的
请参见:如何从react-router中的URL中删除哈希