我正在使用react vite ssr,结构与示例项目相同,创建vite-react-ssr来制作landind页面,但是当我想实现像我们这样的路线时,没有发现有很多问题,就像我现在使用的那样BrowserRouter 向我展示
ReferenceError: document is not defined
at getUrlBasedHistory
at Object.createBrowserHistory (C:...node_modules\@remix-run\router\dist\router.cjs.js:234:10)
at Module.createBrowserRouter (C:..\node_modules\react-router-dom\dist\umd\react-router-dom.development.js:269:23)
at Index (C:...\src\index.jsx:8:20)
at renderWithHooks (C:..node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:5662:16)
at renderIndeterminateComponent (C:..node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:5736:15)
at renderElement (C:..node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:5961:7)
at renderNodeDestructiveImpl (C:\..node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6119:11)
at renderNodeDestructive (C:\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6091:14)
at renderContextProvider (C:\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:5935:3)
at renderElement (C:\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6032:11)
at renderNodeDestructiveImpl (C:\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6119:11)
at renderNodeDestructive (C:\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6091:14)
at renderContextProvider (C:\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:5935:3)
at renderElement (C:\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6032:11)
at renderNodeDestructiveImpl (C:node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6119:11)
at renderNodeDestructive (\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6091:14)
at renderIndeterminateComponent (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:5790:7)
at renderElement (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:5961:7)
at renderNodeDestructiveImpl (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6119:11)
at renderNodeDestructive (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6091:14)
at renderIndeterminateComponent (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:5790:7)
at renderElement (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:5961:7)
at renderNodeDestructiveImpl (C:\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6119:11)
at renderNodeDestructive (C:\U\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6091:14)
at retryTask (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6543:5)
at performWork (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6591:7)
at C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6915:12
at scheduleWork (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:78:3)
at startWork (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6914:3)
at renderToStringImpl (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:6988:3)
at Object.renderToString (C:\\node_modules\react-dom\cjs\react-dom-server-legacy.node.development.js:7080:10)
at render (C:\\src\entry-server.jsx:10:31)
at file:///C://server.js:58:28
favicon.ico
index,jsx(这两种方式看起来都出现相同的错误)
import React from 'react'
import { BrowserRouter as Router, Routes, Route, createBrowserRouter, RouterProvider } from 'react-router-dom'
import { Home } from './pages/Home'
import { Other } from './pages/Other'
import { NotFound } from './pages/NotFound'
import App from './App'
export const Index = () => {
const routes = createBrowserRouter([
{
path: '/',
element: <App/>,
errorElement: <NotFound/>,
children: [
{
path: '/',
element: <Home/>
}
]
}
])
return (
/*<Router>
<Routes>
<Route index element={<Home />} />
<Route path="/other" element={<Other />} />
<Route path="*" element={<NotFound />} />
</Routes>
</Router>*/
<RouterProvider router={routes}/>
)
}
入口服务器.jsx
import React from 'react'
import ReactDOMServer from 'react-dom/server'
import App from './App';
import { StaticRouter } from 'react-router-dom/server'
import { Index } from '.';
import { Home } from './pages/Home';
export function render(url) {
const html = ReactDOMServer.renderToString(
<StaticRouter location={url}>
<Index />
</StaticRouter>
)
return { html }
}
entry-client.jsx
import './index.css'
import React from 'react'
import ReactDOM from 'react-dom/client'
import {Index} from './index'
import { Home } from './pages/Home'
ReactDOM.hydrateRoot(
document.getElementById('root'),
<React.StrictMode>
<Index />
</React.StrictMode>
)
我已经尝试了不同的方法来实现 BrowserRouter 但出现了相同的错误,并且我在没有 BrowserRouter 的情况下进行了尝试并加载页面并给出了此错误
chunk-IURPBYAF.js?v=2725bec9:21578 Download the React DevTools for a better development experience: https://reactjs.org/link/react-devtools
chunk-2NKYRYXZ.js?v=2725bec9:200 Uncaught Error: useRoutes() may be used only in the context of a <Router> component.
at invariant (chunk-2NKYRYXZ.js?v=2725bec9:200:11)
at useRoutesImpl (chunk-2NKYRYXZ.js?v=2725bec9:3495:34)
at useRoutes (chunk-2NKYRYXZ.js?v=2725bec9:3492:10)
at Routes (chunk-2NKYRYXZ.js?v=2725bec9:4152:10)
at renderWithHooks (chunk-IURPBYAF.js?v=2725bec9:11566:26)
at mountIndeterminateComponent (chunk-IURPBYAF.js?v=2725bec9:14944:21)
at beginWork (chunk-IURPBYAF.js?v=2725bec9:15932:22)
at HTMLUnknownElement.callCallback2 (chunk-IURPBYAF.js?v=2725bec9:3672:22)
at Object.invokeGuardedCallbackDev (chunk-IURPBYAF.js?v=2725bec9:3697:24)
at invokeGuardedCallback (chunk-IURPBYAF.js?v=2725bec9:3731:39)
invariant @ chunk-2NKYRYXZ.js?v=2725bec9:200
useRoutesImpl @ chunk-2NKYRYXZ.js?v=2725bec9:3495
useRoutes @ chunk-2NKYRYXZ.js?v=2725bec9:3492
Routes @ chunk-2NKYRYXZ.js?v=2725bec9:4152
renderWithHooks @ chunk-IURPBYAF.js?v=2725bec9:11566
mountIndeterminateComponent @ chunk-IURPBYAF.js?v=2725bec9:14944
beginWork @ chunk-IURPBYAF.js?v=2725bec9:15932
callCallback2 @ chunk-IURPBYAF.js?v=2725bec9:3672
invokeGuardedCallbackDev @ chunk-IURPBYAF.js?v=2725bec9:3697
invokeGuardedCallback @ chunk-IURPBYAF.js?v=2725bec9:3731
beginWork$1 @ chunk-IURPBYAF.js?v=2725bec9:19791
performUnitOfWork @ chunk-IURPBYAF.js?v=2725bec9:19224
workLoopSync @ chunk-IURPBYAF.js?v=2725bec9:19163
renderRootSync @ chunk-IURPBYAF.js?v=2725bec9:19142
performConcurrentWorkOnRoot @ chunk-IURPBYAF.js?v=2725bec9:18704
workLoop @ chunk-IURPBYAF.js?v=2725bec9:195
flushWork @ chunk-IURPBYAF.js?v=2725bec9:174
performWorkUntilDeadline @ chunk-IURPBYAF.js?v=2725bec9:382
Show 18 more frames
Show lessUnderstand this error
chunk-IURPBYAF.js?v=2725bec9:519 Warning: An error occurred during hydration. The server HTML was replaced with client content in <div>.
printWarning @ chunk-IURPBYAF.js?v=2725bec9:519
error @ chunk-IURPBYAF.js?v=2725bec9:503
errorHydratingContainer @ chunk-IURPBYAF.js?v=2725bec9:8767
recoverFromConcurrentError @ chunk-IURPBYAF.js?v=2725bec9:18759
performConcurrentWorkOnRoot @ chunk-IURPBYAF.js?v=2725bec9:18710
workLoop @ chunk-IURPBYAF.js?v=2725bec9:195
flushWork @ chunk-IURPBYAF.js?v=2725bec9:174
performWorkUntilDeadline @ chunk-IURPBYAF.js?v=2725bec9:382
Show 8 more frames
Show lessUnderstand this error
chunk-2NKYRYXZ.js?v=2725bec9:200 Uncaught Error: useRoutes() may be used only in the context of a <Router> component.
at invariant (chunk-2NKYRYXZ.js?v=2725bec9:200:11)
at useRoutesImpl (chunk-2NKYRYXZ.js?v=2725bec9:3495:34)
at useRoutes (chunk-2NKYRYXZ.js?v=2725bec9:3492:10)
at Routes (chunk-2NKYRYXZ.js?v=2725bec9:4152:10)
at renderWithHooks (chunk-IURPBYAF.js?v=2725bec9:11566:26)
at mountIndeterminateComponent (chunk-IURPBYAF.js?v=2725bec9:14944:21)
at beginWork (chunk-IURPBYAF.js?v=2725bec9:15932:22)
at HTMLUnknownElement.callCallback2 (chunk-IURPBYAF.js?v=2725bec9:3672:22)
at Object.invokeGuardedCallbackDev (chunk-IURPBYAF.js?v=2725bec9:3697:24)
at invokeGuardedCallback (chunk-IURPBYAF.js?v=2725bec9:3731:39)
invariant @ chunk-2NKYRYXZ.js?v=2725bec9:200
useRoutesImpl @ chunk-2NKYRYXZ.js?v=2725bec9:3495
useRoutes @ chunk-2NKYRYXZ.js?v=2725bec9:3492
Routes @ chunk-2NKYRYXZ.js?v=2725bec9:4152
renderWithHooks @ chunk-IURPBYAF.js?v=2725bec9:11566
mountIndeterminateComponent @ chunk-IURPBYAF.js?v=2725bec9:14944
beginWork @ chunk-IURPBYAF.js?v=2725bec9:15932
callCallback2 @ chunk-IURPBYAF.js?v=2725bec9:3672
invokeGuardedCallbackDev @ chunk-IURPBYAF.js?v=2725bec9:3697
invokeGuardedCallback @ chunk-IURPBYAF.js?v=2725bec9:3731
beginWork$1 @ chunk-IURPBYAF.js?v=2725bec9:19791
performUnitOfWork @ chunk-IURPBYAF.js?v=2725bec9:19224
workLoopSync @ chunk-IURPBYAF.js?v=2725bec9:19163
renderRootSync @ chunk-IURPBYAF.js?v=2725bec9:19142
recoverFromConcurrentError @ chunk-IURPBYAF.js?v=2725bec9:18762
performConcurrentWorkOnRoot @ chunk-IURPBYAF.js?v=2725bec9:18710
workLoop @ chunk-IURPBYAF.js?v=2725bec9:195
flushWork @ chunk-IURPBYAF.js?v=2725bec9:174
performWorkUntilDeadline @ chunk-IURPBYAF.js?v=2725bec9:382
Show 19 more frames
Show lessUnderstand this error
chunk-IURPBYAF.js?v=2725bec9:14050 The above error occurred in the <Routes> component:
at Routes (http://localhost:5174/node_modules/.vite/deps/chunk-2NKYRYXZ.js?v=2725bec9:4149:5)
at Index
Consider adding an error boundary to your tree to customize error handling behavior.
Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries.
logCapturedError @ chunk-IURPBYAF.js?v=2725bec9:14050
update.callback @ chunk-IURPBYAF.js?v=2725bec9:14070
callCallback @ chunk-IURPBYAF.js?v=2725bec9:11266
commitUpdateQueue @ chunk-IURPBYAF.js?v=2725bec9:11283
commitLayoutEffectOnFiber @ chunk-IURPBYAF.js?v=2725bec9:17113
commitLayoutMountEffects_complete @ chunk-IURPBYAF.js?v=2725bec9:18006
commitLayoutEffects_begin @ chunk-IURPBYAF.js?v=2725bec9:17995
commitLayoutEffects @ chunk-IURPBYAF.js?v=2725bec9:17946
commitRootImpl @ chunk-IURPBYAF.js?v=2725bec9:19379
commitRoot @ chunk-IURPBYAF.js?v=2725bec9:19303
finishConcurrentRender @ chunk-IURPBYAF.js?v=2725bec9:18786
performConcurrentWorkOnRoot @ chunk-IURPBYAF.js?v=2725bec9:18744
workLoop @ chunk-IURPBYAF.js?v=2725bec9:195
flushWork @ chunk-IURPBYAF.js?v=2725bec9:174
performWorkUntilDeadline @ chunk-IURPBYAF.js?v=2725bec9:382
Show 15 more frames
Show lessUnderstand this error
chunk-IURPBYAF.js?v=2725bec9:14778 Uncaught Error: There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering.
at updateHostRoot (chunk-IURPBYAF.js?v=2725bec9:14778:65)
at beginWork (chunk-IURPBYAF.js?v=2725bec9:15951:22)
at beginWork$1 (chunk-IURPBYAF.js?v=2725bec9:19779:22)
at performUnitOfWork (chunk-IURPBYAF.js?v=2725bec9:19224:20)
at workLoopSync (chunk-IURPBYAF.js?v=2725bec9:19163:13)
at renderRootSync (chunk-IURPBYAF.js?v=2725bec9:19142:15)
at recoverFromConcurrentError (chunk-IURPBYAF.js?v=2725bec9:18762:28)
at performConcurrentWorkOnRoot (chunk-IURPBYAF.js?v=2725bec9:18710:30)
at workLoop (chunk-IURPBYAF.js?v=2725bec9:195:42)
at flushWork (chunk-IURPBYAF.js?v=2725bec9:174:22)
updateHostRoot @ chunk-IURPBYAF.js?v=2725bec9:14778
beginWork @ chunk-IURPBYAF.js?v=2725bec9:15951
beginWork$1 @ chunk-IURPBYAF.js?v=2725bec9:19779
performUnitOfWork @ chunk-IURPBYAF.js?v=2725bec9:19224
workLoopSync @ chunk-IURPBYAF.js?v=2725bec9:19163
renderRootSync @ chunk-IURPBYAF.js?v=2725bec9:19142
recoverFromConcurrentError @ chunk-IURPBYAF.js?v=2725bec9:18762
performConcurrentWorkOnRoot @ chunk-IURPBYAF.js?v=2725bec9:18710
workLoop @ chunk-IURPBYAF.js?v=2725bec9:195
flushWork @ chunk-IURPBYAF.js?v=2725bec9:174
performWorkUntilDeadline @ chunk-IURPBYAF.js?v=2725bec9:382
Show 11 more frames
Show lessUnderstand this error
chunk-IURPBYAF.js?v=2725bec9:19439 Uncaught Error: useRoutes() may be used only in the context of a <Router> component.
at invariant (chunk-2NKYRYXZ.js?v=2725bec9:200:11)
at useRoutesImpl (chunk-2NKYRYXZ.js?v=2725bec9:3495:34)
at useRoutes (chunk-2NKYRYXZ.js?v=2725bec9:3492:10)
at Routes (chunk-2NKYRYXZ.js?v=2725bec9:4152:10)
at renderWithHooks (chunk-IURPBYAF.js?v=2725bec9:11566:26)
at mountIndeterminateComponent (chunk-IURPBYAF.js?v=2725bec9:14944:21)
at beginWork (chunk-IURPBYAF.js?v=2725bec9:15932:22)
at beginWork$1 (chunk-IURPBYAF.js?v=2725bec9:19779:22)
at performUnitOfWork (chunk-IURPBYAF.js?v=2725bec9:19224:20)
at workLoopSync (chunk-IURPBYAF.js?v=2725bec9:19163:13)
invariant @ chunk-2NKYRYXZ.js?v=2725bec9:200
useRoutesImpl @ chunk-2NKYRYXZ.js?v=2725bec9:3495
useRoutes @ chunk-2NKYRYXZ.js?v=2725bec9:3492
Routes @ chunk-2NKYRYXZ.js?v=2725bec9:4152
renderWithHooks @ chunk-IURPBYAF.js?v=2725bec9:11566
mountIndeterminateComponent @ chunk-IURPBYAF.js?v=2725bec9:14944
beginWork @ chunk-IURPBYAF.js?v=2725bec9:15932
beginWork$1 @ chunk-IURPBYAF.js?v=2725bec9:19779
performUnitOfWork @ chunk-IURPBYAF.js?v=2725bec9:19224
workLoopSync @ chunk-IURPBYAF.js?v=2725bec9:19163
renderRootSync @ chunk-IURPBYAF.js?v=2725bec9:19142
recoverFromConcurrentError @ chunk-IURPBYAF.js?v=2725bec9:18762
performConcurrentWorkOnRoot @ chunk-IURPBYAF.js?v=2725bec9:18710
workLoop @ chunk-IURPBYAF.js?v=2725bec9:195
flushWork @ chunk-IURPBYAF.js?v=2725bec9:174
performWorkUntilDeadline @ chunk-IURPBYAF.js?v=2725bec9:382
Show 16 more frames
Show lessUnderstand this error
错误原因是入口服务器需要静态路由器https://v5.reactrouter.com/web/api/StaticRouter 入口客户端需要 BrowserRouter 但需要在自己的组件上调用并使用,不能在 index.jsx 上使用,所以看起来像这样
index.jsx
import React from 'react'
import { Routes, Route, createBrowserRouter, useRoutes } from 'react- router-dom'
import { NotFound } from './pages/NotFound/NotFound'
import { ContactUs } from './pages/ContactUs/ContactUs'
import { HomePage } from './pages/HomePage/HomePage'
import { AboutUs } from './pages/AboutUs/AboutUs'
import App from './App'
export const Index = () => {
return (
<>
<Routes>
<Route path='/' element={<App/>}/>
<Route index element={<HomePage/>} />
<Route path="/about-us" element={<AboutUs/>} />
<Route path='/contact-us' element={<ContactUs/>}/>
<Route path="*" element={<NotFound />} />
</Routes>
</>
)
}
entry-client.jsx
//import './index.css'
import React from 'react'
import ReactDOM from 'react-dom/client'
import { Index } from './index'
import { BrowserRouter } from 'react-router-dom'
ReactDOM.hydrateRoot(
document.getElementById('root'),
<React.StrictMode>
<BrowserRouter>
<Index />
</BrowserRouter>
</React.StrictMode>
)
入口服务器.jsx
import React from 'react'
import ReactDOMServer from 'react-dom/server'
import App from './App';
import { StaticRouter } from 'react-router-dom/server'
import { Index } from '.';
export function render(url) {
const html = ReactDOMServer.renderToString(
<React.StrictMode>
<StaticRouter location={url}>
<Index />
</StaticRouter>
</React.StrictMode>
)
return { html }
}