Ответ 1
Если вы хотите использовать static-site-generator-webpack-plugin, вам сначала нужно собрать пакет с webpack bundle.js
, который экспортирует функцию рендеринга, которая принимает следующие аргументы.
-
locals
объект с различными метаданными страницы, например.title
, которые входят в параметры компонента (традиционно считаются шаблонами). -
callback
обратный вызов nodejs style(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 Router, если хотите) и визуализируйте их с помощью 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
внутри, будут присутствовать в параметре locals
для каждого вызова render(locals, callback)
. Они будут объединены с path
, assets
и webpackStats
ключами, предоставляемыми плагином.
Если вы хотите загрузить javascript-код на свои страницы после рендеринга, вы можете скомпилировать дополнительную запись page.js
в конфигурацию вашего веб-пакета, которая называет ReactDOM.render()
типичным образом, а затем загружает этот пакет в тег script
, испускаемый в вашей функции render(locals, callback)
в вашем bundle.js
(см. выше). Убедитесь, что page.js
монтирует компоненты в том же месте в DOM, что и при визуализации entry.js
(вы, вероятно, установите атрибут id
в родительском элементе). Вам также необходимо убедиться, что все зависимые переменные местоположения (то есть пути маршрута) выравниваются в обеих средах.
Проверьте исходный код Gatsby, который также использует этот плагин. Вы также можете посмотреть исходный код Phenomic для альтернативного подхода.