react 服务器端渲染 ssr 中 localstorage/history/window is not defined 解决方案

简介: 1、原因      ssr 会在后端执行组件的 componentWillMount 以及在它这个生命周期之前的生命周期     也就是说 ssr 阶段是不会执行 componentDidMount 方法的    当你在 componentWillMount 之前当生命周期里面调用 window / localstorage 全局对象的时候,  它其实是在服务器上面执行等,因为 window / localstorage 是浏览器的属性对象。

 

1、原因

  

  ssr 会在后端执行组件的 componentWillMount 以及在它这个生命周期之前的生命周期

    也就是说 ssr 阶段是不会执行 componentDidMount 方法的

 

 当你在 componentWillMount 之前当生命周期里面调用 window / localstorage 全局对象的时候,

 它其实是在服务器上面执行等,因为 window / localstorage 是浏览器的属性对象。

 所以在 服务器端 跑的时候,就会出现没有定义的错误。

 

2、解决方案

  

  个人觉得可以把这些浏览器的属性重新封装以便使用。

  例如:

   let targetWin = null
    if(window) targetWin = window
    var proxyWindow = new Proxy(targetWin,{
        get: function (target, key, receiver) {
            if(!targetWin) {
                return Reflect.get({nothing:function () {}}, 'nothing', receiver);
            }
            return Reflect.get(target, key, receiver);
        }
    });

    export default proxyWindow

  

  没有在项目中试过,不过我觉得这是一个完美解决方案。

  上面是用了 es6 的 proxy 做代理。

  当 window 不存在时候,如果调用了 window 上面的方法或者属性就会执行 nothing 这个方法。

  也就是说 在服务器渲染的时候 不会找不到 window ,而会执行 nothing 方法。

  这样就不会报错了。

  这里的话,以后使用 window 的对象的话,就需要引用这个模块。

 

  以此类推,localstorage / location 等都可以用此类方法实现了。

 

相关文章
|
1月前
|
资源调度 前端开发 API
React Suspense与Concurrent Mode:异步渲染的未来
React的Suspense与Concurrent Mode是16.8版后引入的功能,旨在改善用户体验与性能。Suspense组件作为异步边界,允许子组件在数据加载完成前显示占位符,结合React.lazy实现懒加载,优化资源调度。Concurrent Mode则通过并发渲染与智能调度提升应用响应性,支持时间分片和优先级调度,确保即使处理复杂任务时UI仍流畅。二者结合使用,能显著提高应用效率与交互体验,尤其适用于数据驱动的应用场景。
57 20
|
1月前
|
前端开发
React 如何使用条件渲染
【8月更文挑战第17天】React 如何使用条件渲染
30 3
|
20天前
|
前端开发 JavaScript 中间件
|
20天前
|
前端开发 JavaScript 数据管理
React 中无渲染组件
【8月更文挑战第31天】
22 0
|
20天前
|
前端开发 JavaScript 搜索推荐
|
1月前
|
前端开发 JavaScript 开发者
React Server Component 使用问题之为什么选择使用 React 官方的 renderToString 来渲染 HTML,如何解决
React Server Component 使用问题之为什么选择使用 React 官方的 renderToString 来渲染 HTML,如何解决
|
3月前
|
弹性计算
阿里云服务器99元和199元提示“不符合活动条件”或显示价格为原价的解决方案
2024年阿里云推出了两款长效特惠云服务器,经济型e实例2核2G配置3M固定带宽40G ESSD Entry云盘,价格只要99元1年,通用算力型u1实例2核4G配置5M固定带宽80G ESSD Entry云盘,价格只要199元1年,而且购买之后还能享受续费同价的政策,这两款云服务器的购买资格为新老用户同享,但是还是有部分用户在购买时会提示“不符合活动条件”或者显示的价格是原价,本文为大家解析出现这一情况的原因是什么呢,以及我们应该如何解决。
阿里云服务器99元和199元提示“不符合活动条件”或显示价格为原价的解决方案
|
2月前
|
存储 弹性计算 大数据
阿里云ECS以其强大的弹性计算与存储能力,为大数据处理提供了灵活、高效、成本优化的解决方案
阿里云ECS在大数据处理中发挥关键作用,提供多样化实例规格适应不同需求,如大数据型实例适合离线计算。ECS与OSS集成实现大规模存储,通过Auto Scaling动态调整资源,确保高效运算。案例显示,使用ECS处理TB级数据,速度提升3倍,成本降低40%,展现其在弹性、效率和成本优化方面的优势。结合阿里云生态系统,ECS助力企业数据驱动创新。
57 1
|
3月前
|
弹性计算 运维 Java
解决方案测评(高效构建企业门户网站方案)基于ecs&云效&云解析DNS&VPC结合的自搭建方案报告
该文档是一个关于使用ECS、云效、云解析DNS和VPC结合的自搭建方案报告。主要内容包括前言部分,可能详细探讨了如何集成这些阿里云服务以构建自定义系统。由于提供的内容有限,具体的实施方案和细节未在摘要中体现。
200 2
|
3月前
|
监控 数据库 时序数据库
性能监控之Telegraf+InfluxDB+Grafana window服务器安装使用
【6月更文挑战13天】性能监控之Telegraf+InfluxDB+Grafana window服务器安装使用
105 1