React SSR:文档未定义

2024-01-03

我已经为此工作两天了。浏览了多个堆栈帖子,仍然没有找到合适的答案。

我正在尝试在服务器中渲染我的反应项目,如下所示:

服务器.js

function handleRender(req,res){

  const sheetsRegistry = new SheetsRegistry();

  const sheetsManager = new Map();

  const theme = createMuiTheme({
    palette:{
      primary:green,
      accent: red,
      type: 'light',
    }
  })

  const generateClassName = createGenerateClassName();

  const html = ReactDOMServer.renderToString(
    <JssProvider registry={sheetsRegistry} generateClassName={generateClassName}>
      <MuiThemeProvider theme={theme} sheetsManager={sheetsManager}>
        <TwoFA />
      </MuiThemeProvider>
    </JssProvider>
  )

  const css = sheetsRegistry.toString()

  res.send(renderFullPage(html,css))
}

function renderFullPage(html,css){
  return   `
    <!DOCTYPE html>
    <html>
      <head>
        <title>2FA SDK</title>
      </head>
      <body style="margin:0">
        <div id="app">${html}</div>
        <script id="jss-server-side">${css}</script>
      </body>
    </html>
  `
}

客户端.js:

import React from 'react';
import ReactDOM from 'react-dom';
import TwoFA from './App';
import {
    MuiThemeProvider,
    createMuiTheme,
    createGenerateClassName,
  } from '@material-ui/core/styles';
import green from '@material-ui/core/colors/green';
import red from '@material-ui/core/colors/red';

class Main extends React.Component{
    componentDidMount() {
        const jssStyles = document.getElementById('jss-server-side');
        if (jssStyles && jssStyles.parentNode) {
          jssStyles.parentNode.removeChild(jssStyles);
        }
    }

    render(){
        return <TwoFA />
    }
}

const theme = createMuiTheme({
    palette: {
      primary: green,
      accent: red,
      type: 'light',
    },
  });

const generateClassName = createGenerateClassName();

if (typeof window !== 'undefined'){
    ReactDOM.hydrate(
        <JssProvider generateClassName={generateClassName}>
          <MuiThemeProvider theme={theme}>
              <TwoFA/>
          </MuiThemeProvider>
        </JssProvider>,
        document.querySelector('#app'),
    );
}

Webpack.config.js

module.exports = [
    {
        /*Config for backend code*/ 
        entry: './src/server/server.js',
        output: {
            filename: 'server.js'
        },
        externals: [nodeExternals()],
        module: {
            rules: [
                {
                    test: /\.(js|jsx)$/,
                    exclude: /node_modules/,
                    use: {
                        loader: "babel-loader"
                    }
                },
                {
                    test: /\.html$/,
                    use: {
                        loader: "html-loader",
                        options: { minimize: true }
                    }
                },
                {
                    test: /\.css$/,
                    use: [MiniCssExtractPlugin.loader,"css-loader"]
                }
            ]
        },
        plugins: [
            new HtmlWebPackPlugin({
                template: "./public/index.html",
                filename:"./index.html"
            }),
            new MiniCssExtractPlugin({
                filename: "[name].css",
                chunkFilename:"[id].css"
            })
        ]
    },
    { 
        entry: './src/client.js',
        output: {
           filename: 'bundle.js',
        },
        module: {
           rules: [
                {
                    test: /\.js$/,
                    exclude: /node_modules/,
                    loader: 'babel-loader',
                },
                {
                    test: /\.html$/,
                    use: {
                        loader: "html-loader",
                        options: { minimize: true }
                    }
                },
                {
                    test: /\.css$/,
                    use: [MiniCssExtractPlugin.loader,"css-loader"]
                }
            ],
        },
        plugins: [
            new HtmlWebPackPlugin({
                template: "./public/index.html",
                filename:"./index.html"
            }),
            new MiniCssExtractPlugin({
                filename: "[name].css",
                chunkFilename:"[id].css"
            })
        ]
    }
]

我尝试过的:我搜索了SO,发现很多帖子建议像这样进行条件检查:if (typeof window !== 'undefined')。然而,这并不能解决问题。

我还了解到该错误是由于在SSR期间,服务器端没有document项目。

我在 github 问题页面上搜索过,有人提到他遇到了 webpack 的问题,但同一个项目在 browserify 上运行得很好。

我需要什么帮助:我正在尝试解决这个问题,因为它会导致应用程序崩溃。

我怀疑是webpack有问题。我正在寻找解决这个问题的方法


这个问题通常是因为在服务器上渲染react时发生的。它在服务器端没有文档或窗口对象,并且这些对象仅在浏览器上可用。

尝试在以下位置或之后调用文档函数componentDidMount.

componentDidMount(){
  this.setState({documentLoaded:true});
}

