如何优雅地共享Header和Footer

偶然在微博看到在SegmentFault上的一个共享Header和Footer的问题,而正好咱们也解决了这个问题。在这里,就分享一下咱们的经验咯。html

业务场景

咱们的业务环境和58同城、搜房网这一类站点差很少。咱们维护的站点主要有三个页面:react

  • 一个用于搜索的首页json

  • 一个搜索结果页微信

  • 一个用于显示商品信息的详细页。架构

整体上和Google相似,有一个简洁的首页,一个搜索结果页,以及目标网站页。在旧有的系统中,这三个不一样的页面都是同一个代码库中。框架

而对于咱们的新系统来讲,这些都是独立的项目。由于咱们须要同Google同样能够快速打开首页,首页就变成了一个部份内容是动态的,可是大部分时间是静态网站。这一点能够参考我以前的另一篇文章《编辑-发布-开发分离》,仅仅只在编辑更新内容的时候,才生成新的首页(静态页面)。在这时,因为能限制用户的访问速度,莫过于CDN了。工具

同时,咱们还有几个不一样的博客及十几个引流站点,这些都须要使用一样的Header和Footer。对应于咱们的其余页面,咱们使用React来构建,这意味着咱们须要不一样的模板。网站

而且当咱们在设计新的系统的时候,咱们有了一个更新网站UI的计划。这意味着咱们在替换旧有的系统完成以前,咱们须要更新全部网站的UI,WTF!spa

Header和Footer架构

So,在这时咱们设计了第一个Share Header和Footer的架构。设计

基于包与模板的共享

接着,因为Release时间的限制,咱们并无在一开始的时候实现基于脚本的共享方式。所以咱们使用了内部的UI框架,同时这个UI框架将会在咱们的全部站点上使用——咱们可使用一样的HTML和CSS。

所以在咱们的新站点上,咱们使用基于Bower与GitHub的Release方案——咱们使用Grunt做为构建工具。每次在本地启动Server的时候,咱们都会更新依赖。所以,在咱们的站点上,咱们只须要更新bower.json中的版本号便可。

而对于咱们的旧有站点上,由于是一个遗留系统,没有这么先进的工具。而且从理论上来讲,不该该会太多的时间和精力在上面,因而咱们选择了手动复制的方案。

对于博客和其余站点,一部分使用手动复制,一部分使用iFrame加载。所以在Release新版本的时候,咱们会上传新的Header和Footer到AWS S3上。

对于iFrame的站点来讲,他们就实现了动态更新。对于其余站点来讲,就须要手动更新。虽是如此,可是对于业务已经固定的网站来讲,Header和Footer只会一年更新一两次。不过,若是发生收购和被收购时,会多更新一两次。

那么,对于那些使用的不是基于HTML,而是使用模板的站点怎么办?

脚本生成的共享方式

最明显的一个问题就是使用React的站点。由于大部分的模板引擎都是能够支持class="",而React你只能用className=""。因此要么,咱们将HTML写在基本的模板文件里,如base.html;要么咱们将class替换成className。架构变换成以下所示的结构:

Header和Footer架构与React

因此,在这时理想的方式就是经过某种类型的模板来生成对应的模板。即咱们只须要有一个JSX的模板文件,而后替换其中的相应内容便可。

欢迎关注个人微信公众号(或搜索phodal):

图片描述

相关文章
相关标签/搜索