重新架构Airbnb的网站前端代码

原文链接
湾区日报翻译 by zzq


简评

从传统的Rails app、服务器端渲染网页,进化到时髦的React + Redux的single page app;文中有动图有代码,感受一下这家十岁的“创业”公司的代码库成长的烦恼. (摘自湾区日报)

概述:我们最近重新考虑了Airbnb网站代码库的JavaScript部分的架构。这篇文章将分析(1)诱发这些变化的产品上的驱动(2)我们如何一步步离开之前Rails的解决方案(3)新技术栈的核心。福利:我们将讨论下一代前端技术。

Airbnb网站每天有超过7500万的搜索,这使得搜索页面成流量最大的页面。在过去的将近十年里,工程师们一直致力于改进、加强、优化Rails传送页面的方式。

最近,我们首页变成了垂直风格,从上到下依次为首页,体验介绍和场地。作为把新产品上线的一部分,我们重新思考了搜索体验。

之前我们的搜索是先把用户从首页引导至搜索结果页面,然后是用户进入某个列表项的详情页面,然后是预定流程。每个页面都是Rail进行一次单独的页面传送。现在我们希望用户能有一个更流畅的体验,根据用户的行为调整用户的体验并窄化他们的搜索。

在多个Tab间导航和与列表交互感觉应该是很炫酷,并且毫不费力。事实上,今天应该没什么能阻止我们向小型和中型屏幕的原生应用的标准看齐。

为了达到这种效果,我们需要摆脱那种让我们有了今天的一页一页传送的古老方式,最终我们兴奋地全面重构了前端代码。

Leland Richardson最近在React大会上发表关于React Native在一个现存的,高流量原生应用的棕色地带。这篇文章会说明我们如何在在web上进行一个类似的彻底的升级。如果你也面临着这样的问题,希望这篇文章对你有用。

放弃Rails

在为我们小组里的所有响应式web应用粉丝开一场户外烧烤之前,我们需要从Rails中解脱出来(至少是我们在Airbnb上用Rails传递独立页面的方式)

不幸的是,就在几个月前我们的搜索页面还包含一些非常古老的代码...就像指环王中说的,在你危险的时候触摸它,这般古老。一个有趣的事实:有一次我用一个简单的React组件替代Rails显示层支持的Handlebars的模板,突然在页面的很多不想关的部分出现了错误,甚至在API的返回结果里面也出错了。事实证明,显示层改变了后端Rails模型,这些模型一直在影响下游数据,甚至在UI没有被渲染的时候。

简言之,在这个项目上,我们就像印第安纳琼斯一样用自己的宝物交换了一袋沙子,突然庙塌了,我们落下的石块中跑出来。

第一步:标准化API数据

当Rails在服务器端渲染页面的时候,你可以用任何你喜欢的方式把数据扔给服务器端的React组件。控制器,助手,显示层能生成任何形式的数据,甚至当你把页面的一部分转移到React时,每个组件都能处理它要求的任何数据。

但是一旦你投入到渲染客户端的流程时,你需要动态获取你事先决定好数据类型的数据。我们将来可能用GraphQL类似的东西解决这个问题,但是现在暂且把它放到一边吧,因为这件事和重构代码没太大关系。然而,我们选择向API“v2”(version 2)标准看齐,所以我们需要我们所有的组件都能处理v2范式的数据。

如果你发现自己和我们情况类似并且是一个大型的应用程序,你可能发现我们所做的迁移现有的服务器端数据管道的计划是整体工作中较为简单的部分。跨过Rails的简单步骤就是渲染一个React组件,确保数据输入时API所规定的类型。你可以进一步使用客户端的React PropTypes来验证数据类型是否和API v2一致。

对我们来说棘手的问题是和那些参与客户预定流程的团队协作:商业旅游,成长,假期出租项目;中国和印度市场团队,灾难恢复...等等不能一一列举的团队,我们需要重新告诉这些人,即使直接把("明白了,这仅仅是一种实验,但是...")这样的数据直接传递给组件在技术上是可行的,但是所有的数据都要经过API这一层。

第二步:非API化的数据:配置,实验,短语,L10n, I18n...

有一类单独的数据和我们设想的API化的数据不同,包括应用配置,用户实验任务,国际化,本地化等等相似的问题。这些年来Airbnb已经建立了一套难以置信的工具来支持这些功能,但是把这些数据传送到前端的机制就不那么令人愉快了(也可能当时写代码的时候就已经让人痛不欲生了,但是脚下的大地还没有颤动,所以糊弄过去了)

未完待续

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,138评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,103评论 4 62
  • 学习老猫笔记之前,我一直保持着一把梭地习惯,而且还是投资一个币种,这就好像把命运交给别人,盈利和亏损各百分之50,...
    勿语_c175阅读 250评论 0 0
  • 最近天天都是忙碌天。都这个点了才翻出APP来写简书。 上午追踪材料,大货。下午聊客户,开客户,忙的不亦乐乎。上午问...
    昕栖息的小屋阅读 144评论 0 0