纽约时报网站改版背后的web技术

nytimes-redesign
nytimes-redesign

原文地址:"The Technology Behind the NYTimes.com Redesign"
纽约时报英文网站今年进行了一次改版,这次改版不仅仅是给一艘大船重新刷了遍油漆那么简单,除了外观上的重新设计,我们也对代码进行了大量的重构,采用了新的框架,让网站更快,也为以后代码的维护、升级便利性进行了重新设计。Reed Emmons,是这次改版的负责人,在这篇文章将分享我们如何让纽约时报这首老船更快更酷。

很少有机会能够在像纽约时报这么老资格和规模的网站进行一场「从头来过」的重构和设计工作,我这里说的从头来过,不仅仅是视觉设计上的重新设计,更是一个重新发明整个数码传媒平台。纽约时报的上次一次视觉改版是在2006年,但是我们得回溯到2000千禧年才有如此规模的从底层的重构和改版。我们决定重构用户端和服务端以支持我们新的服务、设计和新闻报道,比如说更佳的网站性能、响应式布局等等。尽管有些旧有的代码依旧保留或者进行了深度重构,大部分老的代码都被删除或者仅仅是用来做参考。

静态页面发布:历史的教训

直到今天为止,纽约时报的大部分网页内容还是静态 html 页面,这些页面储存在我们数据中心的硬盘上。当编辑发布一篇新的文章时,会生成和写入一个 html 文件。我们拥有自己的 html 模板,可以让我们根据需求添加不同的插件。当一篇文章要渲染的时候,引擎会自动添加广告和渲染。这套系统的速度和性能足以支持纽约时报网站的高流量,所以到今天为止,也不是特别需要升级这套系统。

这套系统一个很大的不足就是缺乏动态控制性。网页的 html 是固定的,但是其中的脚本和样式表是需要不断改变的,我们的前端开发团队必须围护历史上创建的每一套模板。这也导致了为什么一个两年前发布的新闻同上周发布的文章,会存在一些不同。我们团队的一个前端架构师Eitan Konigsburg,在去年的开放日活动曾经就我们的技术架构历史做过分享。

一个聪明的框架

为了适应更高级和复杂的设计,我们构建了自己的响应式 JavaScript 引擎,可以让我们根据自己的需求使用不用的media queries断点,这个引擎可以通过直接在 html 中添加不同的 class 类命来实现响应式设计。同时,我们使用了 LESS 预处理,使得css 更易围护的同时也满足了我们大部分用户的浏览器兼容性需求。尽管对于用户来说,网站的变化十分精细,但是一篇文章在不同的设备和浏览器,可以产生20种不同的适应变化。以下为我们使用 LESS 的一个例子。

.ribbon {
   ...
   // responsive
   // 1020
   .viewport-medium-50 & {
      .offset(0, 1, 0, left);
    }

   // 1200
   .viewport-large-20 & {
      .offset(0, 2, 0, left);
   }
}

根据不同的分辨率和设备方向,我们的框架可以自动渲染出不同的界面,还可以根据需求添加不同类型的广告,每篇文章对应的网页有超过100个可以自定义修改的地方。

模块化 Javascript

这次重构需要大量的 js 代码重写以支持大量的订制功能。一个功能强大的前端框架是十分有必要的,这可以让我们使用不同的 js 模块并且能良好兼容共存。Backgon.js 和 RequireJs 给我们提供了一套框架和标准code。我们选择 Backbon 因为相比 RequireJS它提供了令人满意的灵活性和自定义性。Jquery,Modernize,SockJS,Underscore.js 和 Hammer.js 是我们使用的一些库,我们同样使用了诸如 Mocha 和 Chai 来进行测试。

除此之外,我们还使用了一些其他的新技术:

新的 PHP 渲染框架

