使用Webpack进行初始静态React HTML渲染

Yve*_* M. 10 reactjs webpack webpack-html-loader

有没有办法直接在HTML入口点预生成(单个路由)React应用程序的HTML结构?

然后,在加载任何JS之前,页面将能够显示HTML(基于React初始状态).

我实际上正在使用webpack-html-loader,但欢迎任何其他加载器或插件;)

PS:可以使用static-site-generator-webpack-plugin吗?

PS:我没有使用React Router

Fra*_*son 9

如果你想使用static-site-generator-webpack-plugin,你首先需要使用webpack构建一个bundle,bundle.js它导出一个带有以下参数的render函数.

  • locals具有各种页面元数据的对象,例如title,进入组件参数(传统上被认为是模板变量).
  • callback(err, result)您将使用渲染的html作为值调用的nodejs样式回调result

例如

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

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

在此函数中,您将实例化组件(如果需要,可以通过React Router)并使用它们进行渲染ReactDOMServer.renderToString().

然后,您将指定编译bundle.jsbundle您的实例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)
  ]
}
Run Code Online (Sandbox Code Playgroud)

您指定的键localswebpack.config.js将存在于locals每个调用的参数render(locals, callback).他们将被合并path,assetswebpackStats通过插件提供的密钥.

如果你想在渲染后将javascript代码加载到你的页面中,你可以编译一个额外的page.js条目到你的webpack配置,ReactDOM.render()以典型的方式调用,然后将该包加载到script你的render(locals, callback)函数中发出的标记中bundle.js(上图).确保将page.js组件安装到DOM中与呈现时相同的位置entry.js(您可能会id在父元素上设置属性).您还需要确保任何位置(即路径路径)因变量在两个环境中都对齐.

查看Gatsby的源代码,该代码也使用此插件.您还可以查看Phenomic的源代码以获得替代方法.


小智 2

您应该尝试服务器端渲染,它会让 React 在后端渲染应用程序的第一个视图并提供静态 HTML。该样板已附带服务器渲染设置,您可以在此处了解更多信息