【问题标题】:Importing React component from Node从 Node 导入 React 组件
【发布时间】:2016-07-21 07:44:11
【问题描述】:

我想在服务器端为我的 React 应用程序进行初始渲染,但是在不使用 babel/register(即 not suitable for production)之类的东西的情况下导入和使用 React 组件时遇到了麻烦。

我宁愿不必为生产编译我的服务器端代码,但希望加载一个适合节点的 React 组件以通过res.send(React.createElement(Html)) 发送到客户端。

当我运行它时,我得到...

意外的令牌

我认为这是因为我的组件渲染方法返回 <!doctype html>...</html

有没有一种方法可以让 Node 渲染一个 React 组件,而不必在部署之前使用 babel/编译代码?

【问题讨论】:

    标签: node.js reactjs


    【解决方案1】:

    有没有一种方法可以让 Node 渲染一个 React 组件而无需 在部署之前使用 babel/编译代码?

    没有。由于 JSX 不是真正的 JavaScript,因此您需要在某个时间点对其进行转译,无论是提前(在构建脚本中)还是在运行时(使用 babel-register)。

    我个人忽略了 babel 的建议,即不要在生产中使用 babel-register。它工作得很好,我总是缓存 + 主要响应,所以性能无关紧要。我很乐意听到为什么用 babel-register 进行编译是不好的。

    【讨论】:

    • 你的实现有我可以看的回购吗?我正在开发一个潜在的大型应用程序,所以我有点犹豫是否要在生产中使用它,但很想看看你是如何做到的。
    • 当然,我最终可能会将 repo 设为私有,但这里是:github.com/davidgilbertson/malla。我认为你犹豫是对的,我应该花时间找出他们不推荐它的确切原因。
    【解决方案2】:

    简短的回答,是的。

    这是来自官方文档:

    ReactDOMServer

    react-dom/server 包允许你渲染你的 服务器上的组件。

    ReactDOMServer.renderToString

    字符串 renderToString(ReactElement 元素)

    将 ReactElement 渲染为其初始 HTML。这应该只 在服务器上使用。 React 将返回一个 HTML 字符串。您可以使用 此方法在服务器上生成 HTML 并将标记发送到 更快的页面加载并允许搜索引擎的初始请求 为 SEO 目的抓取您的网页。

    如果你在一个已经有这个的节点上调用 ReactDOM.render() 服务器渲染的标记,React 将保留它并且只附加事件 处理程序,允许您进行非常高效的首次加载 经验。

    ReactDOMServer.renderToStaticMarkup

    字符串 renderToStaticMarkup(ReactElement 元素)

    类似于renderToString, 除了这不会创建额外的 DOM 属性,例如 data-react-id, React 在内部使用。如果您想将 React 用作 一个简单的静态页面生成器,因为剥离了额外的属性 可以节省很多字节。

    但是,如果你想使用 JSX,你必须使用 babel,否则,你可以使用 Reacts JS Syntax。

    这是一个示例的链接:

    https://github.com/mhart/react-server-example

    【讨论】:

    • 是否有关于如何编写非 JSX 语法的文档?或使用<!doctype...等元素的方式?
    • 我认为,我发布链接的示例显示了您需要了解的所有内容。
    • 它显示了渲染divul等的示例,但我想渲染<!doctype html>和许多其他元素。您发布的示例未涵盖此类用例。
    • @Himmel 问题是,React 中没有像 这样的组件,所有
        实际上都是 React 组件,这不是 HTML..; )
    猜你喜欢
    • 2019-05-28
    • 2022-01-14
    • 2017-01-14
    • 2019-12-22
    • 1970-01-01
    • 2021-12-14
    • 2017-04-22
    • 2020-12-03
    • 2019-06-21
    相关资源
    最近更新 更多