亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 剖析美團網站前端的組件化開發經驗

剖析美團網站前端的組件化開發經驗

熱門標簽:阿里機器人電銷 廣西防封卡外呼系統原理是什么 電銷外呼系統罵人 浙江呼叫中心外呼系統多少錢 地圖標注操作方法 清遠語音外呼系統平臺 地圖標注銷售好做嗎 地圖標注標記位置導航 機器人電銷哪個牌子好

前言
一位計算機前輩曾說過:

Controlling complexity is the essence of computer programming.
隨著前端開發復雜度的日益提升,組件化開發應運而生,并隨著 FIS、React 等優秀框架的出現遍地開花。這一過程同樣發生在美團,面臨業務規模的快速發展和工程師團隊的不斷擴張,美團歷經引入組件化解決資源整合問題、逐步增強組件功能促進開發效率、重新打造新一代組件化方案適應全棧開發和共享共建等階段,努力“controlling complexity”。本文將介紹美團組件化開發的實踐過程。

組件化 1.0:資源重組
在美團早期,前端資源是按照頁面或者類似業務頁面集合的形式進行組織的。例如 order.js 對應訂單相關頁面的交互,account.css 對應賬戶相關頁面的樣式。這種方式在過去的較長一段時間內,持續支撐了整個項目的正常推進,功勛卓著。

隨著業務規模的增加和開發團隊的擴張,這套機制逐漸顯示出它的一些不足:

1.資源冗余

頁面的逐漸增加,交互的逐漸復雜化,導致對應的 css 和 js 都有大幅度增長,進而出現為了依賴某個 js 中的一個函數,需要加載整個模塊,或者為了使用某個 css 中的部分樣式依賴整個 css,冗余資源較多

2.對應關系不直觀

沒有顯而易見的對應規則,導致的一個問題是修改某個業務模塊的 css 或者 js 時,幾乎只能依靠 grep。靠人來維護頁面模塊 html、css 和 js 之間的依賴關系,容易犯錯,常常出現內容已經刪除但是 css 或 js 還存在的問題。

3.難于單元測試

以頁面為最小粒度進行資源整合,不同功能的業務模塊相互影響,復雜度太高,自動化測試難以推進。
2013 年開始,在調研了 FIS、BEM 等方案之后,結合美團開發框架的實際,美團初步實現了一套輕量級的組件化開發方案。主要的改進是:

1.以頁面功能組件為單位聚合前端資源
2.自動加載符合約定的 css、js 資源
3.將業務數據到渲染數據的轉換過程獨立出來

舉例來說,美團頂部的搜索框就被實現為一個組件。

代碼構成:

復制代碼
代碼如下:

www/component/smart-box/
├── smart-box.js # 交互
├── smart-box.php # 渲染數據生產、組件配置
├── smart-box.scss # 樣式
├── smart-box.tpl # 內容
└── test
├── default.js # 自動化測試
└── default.php #

調用組件變得十足簡單:

JavaScript Code復制內容到剪貼板
  1. echo View::useComponent('smart-box', [   
  2.     'keyword' => $keyword   
  3. ]);  

對比之前,可以看到組件化的一些特點:

1.按需加載

只加載必要的前端資源

2.對應關系非常清晰

組件所需要的前端資源都在同一目錄,職責明確且唯一,對應關系顯著


3.易于測試

組件是具備獨立展現和交互的最小單元,可利用 Phantom 等工具自動化測試
此外,由于前端資源集中進行調度,組件化也為高階性能優化提供了空間。例如實現組件級別的 BigRender、通過數據分析進行資源的合并加載等等。

組件化 2.0:趨于成熟
組件化 1.0 上線后,由于簡單易用,很快得到工程師的認可,并開始在各項業務中應用起來。新的需求接踵而來,一直持續到 2014 年底,這個階段美團稱之為組件化 2.0。下面介紹下主要的幾個改進。

Lifecycle
組件在高內聚的同時,往往需要暴露一些接口供外界調用,從而能夠適應復雜的頁面需求,例如提交訂單頁面需要在支付密碼組件啟動完成后綁定提交時的檢查。Web Components、React 等都選擇了生命周期事件/方法,美團也是一樣。

組件的生命周期:

一個組件的完整生命周期包括:

1.init,初始化組件根節點和配置
2.fetch,加載 css 和 js 資源
3.render,內容渲染,默認的渲染內容方式是 BigRender
4.ready,進行數據綁定等操作
5.update,數據更新
6.destroy,解除所有事件監聽,刪除所有組件節點
組件提供 pause、resume 方法以方便進行生命周期控制。各個階段使用 Promise 串行進行,異步的管理更清晰。使用自定義語義事件,在修改默認行為、組件間通信上充分利用了 YUI 強大的自定義事件體系,有效降低了開發維護成本。

