javascript - 在 ES6 中导入用于服务端渲染的组件

标签 javascript node.js reactjs ecmascript-6

我有一个不错的小 ES6 React 组件文件(针对此说明进行了简化)。它使用特定于浏览器的库,store这一切都在浏览器上运行得很漂亮:

/app/components/HelloWorld.js:

import React, { Component } from 'react';
import store from 'store';

export default class HelloWorld extends Component {
  componentDidMount() {
    store.set('my-local-data', 'foo-bar-baz');
  }

  render() {
    return (
      <div className="hello-world">Hello World</div>
    );
  }
}

现在我正尝试使用 babel-register 让它在服务器上呈现如下所示:

/server/routes/hello-world.js:

import React from 'react';
import ReactDOMServer from 'react-dom/server';
import HelloWorld from '../../app/components/HelloWorld'

export default function(req, res) {
  res.render('root', {
    reactHTML: ReactDOMServer.renderToString(<HelloWorld />),
  });
}

由于导入“商店”,我从 Node 服务器收到一条错误消息,提示“窗口未定义”。理想情况下,我可以通过检测环境( Node 与浏览器)有条件地导入,但 ES6 不支持条件导入。

解决这个问题的最佳方法是什么?我实际上不需要执行浏览器代码(在这种情况下 componentDidMount 不会被 ReactDOMServer.renderToString 调用)只是让它从 Node 运行。

最佳答案

一种方法是使用 babel-rewire-plugin .您可以通过 plugins 选项将其添加到 babel-register

require('babel/register')({
  plugins: ['babel-rewire-plugin']
});

然后将您的 store 依赖项重新连接到模拟商店:

HelloWorld.__Rewire__('store', {
  set: () => {} // no-op
});

您现在可以从服务器和平地渲染 HelloWorld。

关于javascript - 在 ES6 中导入用于服务端渲染的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34100730/

相关文章:

javascript - 通量分页

javascript - 下载 csv 文件在 Internet Explorer 11 中不起作用,它将页面重定向到另一个页面(无法显示网页)

javascript - 从 maxCDN 在 Node 应用程序中提供静态文件

javascript - 多选reactjs handlechange

json - 找不到为 laravel windows 执行 gulp 的模块

node.js - 在 Jade 中调用 mixin 时, "+"和 mixin 关键字有什么区别?

javascript - React 组件 - 去抖

javascript - 使用 javascript 链接中的文本设置输入值

javascript - 对象传播错误导致没有消息属性

javascript - TCP异常断开如何处理?