糯米PC端重构之思考

糯米PC是一个典型的PC站点页面,包含一个团购网站所需要的全部功能,从网站开发角度来讲,是一个典型的website开发模式。

该网站的前端架构是以百度内部的前端开发框架FIS为基础搭建的。经过了N帮人的交接,现在的代码变得难以维护,所以近期打算对糯米的PC进行一次重构。

重构的目的主要为以下几点:

  • 解决现有的问题
  • 提升开发效率
  • 提高代码的可维护性和拓展性

现状梳理

先来看看现在代码遇到的几个棘手的问题吧:

没有合理的模块化

这个应该是代码编写的问题,而不是框架的问题。一个典型有问题的js代码结构如下:

var xxx = require('xxx'); // 拿到依赖


$(function () {
    function a () {
        // do something
    }
    
    function b () {
        // do something
    }
    
    function init() {
        a();
        b();
    }
    init();
});

看到这个也是醉了,首先因为经过FIS的处理之后,js代码都是在body标签之前加载的,所以大部分的jquery的ready函数都是没有意义的。而且代码没有以模块的方式给外部提供相应的接口来进行调用和处理,对于业务逻辑之间相互调用和测试十分不便。

前端代码和后端模板耦合

这应该是FIS的特性引起的,FIS有一个widget的功能,利用它可以在smarty之间互相调用每个组件,同时加载相应的静态资源。代码实例如下:

{%function name="header" isWanda=false%}
<div class="header">
    <span class="header-title">下载手机版</span>
</div>

{%require name='common:widget/header/sug/sug.less'%} // 自动加载less

{%script%}
    require.async([
        'common:widget/header/header.js' // 调用js
    ]);
{%/script%}
{%/function%}

//调用的时候
{%widget call="header" isWanda="true"%}

在一个模板片段的包含了htmljscss三种资源的关系, 这可以方便的在其他调用这个widget,而不需要管理它的cssjs,这是它的一个优点。

但是随着开发的业务逻辑越来越多,会发现越来越多的业务逻辑会放在smarty中直接完成。。。。后来发现大部分业务逻辑都是php写的有木有~~~新来的同学就会抱怨一句:“我是来写前端的,怎么叫我写php!!!”。更让人不爽的是,如果页面有异步更新,比如ajax调用来更新结构,为了复用逻辑代码,只能叫后端直接去渲染smarty得到完整的html片段,然后塞进页面中,前端很难在数据做一些必要的二次修改。

同时smarty业务逻辑一旦出现异常(比如后端返回的数据接口不对或者编写php语法的有坑引起的),前端无法对异常进行相应的处理,导致部分页面可能直接无法显示。

调试困难

由于上面所说,大量组件和业务代码充斥在smarty中,前端无法更好的利用浏览器进行调试,只能去看php的错误日志。。。这种情况下,整个开发过程变得十分被动(虽然我们建议一个前端可以简单能查看后端的错误日志)。

代码难以测试

由于smarty承担了大部分的职责,各种前端测试框架都没用了鸟~~

解决之道

经过前面简单的梳理,可以发现糯米的架构是跟整个社区的前端开发趋势是有所背离的。以下是具体的修改思路:

代码模块化管理

这个没什么好说的,首先,我们去除了FIS自带的包管理机制,采用社区常用的AMD或者CommonJS作为模块管理的形式,每个模块提供相应的初始化接口。

利用bower或者npm作为包管理工具。

以JS为中心

所有的业务逻辑全部采用JS来编写,后端模板只用来承载相应的首屏信息。同时要求后端人员编写前端开发所需的数据接口形式的数据。对于各个业务逻辑之间通信采用相应的接口,或者以全局事件的方式进行通信。

全站组件形式组织

FIS的widget给了我们对于组件的编写一定的启发,我们r认为组件是以htmljscss三种资源结合起来的
因此思考了组件的基本结构如下:

├── search
│   ├── main.js
│   ├── main.less
│   ├── main.tpl
│   ├── mock.json
│   └── suggestion.html

上面显示的是一个基本的widget结构,包含所有的资源。我们通过js来管理less,其中suggestion.html这个我们用来处理异步功能的前端模板片段,通过前端模板引擎可以方便地在js中调用。如何实现各种资源的无缝调用,我会在下篇的具体实践中讲一下。

效果收益

总结一下,收益有以下几点:

  • JS负责资源管理和业务逻辑,给予前端最大的灵活度,维护性加强
  • 通过karma等前端开发框架,方便对新代码进行测试
  • 因为保留FIS原有的上线、部署功能,提高前端工程化效率

待解决的问题

后端模板去留

后端模板对于前端最好的方式当然是不再使用。基于对于糯米现有的业务形式,需要考虑SEO,首屏速度等条件制约下,还是暂时保留了,但是我们通过了smarty4js这个同事编写的npm模块,最大程度地减少了编写同一份模板的工作。

资源打包

因为去除了FIS的大部分功能,我们必须通过另外一个途径来实现JS对各个资源的调用问题,对网上的许多解决方案进行了调研,发现webpack这一facebook出品的神器,能解决我们遇到的大部分问题。

下一篇来说说我们的具体实践过程

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

推荐阅读更多精彩内容

  • 前端集成解决方案要求: 模块化开发。最好能像写nodejs一样写js,很舒服。css最好也能来个模块化管理! 性能...
    Www刘阅读 3,022评论 1 20
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,312评论 25 707
  • 上一篇文章谈到了重构的原因和基本思路,在这片文章里我们将具体地阐述我们是如何做的。 技术选型 基本采用了原有的技术...
    沈礼阅读 1,820评论 0 7
  • “星女郎”林允因星爷的《美人鱼》大火,她那可爱的小虎牙也被大家所熟记。近日,林允穿一身黑裙出席电影发布会。笑容灿烂...
    d5d32ce7ee8e阅读 417评论 0 0
  • 不知道写什么,可是每天要写,那就碎碎念下吧。 今天是入职三个月的答辩了,昨晚连夜做好了PPT,就看今天讲PPT的表...
    闻舒阅读 164评论 0 0