【问题标题】:ReactDOMServer renderToStaticMarkup on Node/Express serverNode/Express 服务器上的 ReactDOMServer renderToStaticMarkup
【发布时间】:2017-06-13 17:38:14
【问题描述】:

我正在尝试创建一个服务器渲染的反应应用程序,我唯一坚持的部分是将我的组件导入我的快速服务器并将静态降价发送回给用户。基本上我现在拥有的是:

快递服务器:

const Report = require('../public/source/components/index.js').default;
....
router.get('/*', function(req, res, next) {
    var reportHTML = ReactDOMServer.renderToStaticMarkup(react.createElement(Report)))
    res.render('index', { title: 'Report' });
});

当我到达那条路线时,我收到以下错误:

Warning: React.createElement: type is invalid -- expected a string
(for built-in components) or a class/function (for composite components)
but got: object. You likely forgot to export your component from the file
it's defined in. Check the render method of `ReportApp`.
in ReportApp

我的 index.js 文件的内容,注意我去掉了很多涉及 graphql 和设置初始状态的复杂性,这就是为什么这不是一个功能组件。

import React, { Component } from 'react';
import Header from './header/Header';
import PageOneLayout from './pageOneLayout/PageOneLayout';
import styles from './main.scss';

const hexBackground = require('./assets/hex_background.png');

export default class ReportApp extends Component {
  render() {
    return (
      <div className={styles.contentArea}>
        <img src={`/build/${hexBackground}`} alt={'hexagonal background'} className={styles.hexBackground}/>
        <Header client={"client name"} />
        <div className={styles.horizontalLine}></div>
        <PageOneLayout chartData={this.state} />
      </div>
    )
  }
}

任何正确方向的指针都将不胜感激!

编辑:

这是我的 webpack:

/* eslint-disable no-console */
/* eslint-disable import/no-extraneous-dependencies */
import autoprefixer from 'autoprefixer';
import nodemon from 'nodemon';
import ExtractTextPlugin from 'extract-text-webpack-plugin';

nodemon({
    script: './bin/www',
    ext: 'js json',
    ignore: ['public/'],
});

nodemon.on('start', () => {
    console.log('App has started');
}).on('quit', () => {
    console.log('App has quit');
}).on('restart', files => console.log('App restarted due to: ', files));

export default {
    watch: true,
    entry: './public/source/main.js',
    output: { path: `${__dirname}/public/build/`, filename: 'main.js' },
    module: {
        loaders: [
            {
                test: /\.jsx?$/,
                exclude: /node_modules/,
                loader: 'babel',
                query: {
                     presets: ['react', 'es2015', 'stage-1'],
                     plugins: ['transform-decorators-legacy'],
                     cacheDirectory: true
                 }
            },
            // {
            //     test: /\.jsx?$/,
            //     exclude: /node_modules/,
            //     loader: 'eslint',
            // },
            {
                test: /\.s?css$/,
                loader: ExtractTextPlugin.extract('style-loader', 'css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!postcss-loader!sass-loader?outputStyle=expanded&sourceMap')
            },
            { test: /\.jpe?g$|\.gif$|\.png$|\.svg$|\.woff$|\.ttf$|\.wav$|\.mp3$/, loader: "file", output: {path: `${__dirname}/public/build/`, filename: 'logo.svg'}},
        ],
    },
    // eslint: {
    //     configFile: './public/.eslintrc',
    // },
    resolve: {
        modulesDirectories: ['node_modules', 'public/source'],
        extensions: ['', '.js', '.jsx'],
    },
    postcss: [
        autoprefixer,
    ],
    plugins: [
        new ExtractTextPlugin('main.css', { allChunks: true }),
    ],
};

【问题讨论】:

    标签: node.js reactjs express


    【解决方案1】:

    有几件事情需要考虑:

    • 您是否在服务器端进行任何代码转换?
    • 您是如何构建组件包的(显示配置,我假设是 webpack)?
    • 确保捆绑组件公开该组件。
    • 在这种情况下ReactDOMServer.renderToStaticMarkup(react.createElement(Report))) 不需要额外的createElement

    【讨论】:

    • 我在我的服务器上使用babel-register,否则我只是导入我的主要组件并在其上调用这些方法。我还用我的 webpack 配置更新了我原来的帖子
    • 尝试删除createElement ReactDOMServer.renderToStaticMarkup(Report))
    • 该更改产生了此错误:renderToStaticMarkup(): You must pass a valid ReactElement.
    • 我看到其他人在他们的服务器代码中使用 jsx on,不确定他们是如何实现的,但也许这可以引导我们朝着正确的方向前进?
    • 当你使用 babel-register 时,代码应该被即时编译,如果你尝试服务器端 ReactDOMServer.renderToStaticMarkup(
      Test
      );?
    猜你喜欢
    • 2014-03-29
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多