首页
学习
活动
专区
圈层
工具
发布

【QQ音乐web团队】:ReactJS 服务端同构实践

一种比较方便的方法是把拉取数据的逻辑写到 React Class 的静态方法上(组件外部也能调用),在服务端时前置执行,在前端时在 componentDidMount 时执行。 ?...拉取数据放到静态方法中方便调用 ? 服务端提前执行相应的 fetchData 2. 数据层 - Redux Redux 是一个从 Flux 架构演化的,非常简洁设计精致的数据层管理库。...Redux 工作流程 由于 Redux 使用一个单一的 Store 数据树来记录数据的特点,在服务端渲染时做起来也很容易。...除非需要拉取数据进行判断,不要在路由确定之后(例如组件中 willMount)再重定向。因为在拿到路由配置之后就要根据相应的页面去拉数据了。这之后再重定向就比较浪费。 3....举个例子,比如一个拉取数据的请求,在前端最后可能是 AJAX ,后端就是 http.request(如果没有直接使用 isomorphic-fetch 这样的库的话)。

2.3K70

ReactJS 服务端同构实践【QQ音乐web团队】

一种比较方便的方法是把拉取数据的逻辑写到 React Class 的静态方法上(组件外部也能调用),在服务端时前置执行,在前端时在 componentDidMount 时执行。 ?...拉取数据放到静态方法中方便调用 ? 服务端提前执行相应的 fetchData 2. 数据层 - Redux Redux 是一个从 Flux 架构演化的,非常简洁设计精致的数据层管理库。...Redux 工作流程 由于 Redux 使用一个单一的 Store 数据树来记录数据的特点,在服务端渲染时做起来也很容易。...除非需要拉取数据进行判断,不要在路由确定之后(例如组件中 willMount)再重定向。因为在拿到路由配置之后就要根据相应的页面去拉数据了。这之后再重定向就比较浪费。 3....举个例子,比如一个拉取数据的请求,在前端最后可能是 AJAX ,后端就是 http.request(如果没有直接使用 isomorphic-fetch 这样的库的话)。

