2017-02-02 3 views
10

Есть ли способ предварительно сгенерировать структуру HTML (одного маршрута). Заменить приложение непосредственно в точке ввода HTML?Исходный статический анализ HTML-рендеринга с помощью Webpack

Затем страница сможет отображать HTML (на основе исходного состояния React) до загрузки любого JS.

Я на самом деле с помощью webpack-html-loader но и любой другой загрузчик или плагин приветствуется;)

PS: Может static-site-generator-webpack-plugin быть какой-либо помощи?

PS: Я не использую Реагировать маршрутизатором

+0

Вы пробовали рендеринг на стороне сервера? – Bezzi

+0

@Bezzi Можете ли вы быть более явным? Как и совместное использование файла webpack.config: D Мне нужно создать статический HTML во время сборки –

+0

Вы можете сделать это только в том случае, если ваша страница целиком статична. Нет связи с API? – Fyre

ответ

2

Вы должны попробовать на стороне сервера визуализации, это позволит реагировать Оказать неотложную вид вашего приложения в интерфейсе и поставить статический HTML. This boilerplate уже поставляется с сервером рендеринга настройки, и вы можете узнать больше об этом here

+0

Конечно, но мне это нужно в полном статическом режиме (без экспресс). Начальный HTML-рендеринг должен происходить один, во время сборки (при запуске webpack). Любой пример для обмена? –

7

Если вы хотите использовать static-site-generator-webpack-plugin вам сначала нужно построить связку с WebPack bundle.js, который экспортирует функцию визуализации, которая принимает следующие аргументы.

  • locals объект с различными метаданными страницы, например. title, которые входят в параметры компонента (традиционно считаются переменными шаблона).
  • callback nodejs стиль (err, result) обратного вызова, который вы будете называть с оказанной HTML в качестве значения для result

например

// entry.js, compiled to bundle.js by webpack 

module.exports = function render(locals, callback) { 
    callback(null, 
     '<html>' + locals.greet + ' from ' + locals.path + '</html>'); 
}; 

Именно в этой функции, что вы будете создать экземпляр компоненты (возможно, с помощью React маршрутизатора, если вы хотите) и сделать их с ReactDOMServer.renderToString().

Вы затем указать скомпилированный bundle.js как bundle в вашем конкретизации StaticSiteGeneratorPlugin, а также ваши конкретные маршруты в paths и в locals объект, содержащий вышеуказанные значения метаданных.

var paths, locals; // compute paths from metadata files or frontmatter 

module.exports = { 
    entry: { 
    bundle: './entry.js' // build bundle.js from entry.js source 
    }, 
    ..., 
    plugins: [ 
    new StaticSiteGeneratorPlugin('bundle', paths, locals) 
    ] 
} 

Ключи вы указываете для locals в webpack.config.js в будет присутствовать в параметре каждого вызова render(locals, callback)locals. Они будут объединены с path, assets и webpackStats ключами, предоставляемыми плагином.

Если вы хотите загрузить яваскрипт кода на свои страницы после рендеринга вы могли бы составить дополнительную page.js запись в свой WebPack конфигурацию, которая вызывает ReactDOM.render() в обычном режиме, а затем загрузить пакет в script теге, излучаемого в вашей render(locals, callback) функции в ваш bundle.js (выше). Убедитесь, что page.js монтирует компоненты в том же месте в DOM, что и при визуализации entry.js (вы, вероятно, установите атрибут id на родительский элемент). Вам также необходимо убедиться в том, что любые зависимые от местоположения местоположения (то есть маршруты) выровнены в обеих средах.

Проверьте исходный код Gatsby, который также использует этот плагин.Вы также можете посмотреть исходный код для Phenomic для альтернативного подхода.

0

Jekyll велик статический сайт генератор, который может быть расширен с пользовательских плагинов рубина. Вам необходимо активировать WebPack сделать Jekyll calls. См. Plugging Webpack to Jekyll Powered Pages