糯米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閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內容

  • 前端集成解決方案要求: 模塊化開發。最好能像寫nodejs一樣寫js,很舒服。css最好也能來個模塊化管理! 性能...
    Www劉閱讀 3,044評論 1 20
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,734評論 25 708
  • 上一篇文章談到了重構的原因和基本思路,在這片文章里我們將具體地闡述我們是如何做的。 技術選型 基本采用了原有的技術...
    沈禮閱讀 1,853評論 0 7
  • “星女郎”林允因星爺的《美人魚》大火,她那可愛的小虎牙也被大家所熟記。近日,林允穿一身黑裙出席電影發布會。笑容燦爛...
    d5d32ce7ee8e閱讀 426評論 0 0
  • 不知道寫什么,可是每天要寫,那就碎碎念下吧。 今天是入職三個月的答辯了,昨晚連夜做好了PPT,就看今天講PPT的表...
    聞舒閱讀 169評論 0 0