1.9K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    React 同构直出优化总结

    服务端需提前拉取数据,客户端则在 componentDidMount 调用 平台上的差异,服务端渲染只会执行到 compnentWillMount 上,所以为了达到同构的目的,可以把拉取数据的逻辑写到...React Class 的静态方法上,一方面服务端上可以通过直接操作静态方法来提前拉取数据再根据数据生成 HTML,另一方面客户端可以在 componentDidMount 时去调用该静态方法拉取数据...两个 action 在同个component中数据存在依赖关系时,考虑setState的异步问题 (redux) 客户端上,由于 react 中 setState 的异步机制,所以在同个component...服务端上增加的耗时 服务端渲染方案将数据的拉取和模板的渲染从客户端移到了服务端,由于服务端的环境以及数据拉取存在优势(详见 Node直出理论与实践总结),所以在相比下,这块耗时大大减少,但确实存在,这两块耗时是服务端渲染相比于客户端渲染在服务端上多出来...所以此次在同构耗时在计算上包含了服务端数据拉取与模板渲染的时间。

    2.4K10

    React服务端渲染与同构实践

    早些年前,大部分网站都使用传统的 MVC 架构进行后端渲染,就是实现一个 Controller,处理请求时在服务端拉取到数据 Model,使用模版引擎结合 View 渲染出页面,比如 Java + Velocity...但随着前端脚本 JS 的发展,拥有更强大的交互能力后,前后端分离的概念被提出,也就是拉取数据和渲染的操作由前端来完成。 关于前端渲染还是后端渲染之争,可以看文章后面的参考链接,这里不做讨论。...都存在共性逻辑,每个请求过来都要经历: 根据页面 reducer 创建 store 拉取首屏数据 渲染结果 ......createStore( reducer /* 1.同构的reducer */, undefined, applyMiddleware(thunkMiddleware) ); // 拉取首屏数据...实现同构钩子 还需要在同构模块中实现通用 Controller 约定。

    1K30

    React服务端渲染与同构实践

    早些年前,大部分网站都使用传统的 MVC 架构进行后端渲染,就是实现一个 Controller,处理请求时在服务端拉取到数据 Model,使用模版引擎结合 View 渲染出页面,比如 Java + Velocity...但随着前端脚本 JS 的发展,拥有更强大的交互能力后,前后端分离的概念被提出,也就是拉取数据和渲染的操作由前端来完成。 关于前端渲染还是后端渲染之争,可以看文章后面的参考链接,这里不做讨论。...的脚手架 已在 React 直出上有一定的实践经验(仅限于组件同构,Controller 并不通用) React 提供了一套将 Virtual DOM 输出为 HTML 文本的API; Redux 提供了一套将...都存在共性逻辑,每个请求过来都要经历: 根据页面 reducer 创建 store 拉取首屏数据 渲染结果 ......createStore( reducer /* 1.同构的reducer */, undefined, applyMiddleware(thunkMiddleware) ); // 拉取首屏数据

    1.3K10

    探索 React 状态管理:从简单到复杂的解决方案

    虽然像Redux这样的库是管理应用程序状态的流行选择,但你应该明白何时使用它们,何时不使用它们,而且在满足需求时考虑像Context API这样的简单替代方案也很重要。...在这篇博文中,我们将探讨React中的多个状态管理示例,从基本的useState()到更高级的库,比如Redux,同时强调使用Context API等简单解决方案的好处。让我们开始吧!...属性钻取和Context API接下来,我们深入探讨“属性钻取”(prop drilling)的挑战,其中状态需要通过多个组件传递。为了解决这个问题,我们引入了Context API。...通过一个实际的例子,我们说明了Context API如何使我们能够在组件树中共享状态,消除了对属性钻取的需求。...Redux用于集中式状态管理在进入更复杂的场景时,我们引入了Redux,这是一个广泛采用的用于管理应用程序状态的库。

    2.2K31

    使用React-Query解决接口请求的麻烦事

    return } 这是一个组件拉取服务端数据的简单例子,在组件中,我们简单拉取了一个接口的数据,并监听接口的状态,根据状态来更新不同的UI。...它提供了几个简单的Hooks,借助它们可以很轻松的完成对后端数据的增删改查等操作,无需再写繁琐的数据拉取和状态判断等代码。...refetchOnMount: 实例重新挂载时重新拉取请求 enabled: 如果为“false”,“useQuery”不会触发,需要使用其返回的“refetch”来触发操作 queryFn:全局定义请求方法...除此之外,使用useQuery拉取回来的数据,会被默认缓存起来,然后可以通过配置过期时间,重新拉取等策略来进行管理。...,但还是能解决很多服务器拉取数据的痛点。

    1.8K30

    Web全栈入门-美剧帮项目

    前端项目 前端用主要使用 React+Antd 做界面,Redux管理数据,Axios做HTTP请求,下面是目录结构 ?...前端目录结构 assets – 静态资源,比如图片啥的 common – 公共样式 components – 不用做路由的组件 containers – 路由组件界面 redux – 数据管理 utils...服务端用 node 编写,使用 koa 框架实现 API 接口,mongoose 框架操作 MongoDB,blueimp-md5 做密码加密,项目结构比较简单,见GitHub。...爬虫 node编写,使用了 node-crawler 框架,爬取美剧天堂(地址:查看链接 )数据,保存到 MongoDB,200多行代码,写的我自己都看不下去,主要是为了获取数据,实现功能就好,直接上gayhub...GitHub地址:查看链接 不过最近我服务器 IP 被美剧天堂拉黑了,研究了 node 代理,还没研究出来,求大佬指教 ? ?

    68930

    【送红宝书】JavaScript 测试系列实战(四):掌握 React Hooks 测试技巧

    在之前 useModalManagement 钩子的测试代码中,我们仅仅只测试了调用 Hook 时不会报错。...测试异步钩子 刚才的 useModalManagement 涉及到的都是同步操作,然而在实际应用中,很多钩子都涉及到异步操作,例如 API 数据获取等。那么我们该怎么测试这些异步钩子呢?...编写一个异步钩子 首先,让我们来写一个简单的异步钩子 useCommentsManagement ,用于从一个公共 API 获取一些评论数据,代码如下: // src/useCommentsManagement.js...fetchComments 拉取评论后,我们调用 waitForNextUpdate 并去 await 它返回的 Promise,当重渲染完成后,就可以使用调用断言语句来进行判断啦。...至于怎么用 Mock 来写,就留给作业给你吧~ 测试 Redux + Hooks 在规模较大的应用中,我们通常会使用一个状态管理库来解决复杂的数据流问题,而最受欢迎的选择无疑是 Redux。

    2.6K00

    干货 | 浅谈React数据流管理

    而数据就广泛了,它不光是指server层返回给前端的数据,react中的状态也是一种数据。当我们改变数据的同时,就要通过改变状态去引发界面的变更。...我们会用jQuery提供的一套API,然后手动操作Dom来进行绘制,很精准,但是很累,因为完全靠手动操作,且改动时性能损耗较大,开发者的注意力完全在“如何去绘制”上面了。...2)迭代器模式: 在这里要先引出一个新的概念:拉取(pull)和推送(push),rxjs官方这两种协议有更详细的解释,我这里就直接引用一下: ?...拉取和推送实际上对于观察者来说就是一个主动与被动的区别,是主动去获取还是被动地接收。...五、结语 最后,总结一下各类的适用场景: 1)当我们项目中复杂程度较低时,建议只用react就可以了; 2)当我们项目中跨组件通信、数据流同步等情况较多时,建议搭配react的新context api

    2.5K20

    腾讯新闻React同构直出优化实践

    为什么选择腾讯新闻 我并非腾讯新闻的业务相关方,可以比较大胆地作为例子使用 腾讯新闻页面更为丰富,可以做更多场景的实践 验证全套脱胎手Q家校群react的优化策略、实践方案和开发工具 由于只是实验,数据都是拉取腾讯新闻现网提供的...后台服务包括返回数据的api,还有直出的controller层。...else { this.body = "spa list"; } }; 而ReactRender函数,大概长这样,其实就是一个generator function,具体拉取数据和...基本就是三部曲,拉数据、存数据和吐内容。.../common/nodeUtils'); 存数据 由于我们采用redux做统一数据的处理,因此我们需要将数据存一份到store里,以便后面吐内容。

    2.5K50

    React-全局状态管理的群魔乱舞

    这些API就会显得「捉襟见肘」。 今天,我们就来谈谈,React中状态管理的群魔乱舞。...「然而」,因为它是内存中的一个「单一值」,你不能为「不同的子树」提供不同的数据状态。 ❞ 写入存储状态的能力 一个库应该提供一个直观的API来读取和写入存储的数据。...在一些「后-redux」的全局状态管理解决方案中还有其他一些库,如Valtio[6],也允许开发者使用可变风格的API。...状态被维护在组件树的高处,下面的组件通过选择器拉取他们需要的状态。 在新的组件构建理念中,一种「自下而上」的观点对构建具有组合模式的应用具有很好的指导作用。...库 描述 React-Redux 「手动」管理 Recoil 0.3.0版本后- 「自动」管理 Jotai 「自动」管理 - atoms作为键存储在WeakMap中 Zustand 「半自动」--API

    4.4K20

    React 没有中间件还能用吗?

    rootReducer, initialState, ); return store; } combineReducers 做了什么 combineReducers 主要和是 createStore API...对应于上文, 整个API的流程图为: 关键点在于applyMiddleware 和 中间件两个内容. ?...getState 这个就不用说了, 就是用来获取当前 redux 的 state. 那 extraArgument 干啥嘞? 看源码很容易发现, 就是在初始化 thunk 时, 传入的参数....所以, 两个都可以使用, 只是看你具体需求是啥. react-redux 中间件 不过,在 react-redux 中,已经将两者都已经实现了,connect 方法和上面的一致,差别的是 dispatch...这样,可以在通过 dispatch 触发指定 action 时,进行异步数据的拉取,不过最终它还是需要通过 dispatch 返回一个 plain object 来进行触发全局的 actions。

    1.7K20

    给2019前端开发的你5个进阶建议~

    前后端协作简图 除了上面讲的 iron-redux,我们还引入 Pont 实现前端取数,它可以自动把后端 API 映射到前端可调用的请求方法。...Pont 实现原理: Pont(法语:桥) 是我们研发的前端取数层框架。对接的后端 API 使用 Java Swagger,Swagger 能提供所有 API 的元信息,包括请求和响应的类型格式。...Pont 解析 API 元信息生成 TS 的取数函数,这些取数函数类型完美,并挂载到 API 模块下。最终代码中取数效果是这样的: ?...再也不需要前后端接口约定文档,使用代码保证前端取数和后端接口定义完全一致 另外 iron-redux 能接收到 Pont 接口响应数据格式,并推导出整个 Redux 状态树的静态类型定义,Store...中的数据完美的类型提示。

    1.5K10

    同样做前端,为何差距越来越大?

    reducer 和 view 不必一一对应,应用中同时存在组件树和状态树,按照各自需要去组织,通过 connect 来绑定状态树的一个或多个分支到组件树; 通过构造一些预设数据类型来减少样板代码。...虽庞大但有序,你可以快速而明确的访问任何数据。 ? 如何减少样板代码? 使用原生 Redux,一个常见的请求处理如下。非常冗余,这是 Redux 被很多人诟病的原因: ?...除了上面讲的 iron-redux,我们还引入 Pont 【5】实现前端取数,它可以自动把后端 API 映射到前端可调用的请求方法。 Pont 实现原理:(法语:桥) 是我们研发的前端取数层框架。...Pont 解析 API 元信息生成 TS 的取数函数,这些取数函数类型完美,并挂载到 API 模块下。最终代码中取数效果是这样的: ?...另外 iron-redux 能接收到 Pont 接口响应数据格式,并推导出整个 Redux 状态树的静态类型定义,Store 中的数据完美的类型提示。效果如下: ?

    1.7K20

    Taro 小程序开发大型实战(六):尝鲜微信小程序云(上篇)

    序号4是代表我们此次的云环境的标识符,可以用于在小程序端以 API 调用云开发资源时标志此时的调用的云环境。 在本篇教程中,我们会用到上面提到的数据库和云函数两项功能。...Redux 异步工作流解析 我们来看一下 Redux 的数据流动图: 上图中灰色的那条路径是我们之前一直在使用的 Redux 的数据流动图,它是 Redux 同步数据流动图: view 中 dispatch...然后,跟着取数据的是一个 try/catch 语句块,用于捕获错误,在 try 语句块中,我们使用 db 的查询操作:db.collection('user').where().get(),表示查询 where...最后,我们判断一下 getStorage 的逻辑,只有当此时 Redux Store 里面没有数据时,我们才去获取 storage 里面的数据来更新 Redux Store。...扩充 Logout 的清空数据范围 因为在 Redux Store 里面的 user 属性中多出了一个 userId 属性,所以我们在 Logout 组件里 dispatch action 时,要清空

    2.8K20

    React教程(详细版)

    1.1、概念 它是一个将数据渲染为HTML视图 的js库 1.2、原生js痛点 用dom的API去操作dom,繁琐且效率低 用js直接操作dom,浏览器会进行大量的回流和重绘 原生js没有组件化的编程方案...①若小写字母开头,则会将该标签转为html同名标签,如果没找到,则会报错; ②若大写字母开头,则会认为是组件,它就会去找对应的组件,如果没找到,就会报组件未定义的错误; 三、React面向组件编程...dom也直接从this(组件实例中取) 这里我们再来探讨一个小问题,就是这个ref的回调函数会被执行几次的问题?...代码解读:createRef()方法是React中的API,它会返回一个容器,存放被ref标记的节点,但该容器是专人专用的,就是一个容器只能存放一个节点; 当react执行到div中第一行时...key的作用: 当状态中的数据发生改变时,react会根据【新数据】生成【新虚拟DOM】,随后react会进行【新虚拟DOM】和【旧虚拟DOM】的diff算法比较,具体的比较规则如下: 若【旧DOM】中找到了与

    2.6K20
    领券