首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >响应JS服务器端问题-未找到窗口

响应JS服务器端问题-未找到窗口
EN

Stack Overflow用户
提问于 2016-08-15 08:27:47
回答 8查看 69.1K关注 0票数 33

嗨,我正在尝试在我的reactJS项目中使用reactJS rte。我有服务器端呈现,每次我想使用这个包时,我都会得到:

代码语言:javascript
运行
复制
return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
                               ^
ReferenceError: window is not defined

我想问题可能是同构的工具,但我不知道如何将导入包推迟到客户端,在那里窗口将被定义。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2016-10-09 04:04:30

如果您正在进行服务器端呈现,那么很有可能全局窗口对象是未定义的,因为这只是客户端会理解的事情。

注:一开始,当您启动项目时,它将呈现出完整的DOM字符串(此时它将不知道window,因为它是服务器端的,但随后使用客户端代码重新呈现窗口对象!)

在这种情况下,我使用了一个解决方法。这就是我对webpack插件的看法:

代码语言:javascript
运行
复制
new webpack.DefinePlugin({
  'process.env.NODE_ENV': isDevelopment ? '"development"' : '"production"',
  'process.env.BROWSER': JSON.stringify(true),
  __DEV__: isDevelopment
}),

因此,我使用process.env.BROWSER作为我的优势,因为如果它是服务器端,它将被定义为undefined,如果客户端完成呈现,它将被定义为true

由于在服务器端没有窗口对象时,所有东西都会停止工作,所以我们可以添加以下内容:

代码语言:javascript
运行
复制
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字符串,然后让客户端接管。

还请注意:不要担心将窗口设置为空对象,一旦客户端完成呈现,它将恢复正常。

票数 18
EN

Stack Overflow用户

发布于 2017-10-24 10:36:20

下面是一个npm库,它可以为您处理窗口、文档和全局对象:全局

这样你就可以安全地写:

代码语言:javascript
运行
复制
import window from 'global'

const mySpecialWindowFunction = () => {
    return /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
};
票数 22
EN

Stack Overflow用户

发布于 2020-05-21 07:12:49

对于任何试图弄清楚他们的SSR失败的原因的其他人来说,即使他们正在检查window对象是否未定义。

您需要检查窗口引用是否存在,而不是它的值是否为null!

代码语言:javascript
运行
复制
  if (typeof window === 'undefined') console.log('Window is not there')

您的window &&if (window)检查失败,因为在JavaScript中没有声明和‘未定义’是不同的。

代码语言:javascript
运行
复制
const a = undefined;
if (a) console.log('a');  // logs nothing, since 'a' is undefined
if (b) console.log('b');  // ReferenceError: b is not defined

对最初问题的回答是,每当访问需要的“窗口”对象时,都需要将它们设置为条件:

代码语言:javascript
运行
复制
return (typeof window === 'undefined') ?
   'node' :
   /msie [6-9]\b/.test(window.navigator.userAgent.toLowerCase());
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38951721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档