尽管所有反应路由器版本冲突,如何在反应中进行服务器端渲染?

Posted

技术标签:

【中文标题】尽管所有反应路由器版本冲突,如何在反应中进行服务器端渲染?【英文标题】:How to do server side rendering in react despite all react router version conflicts? 【发布时间】:2019-12-18 05:39:21 【问题描述】:

我正在尝试使用 react 和 react-router-dom 进行服务器端渲染,但在新版本中,它给我一个错误 你不应该在路由器之外使用 Switch 我认为是版本冲突,但有解决方案吗(react-router-config - You should not use outside a (it is inside a Router!))。

server.js

import express from 'express';
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from '../client/src/AppRoutes';
import  StaticRouter  from 'react-router-dom';
import  renderRoutes  from 'react-router-config'


const app = express();



app.get('*', (req, res) => 
    const routerContext = ;
    res.send(`
    <!doctype html>
    <html lang="en">
      <head>s-s-r</head>
      <body>
        <div id="root">$ReactDOMServer.renderToString(
            <StaticRouter location=req.url context=routerContext>
                    <div>renderRoutes(App)</div>
            </StaticRouter>
            )</div>
<!--        <script src="/dist/main.js"></script>-->
      </body>
    </html>
  `);
);


app.listen(3000, (error) => 
    if (error) 
        return console.log('something bad happened', error);
    
    console.log("listening on " + 3000 + "...");
);

AppRoutes.js

import PageA from './Container/PageA';
import PageB from './Container/PageB';
import Home from './Container/Home'
import MainPage from './Container/MainPage';



export default [
    
        ...MainPage,
        routes:[
            
              ...Home,
              path:'/',
              exact:true
            ,
            
                ...PageA,
                path:'/a',
                exact:true
            ,
            
                ...PageB,
                path:'/b',
                exact:true

            
        ]
    
]

package.json


  "name": "reacts-s-rwithCodeSplitting",
  "version": "1.0.0",
  "description": "",
  "main": "server/server.js",
  "scripts": 
    "test": "babel-node server/index.js",
    "start": "nodemon server/index.js",
    "build": "babel server --out-dir ./dist --source-maps",
    "serve": "node ./dist/index.js"
  ,
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": 
    "express": "^4.17.1",
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "react-loadable": "^5.5.0",
    "react-router-config": "^5.0.1",
    "react-router-dom": "^5.0.1"
  ,
  "devDependencies": 
    "@babel/cli": "^7.5.5",
    "@babel/core": "^7.5.5",
    "@babel/node": "^7.5.5",
    "@babel/plugin-syntax-dynamic-import": "^7.2.0",
    "@babel/preset-env": "^7.5.5",
    "@babel/preset-react": "*",
    "@babel/register": "^7.5.5",
    "chai": "^4.2.0",
    "nodemon": "^1.19.1"
  

【问题讨论】:

我知道要求可能有点过分,但您能设置一个codesandbox.io 以便我们测试和修复吗?无论如何,它似乎可能是versioning of react-router? 【参考方案1】:

快速修复:

    删除您的node_modules"react-router": "^5.0.1" 添加到您的package.json 使用npm install重新安装。

确保react-routerreact-router-configreact-router-dom 是同一版本。

怎么了?

当我尝试重现您的错误时,我发现问题中的 package.json 缺少 react-router 依赖项,这使我无法启动服务器。

从你的故事来看,我猜你的node_modules 中有另一个版本的react-router,它与react-router-configreact-router-dom 5.0.1 版本不同步。

所以我尝试用这个重现问题:

"react-router": "^4.3.0",
"react-router-config": "^5.0.1",
"react-router-dom": "^5.0.1"

这会导致你提到的问题。

【讨论】:

我进行了所有更改,但仍然收到此错误Error: Invariant failed: You should not use &lt;Switch&gt; outside a &lt;Router&gt; @Nane 你是这个问题的主人吗?你有任何沙箱或源代码,以便我可以重现错误吗?

以上是关于尽管所有反应路由器版本冲突,如何在反应中进行服务器端渲染?的主要内容,如果未能解决你的问题,请参考以下文章

反应路由器和快递冲突

升级本机反应时如何解决“project.pbxproj”文件中的冲突?

反应路由器和setState冲突

如何在反应路由器中调用阿波罗客户端 useQuery?

如何在反应路由器内的任何路由上调用函数?

如何在反应路由器dom v4中获取组件中的参数?