Генератор статических сайтов, который напрямую отображает React в HTML (без React на выходе)?

Могут ли Гэтсби или Джекилл или любые другие генераторы статических сайтов преобразовать сайт, созданный React, в чисто статический HTML? Я ищу хост на S3/CloudFront или аналогичном, а также практически не получаю JS на выходе.

В основном я хочу создать статический веб-сайт, но хотел бы использовать React в качестве инструмента разработки, чтобы воспользоваться преимуществами многократно используемых компонентов пользовательского интерфейса. Фактическое взаимодействие во время выполнения минимально и может выполняться без React во время выполнения.

Я посмотрел на реактивно-статический, который кажется именно тем, что я ищу, но отображаемые html-страницы по-прежнему ссылаются и загружают библиотеку React.

С моими минимальными потребностями я, вероятно, мог бы создать свою собственную вещь, чтобы создать каждую страницу как отдельный SPA React, а затем использовать ReactDOMServer для рендеринга каждой из них в статический файл HTML. Я смотрю, есть ли более простые/лучшие варианты.

🤔 А знаете ли вы, что...
React предоставляет механизм для управления формами и валидации данных.


449
2

Ответы:

Решено

Вы можете использовать pupeteer для получения HTML-кода любой веб-страницы, включая SPA. Или используйте rendertron, который использует pupeteer внизу. Еще один — react-snap, который будет сканировать вашу сеть при сборке и создавать html для каждой страницы.


С Гэтсби, конечно, можно. У Гэтсби есть html.js, который служит шаблоном для всех сгенерированных страниц. Вы можете просто удалить javascript Гэтсби из этого 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 в разработке, но сгенерированные HTML-файлы не будут включать сценарии, созданные React и webpack.

Более тщательным подходом было бы перебрать postBodyComponents и удалить только тег script, который ссылается на common.js, но в большинстве случаев я думаю, что это будет нормально.


Это определенно противоречит цели Gatsby, у которого есть свои собственные соглашения и сложный процесс, чтобы он мог создавать прогрессивное веб-приложение. В вашем случае, если вы еще не знакомы с Гэтсби, возможно, было бы проще создать свой собственный SSR. Мой ответ только для того, чтобы показать, возможно ли это с Гэтсби или нет.