Fluxible 中的“dehydrate”和“rehydrate”分别代表什么?
What does « dehydrate » and « rehydrate » stand for in Fluxible?
我正在开发一个可与 fluxible 一起使用的最小应用程序。几乎所有事情看起来都很清楚,但有一件事:脱水和再水化状态的概念。
我明白这是在客户端和服务器之间同步商店所需要的,但我不知道为什么。这条线对我来说很不清楚:
var exposed = 'window.App=' + serialize(app.dehydrate(context)) + ';';
在server.js (https://github.com/yahoo/fluxible/tree/master/examples/react-router)
如果你能用“更简单的词”告诉我它的意思,我将不胜感激。
Dehydrate 是序列化的另一个词,Rehydrate 是反序列化的意思。
充气 ==(重新)保湿 == 反序列化
所以这行代码序列化路由器的一个状态,并将对象分配给 window.app,可以从客户端
访问
更新
如何使用序列化的示例:
假设我们有一个用户对象,并希望在请求之间保留当前登录用户的引用。
我们可以通过简单地获取用户 ID 并将其保存到会话中来序列化用户。那将是用户对象的序列化或脱水。要水化或反序列化,我们只需从会话中获取 id,在 DB 中找到我们的用户并再次填写用户对象。此处的目的是尽可能减少内存占用。
在 fluxible 的示例之一中,dehydrate 函数只是 returns 当前状态名称,hydrate 函数将状态名称作为参数并将其设置为当前状态。我认为完整的状态对象在客户端和服务器上都是可用的。因此,由于您不需要发送整个状态,因此您只需发送状态的名称。脱水功能简单到
State.dehydrate = function(){
return this.currentStateName;
}
在 Fluxible 的上下文中,使您的应用程序脱水意味着将其状态提取到一个对象中。重新水化您的应用程序是使用相同的对象在您的应用程序中 重新注入 状态。表示应用程序状态的对象应该是可序列化的,以便通过网络发送它。
假设我想在服务器上预呈现我的应用程序,将 html 提供给客户端,然后在客户端重新呈现我的应用程序。如果我的应用程序仅包含静态数据,这将是微不足道的。但是,我的应用程序是 有状态的 :它在初始渲染之前从我的 API 检索数据并存储它。通过在服务器上提取我的应用程序的状态,将它与 HTML 一起发送,然后在客户端重新注入它,我避免了向我的 API.
发出两次请求
上面的答案很好,但我认为我们仍然可以更好地解释这个比喻,用披萨。考虑回到未来 2 中的这个场景:
这个场景中有两个关键组成部分:脱水必胜客披萨和Black & Decker 保湿器。 暂时忽略我们还需要一个脱水器来完成这个比喻。
脱水比萨饼是代表完整比萨饼所必需的一切,但正如包装纸告诉我们的那样,“除非完全再水化,否则请勿食用”。服务器渲染的脱水披萨,看起来很好吃,但实际上并没有完全吸引人。
您的应用是给麦克弗莱奶奶的水瓶、披萨和披萨盒说明。 McFly 奶奶是浏览器。当用户请求“一半意大利辣香肠/一半青椒”披萨页面时,后端会发送一个脱水披萨和一个 Black & Decker 保湿器。 Grandma McFly(浏览器)仔细阅读所有说明并为用户补水。这是一件非常好的事情,因为用户是个白痴,不知道或不关心水合比萨饼和脱水比萨饼之间的区别,就像小马蒂一样。:
Marty Jr.: (o.s) Grandma, can you just shove [the dehydrated pizza] in my mouth? (laughs)
Marty: (o.s) Don't you be a smart ass!
到目前为止还不错吧?目前获益:
- 用户在第一次请求时得到整个(脱水的)比萨饼和水化器,而不是仅仅获取水化器然后必须调用(网络服务 xhr)来订购比萨饼
- 网络爬虫是特别愚蠢的用户,他们从查看冷冻比萨饼中获得所需的一切,不需要 McFly 奶奶阅读说明并通过加水使比萨饼互动
等等,还有更多!用户抓起一两片然后跑掉,留下剩下的披萨。碰巧的是,McFly 奶奶从比萨饼盒的说明中知道要保存修改后的比萨饼状态。她(客户端)将其放入脱水器(未显示)中,然后将其送回橱柜(服务器)。如果当用户回来吃完他们的半个意大利辣香肠/半个胡椒比萨时,整个脱水比萨/水化器/祖母过程将再次发生,它会像以前一样新鲜,加上他们所做的改变。
让我们回顾一下:
- 脱水就是提取应用程序的当前状态并将其序列化为对象。这可以在服务器端或客户端完成。
- 再水化是解释状态对象(通过脱水创建)并将应用渲染成美味的交互式披萨。
- 以任一方向传递脱水状态对象很有用:从服务器到客户端,或客户端到服务器。
结束!除了不是真的。
还有一个神秘的魔法部分可以让这个比喻起作用,那就是每当我们给比萨加水时,我们实际上 保持脱水比萨完好无损。所以我们最终得到脱水比萨和水合比萨,然后我们在幕后根据需要同步它们。在 Flux 的情况下,这是通过组成您的应用程序的许多商店来实现的。在 Redux 中,你只有一个顶级 Store,这可能更容易理解。
我正在开发一个可与 fluxible 一起使用的最小应用程序。几乎所有事情看起来都很清楚,但有一件事:脱水和再水化状态的概念。
我明白这是在客户端和服务器之间同步商店所需要的,但我不知道为什么。这条线对我来说很不清楚:
var exposed = 'window.App=' + serialize(app.dehydrate(context)) + ';';
在server.js (https://github.com/yahoo/fluxible/tree/master/examples/react-router)
如果你能用“更简单的词”告诉我它的意思,我将不胜感激。
Dehydrate 是序列化的另一个词,Rehydrate 是反序列化的意思。
充气 ==(重新)保湿 == 反序列化
所以这行代码序列化路由器的一个状态,并将对象分配给 window.app,可以从客户端
访问更新
如何使用序列化的示例:
假设我们有一个用户对象,并希望在请求之间保留当前登录用户的引用。 我们可以通过简单地获取用户 ID 并将其保存到会话中来序列化用户。那将是用户对象的序列化或脱水。要水化或反序列化,我们只需从会话中获取 id,在 DB 中找到我们的用户并再次填写用户对象。此处的目的是尽可能减少内存占用。
在 fluxible 的示例之一中,dehydrate 函数只是 returns 当前状态名称,hydrate 函数将状态名称作为参数并将其设置为当前状态。我认为完整的状态对象在客户端和服务器上都是可用的。因此,由于您不需要发送整个状态,因此您只需发送状态的名称。脱水功能简单到
State.dehydrate = function(){
return this.currentStateName;
}
在 Fluxible 的上下文中,使您的应用程序脱水意味着将其状态提取到一个对象中。重新水化您的应用程序是使用相同的对象在您的应用程序中 重新注入 状态。表示应用程序状态的对象应该是可序列化的,以便通过网络发送它。
假设我想在服务器上预呈现我的应用程序,将 html 提供给客户端,然后在客户端重新呈现我的应用程序。如果我的应用程序仅包含静态数据,这将是微不足道的。但是,我的应用程序是 有状态的 :它在初始渲染之前从我的 API 检索数据并存储它。通过在服务器上提取我的应用程序的状态,将它与 HTML 一起发送,然后在客户端重新注入它,我避免了向我的 API.
发出两次请求上面的答案很好,但我认为我们仍然可以更好地解释这个比喻,用披萨。考虑回到未来 2 中的这个场景:
这个场景中有两个关键组成部分:脱水必胜客披萨和Black & Decker 保湿器。 暂时忽略我们还需要一个脱水器来完成这个比喻。
脱水比萨饼是代表完整比萨饼所必需的一切,但正如包装纸告诉我们的那样,“除非完全再水化,否则请勿食用”。服务器渲染的脱水披萨,看起来很好吃,但实际上并没有完全吸引人。
您的应用是给麦克弗莱奶奶的水瓶、披萨和披萨盒说明。 McFly 奶奶是浏览器。当用户请求“一半意大利辣香肠/一半青椒”披萨页面时,后端会发送一个脱水披萨和一个 Black & Decker 保湿器。 Grandma McFly(浏览器)仔细阅读所有说明并为用户补水。这是一件非常好的事情,因为用户是个白痴,不知道或不关心水合比萨饼和脱水比萨饼之间的区别,就像小马蒂一样。:
Marty Jr.: (o.s) Grandma, can you just shove [the dehydrated pizza] in my mouth? (laughs)
Marty: (o.s) Don't you be a smart ass!
到目前为止还不错吧?目前获益:
- 用户在第一次请求时得到整个(脱水的)比萨饼和水化器,而不是仅仅获取水化器然后必须调用(网络服务 xhr)来订购比萨饼
- 网络爬虫是特别愚蠢的用户,他们从查看冷冻比萨饼中获得所需的一切,不需要 McFly 奶奶阅读说明并通过加水使比萨饼互动
等等,还有更多!用户抓起一两片然后跑掉,留下剩下的披萨。碰巧的是,McFly 奶奶从比萨饼盒的说明中知道要保存修改后的比萨饼状态。她(客户端)将其放入脱水器(未显示)中,然后将其送回橱柜(服务器)。如果当用户回来吃完他们的半个意大利辣香肠/半个胡椒比萨时,整个脱水比萨/水化器/祖母过程将再次发生,它会像以前一样新鲜,加上他们所做的改变。
让我们回顾一下:
- 脱水就是提取应用程序的当前状态并将其序列化为对象。这可以在服务器端或客户端完成。
- 再水化是解释状态对象(通过脱水创建)并将应用渲染成美味的交互式披萨。
- 以任一方向传递脱水状态对象很有用:从服务器到客户端,或客户端到服务器。
结束!除了不是真的。
还有一个神秘的魔法部分可以让这个比喻起作用,那就是每当我们给比萨加水时,我们实际上 保持脱水比萨完好无损。所以我们最终得到脱水比萨和水合比萨,然后我们在幕后根据需要同步它们。在 Flux 的情况下,这是通过组成您的应用程序的许多商店来实现的。在 Redux 中,你只有一个顶级 Store,这可能更容易理解。