切换到一个对动态内容要求更好的网站,我们需要使用一个新的渲染引擎,可以快速地利用于大量的有不同需求的文章。现有的 PHP 框架提供了坚实的基础,但是我们仍然选择重新构建一个。为了满足订制服务不同的内容需求,我们在开发的时候使用考虑到增加灵活性的需求,我们的框架必须动态呈现不同的布局和配置在同一页的能力。

新架构简化了开发的,还让我们可以仅用几行代码就能创建强大的应用程序。现在开发一个应用可以使用已有的组件,显著地减少了开发时间。此外,可用模块的复用节省了我们的大量的时间。

提高服务器端缓存速度

有如此多的动态页面,我们的平台需要一个强大的反向代理来保证 PHP 后台不会崩溃。去年五月纽约时代的移动站的Varnish 系统成功给了我们信心,我们相信 Varnish 也是这次我们的最佳选择。Varnish 是高度可配置,从服务器缓存中读取速度极大地加快了。它使得那些经常变化的界面能被缓存更短时间。

前端优化:

利用 Grunt,我们优化了我们的代码,减少了 http 请求,现在我们的文章页包含被同步下载的三个压缩了的 css 和 js 文件,相比以前的80多个没精简的文件,这是一个显著的改善。在网页的底部,我们使用 RequireJS 异步加载多个文件进行前端渲染。无 Cookie 的 CDN 和缓存HEAD 的设置使得我们的读者将下载更少字节的代码。配合 Varnish 系统,如今我们打开一篇文章能控制在500-1000毫秒之内。

所有的js 都可能造成阻塞,所以最大的性能改进来自于广告的异步加载。广告是令人头疼的,我们不能简单地直接将代码添加到 DOM 之中,而不担心页面的内容被覆盖。相反,所有的广告必须在 iframe和 Content 载入完毕后才进行加载,以避免导致页面渲染的潜在问题。

开发的过程中我们还使用了图片 sprites,我们所有的图片都存在一个叫 sprite-me 的文件夹中,配合 grunt 和 less 我们可以很方便地生成和使用不同的图标和图片,确定图像的 postion 位置。最后,我们使用 Underscore 编译的 HTML 模板,所以他们可以容易地”required”,并迅速地渲染出来。

总结:

如今我们的新平台包含了更强大的发布和互动功能,我们还在不断地改进这个平台,不断地迭代。这个新平台也让我们的团队能更加敏捷地进行新的学习和开发。尽管我们还有很多遗留技术问题,但是我们已经建立了一个值得依赖的技术团队,相信以后大家能更好地开发解决问题。

下一次,我们的团队的其他开发者将深入介绍这次重构使用的这些技术,从 Websockets 到 php 框架,尽请期待。

译者@罗罗磊磊

本译文在 Google doc 上公开,如果您发现某些翻译的错误、不妥,或对某些语句有更好的翻译,欢迎修改和润色。
https://docs.google.com/document/d/1kEGcSm6AiUBgsPKDiHo0FJYGhEtNElA5Iagizy2vA1Q/edit?usp=sharing

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,584评论 25 707
  • 是夜,风依旧再吹。漆黑的夜空没有一丝光亮,不见曾经的星河漫天。剩下无尽的枯寂,有一段往事,只有开始,没有结局。记得...
    枫沉默阅读 203评论 0 0
  • 有故事的人拥有一颗孩童的心。用一颗孩童的心写我和你的故事来换你不离不弃。 单纯的认为你是我的全部,每天晚安爱你不断...
    写心写海阅读 91评论 0 3
  • 有个笑话,一个农妇进入一个博士群。有人提问,一滴水从天上很高的地方自由落体下来会不会砸死人。这个笑话很普遍我就不在...
    Bruceshaoshao阅读 166评论 0 0
  • 今天在写作群里二美的追星历程提到了李晨,让我想起了李晨在《士兵突击》里扮演的吴哲。让我不禁想起那部我喜爱的...
    晓雪Eileen阅读 339评论 1 2