舉個例子,頁面初始化時組件的啟動過程實際也是借助生命周期實現的:

JavaScript Code復制內容到剪貼板
  1. var afterLoadList = [];   
  2. Y.all('[data-component]').each(function (node) {   
  3.     var component = new Y.mt.Component(node);   
  4.     // 綁定 init 生命周期事件,在 init 默認行為完成后執行回調   
  5.     component.after('init'function (e) {   
  6.         // 如果配置了延遲啟動   
  7.         if (e.config.afterLoad) {   
  8.             // 暫停組件生命周期   
  9.             e.component.pause();   
  10.             // 壓入延遲啟動數組   
  11.             afterLoadList.push(e.component);   
  12.         }   
  13.     });   
  14.     // 開始進入生命周期   
  15.     component.start();   
  16. });   
  17.   
  18. Y.on('load'function () {   
  19.     // 在頁面 load 事件發生時恢復組件生命周期   
  20.     afterLoadList.forEach(function (component) {   
  21.         component.resume();   
  22.     });   
  23. });  

回過頭來看,引入生命周期除了帶來擴展性外,更重要的是理順了組件的各個階段,有助于更好的理解和運用。

Data Binding
數據綁定是美團期盼已久的功能,將 View 和 ViewModel 之間的交互自動化無疑會節省工程師的大量時間。在組件化減少關注點和降低復雜度后,實現數據綁定變得更加可能。

美團最終實現的數據綁定方案主要參考了 Angular,通過在 html 節點上添加特定的屬性聲明綁定邏輯,js 掃描這些內容并進行相應的渲染和事件綁定。當數據發生變化時,對應的內容全部重新渲染。

JavaScript Code復制內容到剪貼板
  1. ul class="addressList">   
  2.     li   
  3.         mt-bind-repeat="addr in addrList"  
  4.         mt-bind-html="addr.text"  
  5.     >   
  6.     /li>   
  7. /ul>   
  8.   
  9. script>   
  10. Y.use(['mt-bind''mt-scope'], function () {   
  11.     Y.mt.bind.init(document.body);   
  12.     var scope = Y.one('.addressList').getScope();   
  13.     // 將 scope.addrList 設置為一個數組,DOM 上將自動渲染其內容      
  14.     scope.$set('addrList', [   
  15.         { text: "first address" },   
  16.         { text: "second address" }   
  17.     ]);   
  18. });   
  19. /script>  

使用屬性聲明綁定邏輯的好處是可以同時支持后端渲染,這對于美團團購這樣的偏展現型業務是非常必要的,用戶可以很快看到頁面內容。

Flux
實現數據綁定后,美團不得不面對另外一個問題:如何協同多個組件間的數據。因為某個組件的數據變化,很有可能引起其他組件的變化。例如當修改購買數量,總金額會變化,而總金額超過 500 后,還需要展示大額消費提醒。

為了解決這個問題,美團引入了 Flux,使用全局消息總線的思路進行跨組件交互。

例如因為交互復雜而一直讓美團非常頭疼的項目購買頁,在應用組件 + Flux 重構后,各模塊之間的互動更加清晰:

其他方面的改進還有很多,包括引入模板引擎 LightnCandy 約束模板邏輯、支持組件任意嵌套、支持異步加載并自動初始化等。

隨著組件化 2.0 的逐步完善,基本已經可以從容應對日常開發,在效率和質量方面都上了一個臺階。

組件化 3.0:重啟征程
時間的車輪滾滾前行,2014 年底,美團遇到一些新的機遇和挑戰:

基于 Node 的全棧開發模式開始應用,前后端渲染有了更多的可能性
YUI 停止維護,需要一套新的資源管理方案
新業務不斷增加,需要找到一種組件共享的方式,避免重復造輪子
結合之前的實踐,以及在這一過程中逐漸積累的對業內方案的認知,美團提出了新的組件化方案:

基于 React 開發頁面組件,使用 NPM 進行分發,方便共建共享
基于 Browserify 二次開發,建設資源打包工具 Reduce,方便瀏覽器加載
建設適應組件化開發模式的工程化開發方案 Turbo,方便工程師將組件應用于業務開發中


React
在組件化 2.0 的過程中,美團發現很多功能和 React 重合,例如 Data Binding、Lifecycle、前后端渲染,甚至直接借鑒的 Flux。除此之外,React 的函數式編程思想、增量更新、兼容性良好的事件體系也讓美團非常向往。借著前端全棧開發的契機,美團開始考慮基于 React 進行組件化 3.0 的建設。

