编程语言
首页 > 编程语言> > javascript – 反应JS服务器端问题 – 找不到窗口

javascript – 反应JS服务器端问题 – 找不到窗口

作者:互联网

嗨,我正在尝试在reactJS项目中使用react-rte.我有服务器端渲染,每次我想使用这个包我得到:

return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
                               ^
ReferenceError: window is not defined

我想问题可能是同构工具,但我不知道如何将包导入到已经定义窗口的客户端.

解决方法:

如果您正在进行服务器端渲染,那么全局窗口对象很可能是未定义的,因为这只是客户端会理解的内容.

Note: Initially, when you start up your project its going to render out a complete string of your DOM (at this point it will not know about window because it is server side, but then re-render with the client-side code to which your window object will be available!

我在这种情况下使用了一种解决方法.这就是我的webpack插件所拥有的:

new webpack.DefinePlugin({
  'process.env.NODE_ENV': isDevelopment ? '"development"' : '"production"',
  'process.env.BROWSER': JSON.stringify(true),
  __DEV__: isDevelopment
}),

所以我使用process.env.BROWSER对我有利,因为如果它是服务器端,它将被定义为undefined,如果客户端完成渲染,它将是真的.

因为当服务器端没有窗口对象时,一切都停止工作,我们可以添加:

const mySpecialWindowFunction = () => {

  /* START HACK */
  if (!process.env.BROWSER) {
    global.window = {}; // Temporarily define window for server-side
  }
  /* END HACK */

  return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
};

这样,你的控制台就不会对你尖叫,也不会停止服务器端渲染,现在你可以继续光荣的一天!虽然我不得不承认这有点像Hacky,但它完成了工作,因为我们想做的就是让服务器端渲染出初始的DOM字符串,然后让客户端接管.

Also Note: Don’t worry about setting window as an empty object, it will be back to normal once the client-side finishes rendering.

标签:javascript,reactjs,webpack,serverside-rendering,draftjs
来源: https://codeday.me/bug/20191001/1839092.html