如何使用React.js在Sails.js上呈现服务器端模板?
我正在尝试用Sails.js和React构build一个同构的应用程序。 客户端部分很容易。 但是我遇到了服务器端渲染的问题。
当我尝试使用React服务器渲染一个* .jsx文件时,我得到了这个:
renderToString(): You must pass a valid ReactElement
我正在使用sailsjs,react和sails-hook-babel(用于ES6语法)。
./assets/components/Auth.jsx:
import React from 'react'; export class Auth extends React.Component { constructor(props) { super(props); } render() { return ( <div className='auth'> Very simple element without any logic just for test server-rendering. </div> ); } }
./api/controllers/AuthController.js:
var Auth = require('./../../assets/components/Auth.jsx'); import React from 'react'; module.exports = { render: function (req, res) { //var markup = React.renderToString( // Auth //); // This throws an error console.log(Auth); // {__esModule: true, Auth: [Function: Auth]} //res.view("layout", {app: markup}); } };
我已经尝试了ES5 / ES6语法无处不在。 每次都发生错误。 在客户端这个Auth.jsx工作正常(我使用webpack与babel-loader)。
你的问题不在于你的组件本身,而是你如何从你的模块中导出它。
当只使用export
你需要像这样导入你的模块。
import {Auth} from 'auth';
只要使用export
可以从模块中导出多于一件东西。
// My Module. export function a(x) { console.log('a'); } export function b(x, y) { console.log('b'); } import { a, b } from 'myModule';
或者你可以import * from 'myModule';
使用import * from 'myModule';
这被称为命名导出 。
您的使用案例要求的是使用export default
,它允许从您的模块导出单个对象。
export default class Auth extends React.Component {}
因此让你导入你的模块作为一个单一的对象没有大括号。
import Auth from 'auth';
然后,您需要使用JSX语法React.renderToString(<Auth />);
或者React.createElement(Auth);
您可以阅读所有有关ECMA Script 6中的模块如何工作的信息