NPM + Reduce
NPM + Reduce 構成了美團新的資源管理方案,其中:

NPM 負責組件的發布和安裝。可以認為是“分”的過程,粒度越小,重用的可能性越大
Reduce 負責將頁面資源進行打包??梢哉J為是“合”的過程,讓瀏覽器更快地加載
一個典型的組件包:

復制代碼
代碼如下:

smart-box/
├── package.json # 組件包元信息
├── smart-box.jsx # React Component
├── smart-box.scss # 樣式
└── test
└── main.js # 測試

NPM 默認只支持 js 文件的管理,美團對 NPM 中的 package.json 進行了擴展,增加了 style 字段,以使打包工具 Reduce 也能夠對 css 和 css 中引用的 image、font 進行識別和處理:

JavaScript Code復制內容到剪貼板
  1. {   
  2.     "style""./smart-box.scss"  
  3. }  

只要在頁面中 require 了 smart-box,經過 Reduce 打包后,js、css 甚至圖片、字體,都會出現在瀏覽器中。

JavaScript Code復制內容到剪貼板
  1. var SmartBox = require('@mtfe/smart-box');   
  2. // 頁面   
  3. var IndexPage = React.createClass({   
  4.     render: function () {   
  5.         return (   
  6.             Header>   
  7.                 SmartBox keyword={ this.props.keyword } />   
  8.             /Header>   
  9.             ...   
  10.         );   
  11.     }   
  12. });   
  13. module.exports = IndexPage;  

整體思路和組件化 1.0 如出一轍,卻又那么不同。

Turbo
單單解決分發和打包的問題還不夠,業務開發過程如果變得繁瑣、難以 Debug、性能低下的話,恐怕不會受到工程師歡迎。

為了解決這些問題,美團在 Node 框架的基礎上,提供了一系列中間件和開發工具,逐步構建對組件友好的前端工程化方案 Turbo。主要有:

1.支持前后端同構渲染,讓用戶更早看到內容
2.簡化 Flux 流程,數據流更加清晰易維護
3.引入 ImmutableJS,保證 Store 以外的數據不可變
4.采用 cursor 機制,保證數據修改/獲取同步
5.支持 Hot Module Replacement,改進開發流自動化
6.通過這些改進,一線工程師可以方便的使用各種組件,專注在業務本身上。開發框架層面的支持也反過來促進了組件化的發展,大家更樂于使用一系列組件來構建頁面功能。

小結
發現痛點、分析調研、應用改進的解決問題思路在組件化開發實踐中不斷運用。歷經三個大版本的演進,組件化開發模式有效緩解了業務發展帶來的復雜度提升的壓力,并培養工程師具備小而美的工程思想,形成共建共享的良好氛圍。毫無疑問,組件化這種“分而治之”的思想將會長久地影響和促進前端開發模式。美團現在已經準備好,迎接新的機遇和挑戰,用技術的不斷革新提升工程師的幸福感。

標簽:雅安 廊坊 伊春 沈陽 包頭 臺灣 江蘇 德宏

