如何避免在 ReactJS 同构应用程序中的服务器上出现错误“未定义本地存储”?

Posted

技术标签:

【中文标题】如何避免在 ReactJS 同构应用程序中的服务器上出现错误“未定义本地存储”?【英文标题】:How to avoid getting error 'localStorage is not defined' on server in ReactJS isomorphic app? 【发布时间】:2016-02-16 21:40:27 【问题描述】:

我在我的 webApp 中使用 localStorage 在客户端存储数据。但是当我试图使应用程序同构时,这会导致问题。由于 node 不是浏览器环境,它不能定义诸如 'window'、'localStorage' 等对象。 我该如何解决这个问题?

【问题讨论】:

你可以使用 cookie 来代替 【参考方案1】:

您可以通过检查模块是否不是'undefined'来检查代码是在服务器还是在客户端执行:

var isNode = typeof module !== 'undefined'

然后您可以继续在客户端只执行此代码:

if(!isNode)
   //use the local storage
   var myItem = localStorage.getItem(itemTitle)

但是,您应该在使用之前检查是否已定义Storage,因为并非所有浏览器都支持它:

if(typeof(Storage) !== "undefined")
   //use the local storage

【讨论】:

好点!我以前做let browserStorage = (typeof localStorage === 'undefined') ? null : localStorage;,然后在组件内部检查browserStorage。我想知道是否有更好的解决方法。 为什么不使用 cookie @jvalen【参考方案2】:

标准有specific support 来解决此类问题。

您需要做的就是添加一个注释,通知标准有一个全局范围提供的变量。

// MyStuff.js
/* global localStorage */

// Use localStorage below with no linter errors

【讨论】:

以上是关于如何避免在 ReactJS 同构应用程序中的服务器上出现错误“未定义本地存储”?的主要内容,如果未能解决你的问题,请参考以下文章

在同构 reactjs 中检测移动设备

reactJS:具有通量的同构应用程序

什么是 ReactJS 中的同构渲染方式

如何使 reactjs/flux/react-router spa 同构?

如何避免 ReactJs 中的 CSS 冲突

React JS 同构渲染