用于搜索引擎的 ReactJS 服务器端异步
ReactJS server side async for search engines
我正在使用 ReactJS + Router 呈现我的网站服务器端
我的许多组件都会调用 REST 来生成内容。此内容不会作为 HTML 服务器端发送,因为它是异步调用。
可能如下所示的组件:
import React from 'react'
import ReactDOM from 'react-dom'
// Imports omitted
export default class MyPage extends React.Component {
constructor() {
super();
this.state = {items: []};
fetch("http://mywebservice.com/items").then((response) => {
response.json().then((json) => {
this.setState({items: json.items})
}).catch((error) => {});
});
}
render() {
if (this.state.items && this.state.items.length > 0) {
var rows = [];
// Go through the items and add the element
this.state.items.forEach((item, i) => {
rows.push(<div key={item.id}></div>);
});
return <div>
<table>
{rows}
</table>
</div>;
}
else {
return <span>Loading...</span>
}
}
}
搜索引擎会索引 "Loading..." 而我显然希望我的元素(项目)被索引。有办法解决吗?
理论上,我认为为了完成您需要在服务器端请求处理程序,收集所有必要的数据并将其作为初始状态 JSON 字符串传递给 ReactDOM.RenderToString()
,然后创建自定义fetch()
将检查初始数据是否存在,如果存在则立即呈现 html。
redux 如此受欢迎的原因之一是它强制执行数据分离。理想情况下,您可以在一个地方指定应用程序需要呈现的所有数据。在 redux 中,这将是一个商店,但我们假设您将所有数据存储在最顶层元素的 props 中。如果是这种情况,您需要做的就是为最顶层的元素提供所有相关的道具,它会很好地呈现所有内容。收集所有所需数据的方式取决于服务器。我建议从当前 url 和登录用户信息(无论是令牌还是 cookie)中获取线索。
结账 react-async
(https://www.npmjs.com/package/react-async) or react-async-render
(https://www.npmjs.com/package/react-async-render)
听起来这正是您所需要的。
我正在使用 ReactJS + Router 呈现我的网站服务器端 我的许多组件都会调用 REST 来生成内容。此内容不会作为 HTML 服务器端发送,因为它是异步调用。
可能如下所示的组件:
import React from 'react'
import ReactDOM from 'react-dom'
// Imports omitted
export default class MyPage extends React.Component {
constructor() {
super();
this.state = {items: []};
fetch("http://mywebservice.com/items").then((response) => {
response.json().then((json) => {
this.setState({items: json.items})
}).catch((error) => {});
});
}
render() {
if (this.state.items && this.state.items.length > 0) {
var rows = [];
// Go through the items and add the element
this.state.items.forEach((item, i) => {
rows.push(<div key={item.id}></div>);
});
return <div>
<table>
{rows}
</table>
</div>;
}
else {
return <span>Loading...</span>
}
}
}
搜索引擎会索引 "Loading..." 而我显然希望我的元素(项目)被索引。有办法解决吗?
理论上,我认为为了完成您需要在服务器端请求处理程序,收集所有必要的数据并将其作为初始状态 JSON 字符串传递给 ReactDOM.RenderToString()
,然后创建自定义fetch()
将检查初始数据是否存在,如果存在则立即呈现 html。
redux 如此受欢迎的原因之一是它强制执行数据分离。理想情况下,您可以在一个地方指定应用程序需要呈现的所有数据。在 redux 中,这将是一个商店,但我们假设您将所有数据存储在最顶层元素的 props 中。如果是这种情况,您需要做的就是为最顶层的元素提供所有相关的道具,它会很好地呈现所有内容。收集所有所需数据的方式取决于服务器。我建议从当前 url 和登录用户信息(无论是令牌还是 cookie)中获取线索。
结账 react-async
(https://www.npmjs.com/package/react-async) or react-async-render
(https://www.npmjs.com/package/react-async-render)
听起来这正是您所需要的。