直接将 React 呈现为 HTML 的静态站点生成器(输出中没有 React)?
Static site generator that renders React to HTML directly (no React in output)?
Gatsby or Jekyll 或任何其他静态网站生成器能否将 React 创作的网站呈现为纯静态 HTML?我希望在 S3/CloudFront 或类似平台上托管,并且输出中几乎没有 JS。
基本上我想创建一个静态网站,但想使用 React 作为开发工具来利用可重用的 UI 组件。实际的运行时交互是最小的,可以在运行时不使用 React 来完成。
我查看了 react-static,这似乎正是我要找的东西,但呈现的 html 页面仍然引用并加载 React 库。
根据我的最低需求,我可能会自己动手将每个页面创建为单独的 React SPA,然后使用 ReactDOMServer
将每个页面呈现为静态 HTML 文件。我正在查看是否有 simpler/better 个选项。
您可以使用 pupeteer 获取任何网页的呈现 html,包括 SPA。或者使用 rendertron,它在下面使用 pupeteer。
另一个是 react-snap,它将在构建时抓取您的网络并为每个页面创建 html。
有了 Gatsby,当然可以。 Gatsby 有一个 html.js
作为所有生成页面的模板。您可以简单地从 html.
中删除 Gatsby 的 javascript
/* Generated html */
...
<body>
<div id="___gatsby">...</div>
<script src="/common.js"></script> <-- remove this
</body>
首先复制默认的html到你的src:
cp .cache/default-html.js src/html.js
然后,编辑这一行:
/* src/html.js */
<body {...this.props.bodyAttributes}>
{this.props.preBodyComponents}
<div
key={`body`}
id="___gatsby"
dangerouslySetInnerHTML={{ __html: this.props.body }}
/>
- {this.props.postBodyComponents}
+ {process.env.NODE_ENV !== 'production' && this.props.postBodyComponents}
</body>
这确保您仍然可以在开发中使用 gatsby 的热重载,但生成的 htmls 将不包括 React 和 webpack 生成的脚本。
一种更细致的方法是遍历 postBodyComponents
并只删除 link 到 common.js
的脚本标记,但对于大多数情况,我认为它会很好。
这显然违背了 Gatsby 的目的,Gatsby 有自己的约定和复杂的过程,因此它可以生成渐进式 Web 应用程序。对于您的情况,如果您还不熟悉 Gatsby,那么推出自己的 SSR 可能会更简单。我的回答只是为了说明是否可以使用 Gatsby。
Gatsby or Jekyll 或任何其他静态网站生成器能否将 React 创作的网站呈现为纯静态 HTML?我希望在 S3/CloudFront 或类似平台上托管,并且输出中几乎没有 JS。
基本上我想创建一个静态网站,但想使用 React 作为开发工具来利用可重用的 UI 组件。实际的运行时交互是最小的,可以在运行时不使用 React 来完成。
我查看了 react-static,这似乎正是我要找的东西,但呈现的 html 页面仍然引用并加载 React 库。
根据我的最低需求,我可能会自己动手将每个页面创建为单独的 React SPA,然后使用 ReactDOMServer
将每个页面呈现为静态 HTML 文件。我正在查看是否有 simpler/better 个选项。
您可以使用 pupeteer 获取任何网页的呈现 html,包括 SPA。或者使用 rendertron,它在下面使用 pupeteer。 另一个是 react-snap,它将在构建时抓取您的网络并为每个页面创建 html。
有了 Gatsby,当然可以。 Gatsby 有一个 html.js
作为所有生成页面的模板。您可以简单地从 html.
/* Generated html */
...
<body>
<div id="___gatsby">...</div>
<script src="/common.js"></script> <-- remove this
</body>
首先复制默认的html到你的src:
cp .cache/default-html.js src/html.js
然后,编辑这一行:
/* src/html.js */
<body {...this.props.bodyAttributes}>
{this.props.preBodyComponents}
<div
key={`body`}
id="___gatsby"
dangerouslySetInnerHTML={{ __html: this.props.body }}
/>
- {this.props.postBodyComponents}
+ {process.env.NODE_ENV !== 'production' && this.props.postBodyComponents}
</body>
这确保您仍然可以在开发中使用 gatsby 的热重载,但生成的 htmls 将不包括 React 和 webpack 生成的脚本。
一种更细致的方法是遍历 postBodyComponents
并只删除 link 到 common.js
的脚本标记,但对于大多数情况,我认为它会很好。
这显然违背了 Gatsby 的目的,Gatsby 有自己的约定和复杂的过程,因此它可以生成渐进式 Web 应用程序。对于您的情况,如果您还不熟悉 Gatsby,那么推出自己的 SSR 可能会更简单。我的回答只是为了说明是否可以使用 Gatsby。