#reactjs #server-side-rendering #react-dom #react-dom-server
Вопрос:
Я изучаю рендеринг на стороне сервера React. Использование Koa для создания серверной части. Следуйте официальному документу, я установил react
и react-dom
:
yarn add react react-dom
И далее в моей записи на стороне сервера:
import Koa from 'koa'
import Router from '@koa/router'
import { renderToString } from 'react-dom/server'
import ReactDOMServer from 'react-dom/server';
import Home from '../client/components/HomePage'
const app = new Koa()
const router = new Router()
const content = ReactDOMServer.renderToString(Home)
// print logger
app.use(async (ctx, next) => {
await next()
const rt = ctx.response.get('tt')
console.log(`${ ctx.method }-${ ctx.url }-${ rt }`)
})
// set time
app.use(async (ctx, next) => {
const start = Date.now()
await next()
const interval = Date.now() - start
ctx.set('tt', `${ interval }ms`)
})
router.get('/', ctx => {
ctx.body = `
<html>
<head>
<title>hello</title>
</head>
<body>
<div id="app">${ content }</div>
</body>
</html>
`
})
app.use(router.routes())
app.use(async ctx => {
ctx.body = 'koa'
})
app.listen(3000, () => {
console.log('server deployed on port 3000...')
})
Но когда я попытался запустить свой сервер, он просто сказал мне:
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/Users/ssr-plg/implessr/server/node_modules/react-dom/server' imported from /Users/ssr-plg/implessr/server/index.js
Did you mean to import react-dom/server.js?
Вот мой pkg.json:
{
"name": "server",
"version": "1.0.0",
"main": "index.js",
"type": "module",
"license": "MIT",
"scripts": {
"start": "nodemon index.js"
},
"dependencies": {
"@koa/router": "^10.0.0",
"koa": "^2.13.1",
"react": "^17.0.1",
"react-dom": "^17.0.1"
},
"devDependencies": {
"nodemon": "^2.0.7"
}
}
Вы можете подробно ознакомиться со всем моим кодом в этом репозитории.
Ответ №1:
Я уверен, что вы, вероятно, уже исправили это, но нужно ли было указывать --experimental-specifier-resolution=node
при запуске вашего сценария?