有没有办法直接在 HTML 入口点中预生成(单路由)React 应用程序的 HTML 结构?
然后页面将能够在加载任何 JS 之前显示 HTML(基于 React 初始状态)。
我实际上使用的是webpack-html-loader,但欢迎使用任何其他加载器或插件;)
PS:static-site-generator-webpack-plugin有什么帮助吗?
PS:我没有使用 React Router
有没有办法直接在 HTML 入口点中预生成(单路由)React 应用程序的 HTML 结构?
然后页面将能够在加载任何 JS 之前显示 HTML(基于 React 初始状态)。
我实际上使用的是webpack-html-loader,但欢迎使用任何其他加载器或插件;)
PS:static-site-generator-webpack-plugin有什么帮助吗?
PS:我没有使用 React Router
如果你想使用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 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
您在in 中指定的键webpack.config.js
将出现在locals
每次调用的参数中render(locals, callback)
。它们将与插件提供的path
,assets
和键合并。webpackStats
如果您想在渲染后将 javascript 代码加载到您的页面中,您可以page.js
在您的 webpack 配置中编译一个附加条目,该条目以ReactDOM.render()
典型方式调用,然后将该包加载到您的函数中script
发出的标记中(如上)。确保将组件安装到 DOM 中与渲染时相同的位置(您可能会在父元素上设置属性)。您还需要确保任何位置(即路由路径)因变量在两种环境中都对齐。render(locals, callback)
bundle.js
page.js
entry.js
id
在这里,您有一个工作示例https://github.com/angglada/preact-minimal/blob/master/config/webpack.config.js,如果您愿意,可以分叉它并看看它是如何一起工作的。
希望能帮助到你 :)
Jekyll是很棒的静态站点生成器,可以使用自定义 ruby 插件进行扩展。您需要启用WebPack才能进行Jekyll调用。请参阅将 Webpack 插入 Jekyll 支持的页面