巨人網絡通訊聲明:本文標題《剖析美團網站前端的組件化開發經驗》,本文關鍵詞  剖析,美團,網站,前端,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《剖析美團網站前端的組件化開發經驗》相關的同類信息!
  • 本頁收集關于剖析美團網站前端的組件化開發經驗的相關信息資訊供網民參考!
  • 推薦文章
    国产91精品一区二区| 国产网站免费视频| 99久久精品国产高清一区二区 | 国产一区二区精品久| 日韩专区一区| 日日夜夜婷婷| 欧美电影免费| 日本在线www| 99色精品| 精品久久久久久中文字幕2017| 四虎影视库| 一级女性全黄生活片免费| 久久精品免视看国产成人2021| 精品视频在线观看一区二区 | 99久久精品国产国产毛片| 久久福利影视| 黄色免费三级| 国产福利免费视频| 成人av在线播放| 日韩欧美一及在线播放| 中文字幕Aⅴ资源网| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 99久久精品国产片| 精品国产亚洲人成在线| 成人免费一级纶理片| a级毛片免费观看网站| 欧美激情一区二区三区视频| 沈樵在线观看福利| 免费一级片在线观看| 四虎论坛| 九九九在线视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产麻豆精品视频| a级毛片免费观看网站| 欧美大片aaaa一级毛片| 国产精品免费精品自在线观看| 欧美电影免费| 青青青草影院 | 国产伦理精品| 91麻豆精品国产综合久久久| 精品久久久久久中文| 香蕉视频久久| 国产麻豆精品高清在线播放| 高清一级片| 国产网站麻豆精品视频| 成人高清护士在线播放| 精品在线免费播放| 日韩在线观看视频黄| 国产不卡精品一区二区三区| 精品国产一区二区三区精东影业| 香蕉视频三级| 欧美日本免费| 天天做日日爱| 成人免费网站视频ww| 国产麻豆精品hdvideoss| 日本在线www| 精品视频在线观看一区二区| 九九久久99综合一区二区| 国产高清视频免费| 久久精品大片| 黄视频网站在线免费观看| 久草免费资源| 精品视频在线观看一区二区 | 精品国产一区二区三区精东影业| 国产91精品一区二区| 日日日夜夜操| 台湾毛片| 九九免费精品视频| 国产91视频网| 日韩avdvd| 成人免费一级毛片在线播放视频| 欧美激情在线精品video| 国产极品白嫩美女在线观看看| 国产综合91天堂亚洲国产| 青青青草影院 | 香蕉视频久久| 麻豆午夜视频| 亚洲www美色| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品视频在线观看视频免费视频| 免费国产在线观看不卡| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产亚洲精品aaa大片| 精品视频在线观看一区二区| 成人高清免费| 日韩专区在线播放| 日韩中文字幕在线观看视频| 精品国产亚一区二区三区| 国产a毛片| 成人a级高清视频在线观看| 国产91精品一区| 精品国产一区二区三区免费| 亚洲精品中文一区不卡| 黄色福利片| 日韩一级黄色| 亚洲天堂免费| 欧美日本韩国| 99久久精品国产高清一区二区 | 麻豆网站在线免费观看| 久久精品免视看国产成人2021| 四虎精品在线观看| 精品国产亚洲一区二区三区| 精品国产香蕉伊思人在线又爽又黄| 国产视频网站在线观看| a级黄色毛片免费播放视频| 午夜激情视频在线播放| 精品国产一区二区三区国产馆| 一级女性大黄生活片免费| 精品国产一区二区三区久 | 欧美电影免费看大全| 国产国语对白一级毛片| 久久99这里只有精品国产| 青青青草视频在线观看| 欧美激情一区二区三区中文字幕| 久久国产精品只做精品| 欧美爱色| 成人免费一级毛片在线播放视频| 国产一区免费观看| 成人免费观看网欧美片| 韩国毛片免费大片| 国产精品1024永久免费视频| 青青久在线视频| 午夜激情视频在线播放| 高清一级片| 99久久精品国产国产毛片| 国产伦精品一区三区视频| 欧美爱爱动态| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩一级黄色| 麻豆午夜视频| 亚欧乱色一区二区三区| 国产成人精品在线| 国产不卡精品一区二区三区| 国产亚洲精品aaa大片| 可以在线看黄的网站| 日韩免费在线视频| 日本在线不卡免费视频一区| 毛片高清| 久久久久久久久综合影视网| 欧美另类videosbestsex视频| 久久久久久久免费视频| 99久久精品国产片| 久久精品店| 国产伦久视频免费观看视频| 青青青草视频在线观看| 国产a视频| 91麻豆精品国产综合久久久| 天天做人人爱夜夜爽2020| 国产成人精品影视| 美女免费黄网站| 日本免费看视频| 999精品在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日韩免费在线观看视频| 久久99欧美| 99热热久久| 日韩专区第一页| 麻豆系列 在线视频| 国产一级强片在线观看| 国产91丝袜在线播放0| 一级毛片视频免费| 你懂的在线观看视频| 精品久久久久久中文字幕一区| 色综合久久天天综合绕观看| 国产一区二区精品在线观看| 在线观看成人网 | 免费国产在线观看| 成人免费观看视频| 日韩欧美一二三区| 黄视频网站在线免费观看| 香蕉视频三级| 九九久久99| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日本在线不卡视频| 91麻豆国产福利精品| 黄色免费网站在线| 欧美激情在线精品video| 日韩av成人| 九九精品在线| 欧美爱色| 欧美爱色| 毛片高清| 黄视频网站免费观看| 天天做日日爱夜夜爽| 青青青草影院| 精品国产一区二区三区免费| 麻豆网站在线免费观看| 亚洲精品中文一区不卡| 精品久久久久久影院免费| 国产a网| 一级毛片视频免费| 成人免费观看网欧美片| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 成人影院一区二区三区| 超级乱淫黄漫画免费| 日本在线不卡视频| 成人影视在线播放| 国产一区二区福利久久| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 午夜在线亚洲|