Node.js 中的“窗口未定义”错误

IT技术 node.js reactjs webpack webpack-dev-server
2021-05-16 09:12:53

我知道windowNode.js 中不存在,但我在客户端和服务器上使用 React 和相同的代码。我用来检查是否window存在的任何方法都会让我感到:

未捕获的 ReferenceError:未定义窗口

我如何解决我做不到的事实window && window.scroll(0, 0)

4个回答

索泰托斯得到了它。我会运行你在 componentDidMount() 中的任何代码,并用以下代码包围它:

if (typeof(window) !== 'undefined') {
  // code here
}

如果在 React 渲染组件时仍未创建 window 对象,您始终可以在组件渲染后的几分之一秒内运行您的代码(并且此时 window 对象肯定已创建),因此用户无法分辨其中的不同之处。

if (typeof(window) !== 'undefined') {
    var timer = setTimeout(function() {
        // code here
    }, 200);
}

我建议不要将状态放在 setTimeout 中。

这将为您解决这个问题:

typeof(window) === 'undefined'

即使未定义变量,您也可以使用typeof()它来检查它。

这种代码甚至不应该在服务器上运行,它应该在一些componentDidMount参见 doc)钩子内,它只是调用客户端。这是因为滚动窗口服务器端没有意义。

但是,如果您必须在真正同时运行客户端和服务器的代码的一部分中引用 window,请global改用(它代表全局范围 - 例如window在客户端上)。

这有点旧,但是对于 ES6 样式的 React 组件类,您可以使用我创建的这个类装饰器,作为定义仅应在客户端呈现的组件的解决方案。我更喜欢它而不是随处可见的窗口检查。

import { clientOnly } from 'client-component';

@clientOnly
class ComponentThatAccessesWindowThatIsNotSafeForServerRendering extends Component {
    render() {
        const currentLocation = window.location;
        return (
            <div>{currentLocation}</div>
        )
    };
}

https://github.com/peterlazzarino/client-component