适用于 Medium 等网站的 ReactJS - 服务器端渲染

ReactJS for Websites like Medium - Server-Side Rendering

我正在尝试实施一个类似于 Medium.com 的简单项目。我的项目是用 ReactJS 构建的。我的问题是元标记和 SEO。我知道在客户端修改元标记(例如使用 react-helmet)是不可取的,因为网络爬虫还没有考虑到这一点。

我现在正在探索 Gatsby 和 Next.js。我知道我有两个选择:

对于类似于 Medium 的网站,我认为每次创建新的 post 或更改 post 只是为了显示向观众展示静态内容。比如说,我已经有数百万个博客 post,构建它需要一段时间,而且我无法在每次有人创建 post.

时构建应用程序

如果我在每个请求上渲染一个 post,如果一个 post 非常受欢迎并且有数百万人观看并且这个 post 只被修改一次,那也不值得。

有什么我想念的吗?我目前更倾向于根据每个请求进行渲染。

编辑: 我现在计划在每个请求上并行使用缓存和渲染。

编辑 2: 我被禁止回答问题。所以我会在这里添加我的答案:

..下面的答案..

我对 Next.js 做了更多的研究。显然,Next.js' 具有fallback 的特性,用于静态生成页面。这将解决我在任何时间点添加更多页面的问题。有关详细信息,请参阅此 link。根据文档,它指出:

此外,我了解到 Next.JS 引入了一项名为 Incremental Static Regeneration 的新功能。因此,每当我们使页面无效时,它会在更新页面时继续提供旧页面。这样,如果某个页面上有更新,我就不必构建整个应用程序。它只会重建页面。截至 post,它仍处于测试阶段。详情可见here.

创建站点地图并定期更新(例如:一天一次)是使站点内容搜索引擎友好的最简单方法之一。

需要使用服务器端脚本创建和更新站点地图。

'sitemap-generator' 是 npm 上的一个很好的实用程序,用于生成站点地图。

可以使用以下方式安装:

$ npm install -g sitemap-generator

更多信息:

https://www.npmjs.com/package/sitemap-generator

  1. React Helmet 也可以在服务器端使用,不需要任何框架。 您可能需要使用

Helmet.renderStatic() after ReactDOMServer.renderToString or ReactDOMServer.renderToStaticMarkup to get the head data for use in your prerender.

Helmet

  1. 您可以维护 HTML 的缓存(避免为每个请求构建页面,至少对于重要文章),使用服务器端呈现构建一次。如果文章有任何更改,请清除缓存。
  2. 您可以使用 API 对文章进行更改,对更改文章的后续请求将反映更改(考虑到您网站的动态性质)。

其他答案是在解决您关于元数据的问题,但我觉得您的问题主要是“预呈现和提供静态 HTML(Jamstack 方法)或更确切地说是在每个请求上动态呈现页面是否有意义?

如果您有一个高度动态的网站,需要经常更新(比如说超过每小时一次),您应该选择动态的服务器端呈现。不过,在预渲染时更容易获得良好的性能,因此如果不经常更新对您有用,那么它是更好的解决方案。

建立一个拥有数千页的网站至少需要几分钟。如果您同意该站点仅每天更新,那很好,然后预渲染是一个很好的方法。如果您期望比这更频繁地更新内容,那不是。