【问题标题】:Initial static React HTML rendering with Webpack使用 Webpack 进行初始静态 React HTML 渲染
【发布时间】:2017-06-20 01:38:41
【问题描述】:

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

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

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

PS:请问static-site-generator-webpack-plugin有什么帮助吗?

PS:我没有使用 React Router

【问题讨论】:

  • 你试过服务端渲染吗?
  • @Bezzi 你能更明确一点吗?就像共享 webpack.config :D 我需要在构建时生成静态 HTML
  • 只有在整个页面是静态的情况下才能执行此操作。没有与 API 通信?

标签: reactjs webpack webpack-html-loader


【解决方案1】:

如果你想使用 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() 渲染它们。

然后,您将在 StaticSiteGeneratorPlugin 的实例化中将编译后的 bundle.js 指定为 bundle,并在 pathslocals 中指定包含上述元数据值的对象。

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)
  ]
}

您为webpack.config.js 中的locals 指定的键将出现在每次调用render(locals, callback)locals 参数中。它们将与插件提供的pathassetswebpackStats 键合并。

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

查看Gatsby 的源代码,它也使用了这个插件。您还可以查看Phenomic 的源代码以了解替代方法。

【讨论】:

    【解决方案2】:

    您应该尝试服务器端渲染,它会让 React 在后端渲染您应用的第一个视图并提供静态 HTML。 This boilerplate 已经带有服务器渲染设置,您可以了解更多信息here

    【讨论】:

    • 当然可以,但是我需要以完全静态的方式(没有快递).. 初始 HTML 渲染应该在构建时进行(运行 webpack 时).. 有什么可以分享的例子吗?
    【解决方案3】:

    Jekyll 是很棒的静态站点生成器,可以使用自定义 ruby​​ 插件进行扩展。您需要启用 WebPack 来进行 Jekyll 调用。见Plugging Webpack to Jekyll Powered Pages

    【讨论】:

      【解决方案4】:

      这里有一个工作示例 https://github.com/aganglada/preact-minimal/blob/master/config/webpack.config.js,如果你愿意,可以分叉它,看看它是如何一起工作的。

      希望对你有帮助:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 2019-07-08
        • 2016-04-03
        • 2018-07-23
        • 2017-10-12
        • 2018-08-24
        • 1970-01-01
        相关资源
        最近更新 更多