Node.js: Не удается найти модуль react-dom/сервер

#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 при запуске вашего сценария?

См. раздел Настройка алгоритма разрешения спецификатора ESM