someFunction(){
  const { documentLoaded } = this.state;
  if(documentLoaded){
     // LOGIC USING DOCUMENT OBJECT
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React SSR:文档未定义 的相关文章

随机推荐

  • 如何将西里尔字母音译为拉丁文本

    我有一种方法可以将任何拉丁文本 例如英语 法语 德语 波兰语 转换为其 slug 形式 e g Alpha Bravo Charlie gt alpha bravo charlie 但它不适用于西里尔文文本 例如俄语 所以我想做的是将西里尔
  • Java库为Postgres COPY编写二进制格式?

    有没有人遇到过 Java 库 或只是一些代码 来编写binaryPostgres 使用的格式复制命令 http www postgresql org docs 9 2 interactive sql copy html AEN66736 它
  • 在keras中模型预测后如何恢复原始值?

    这是一个更概念性的问题 但我必须承认我已经处理它有一段时间了 假设您想使用 keras 等来训练神经网络 NN 由于建议您在训练之前对数据进行标准化或标准化 因此 例如 通过标准化 x new x old mean standarddev
  • ISO 国家/货币数据

    All 我们的应用程序需要有关 ISO 国家和货币的数据 其中数据必须是最新的 我们确实从 ISO 本身购买了国家 货币数据 但是我们仍然需要对数据执行大量手动操作 以及编写我们自己的工具来读取数据并将其处理到我们的数据库中 我们是否会以错
  • 资产目录错误:CUICatalog:找不到名称的再现

    突然之间 虽然我没有发生明显的变化 但我现在从资产目录中的图像中收到以下错误 2013 10 30 14 44 46 629 MyApp 38590 a0b CUICatalog Can t find rendition for name
  • 句柄、指针和引用之间有什么区别

    句柄与指向对象的指针有何不同 为什么我们不能拥有对引用的引用 句柄通常是一个opaque对一个对象的引用 句柄的类型与引用的元素无关 例如 考虑由返回的文件描述符open 系统调用 类型是int但它代表打开文件表中的一个条目 表中实际存储的
  • 如何访问 webrick 提供的 .rhtml 页面的 html 请求参数?

    我正在使用 webrick 内置的 ruby 网络服务器 来提供 rhtml 文件 嵌入 ruby 代码的 html 就像 jsp 它工作正常 但我不知道如何访问参数 例如 http localhost mypage rhtml foo b
  • 在 Visual Studio 2013 中生成单元测试报告

    我在 Visual Studio 2013 的 C 项目中有一组单元测试 有没有办法从单元测试结果生成报告 我需要一份报告作为测试运行时间和结果的证据 我不是指在线 CI 服务器报告 而是指本地文件报告 VS2013有什么好的插件吗 我调查
  • 在 cygwin 上安装 Poppler

    我刚刚下载了 Poppler 0 16 5 但我对如何在 cygwin 上安装这个包一无所知 谁能告诉我安装 poppler 的正确命令是什么 实际上 Cygwin 1 7 17 1 中有一个 poppler 包 Run setup exe
  • 如何使 Pygame 零窗口全屏?

    我正在使用易于使用的 Python 库 pgzero 它使用pygame内部 用于游戏编程 如何让游戏窗口全屏显示 import pgzrun TITLE Hello World WIDTH 800 HEIGHT 600 pgzrun go
  • MassTransit 与非 .NET 服务的互操作性

    我一直在使用 MassTransit 并且非常喜欢它 但是 默认情况下 它使用 MassTransit 特有的一些 JSON 包装所有 RabbitMQ 有效负载 消息 这使得与非 NET 服务交换消息变得困难 我知道 JSON 可以用任何
  • 启用远程 JMX 后,Cassandra“nodetool status”失败并显示“Credentials required”

    我按照 启用 JMX 身份验证 的说明进行操作 http docs datastax com en cassandra 2 2 cassandra configuration secureJmxAuthentication html htt
  • java中如何停止、暂停、取消线程

    我正在用java开发一个应用程序 它启动一些线程来执行一些工作并更新JTable with a JProgressBar 我开发了一个JPopupMenu on the JTable有一些JMenuItem Pause Stop Cance
  • 将 AndroidAnnotations 与 Scala 和 Gradle 结合使用

    是否可以将 AndroidAnnotations 与 Scala 编程语言和 Gradle 构建系统一起使用 当我尝试将 AndroidAnnotations 集成到现有的 Android Scala Gradle 项目中时 编译失败 因为
  • 通过提交消息搜索 Gerrit

    我们的团队使用的标准是在所有提交消息前加上 bz12345 前缀 其中 12345 被您正在处理的错误替换 我希望能够搜索具有该错误编号的所有提交 我读了http gerrit googlecode com svn documentatio
  • 如何删除 LISP 中的嵌套括号

    如何在 Common LISP 中递归地删除嵌套括号 例如 unnest a b c d e f g gt a b c d e f g unnest a b gt a b unnest a gt a Thanks 这就是我要做的 ql qu
  • Google App Engine 和 Google Sheets 超出软内存限制

    我正在编写一个简单的服务 从多个来源获取数据 将其组合在一起 然后使用 Google API 客户端将其发送到 Google Sheet Easy peasy 效果不错 数据不是那么大 问题是在构建 api 服务后调用 spreadshee
  • Java中如何比较两个双精度值?

    在 Java 中对两个双精度值进行简单比较会产生一些问题 让我们考虑以下 Java 中的简单代码片段 package doublecomparision final public class DoubleComparision public
  • 集成服务目录文件夹权限已更改

    问 SSISDB 或 MSDB 中的任何 SQL Server 系统表是否包含可让我发现哪些用户正在对 Integration Services 目录中的文件夹权限进行更改的信息 背景 我发现 SQL 代理作业失败 错误描述如下 无法访问该
  • React SSR:文档未定义

    我已经为此工作两天了 浏览了多个堆栈帖子 仍然没有找到合适的答案 我正在尝试在服务器中渲染我的反应项目 如下所示 服务器 js function handleRender req res const sheetsRegistry new S