產(chǎn)品前端架構(gòu) 4——技術(shù)選型

1.模塊化

模塊

模塊組織指的是 JS 腳本的模塊組織

模塊職責(zé):封裝實(shí)現(xiàn),暴露接口,聲明依賴


模塊系統(tǒng)

模塊系統(tǒng)主要的兩個(gè)職責(zé):依賴管理,決定模塊寫法

commonjs

依賴聲明:var math = require("./math")

暴露接口:exports.Caculator = Caculator

優(yōu)點(diǎn):

依賴管理成熟可靠斯棒;社區(qū)活躍,規(guī)范接受度高照弥;運(yùn)行時(shí)支持,模塊定義非常簡單进副;

文件級別的模塊作用域隔離产喉;可以處理循環(huán)依賴

缺點(diǎn):

不是標(biāo)準(zhǔn)組織的規(guī)范;同步的 require 沒有考慮瀏覽器環(huán)境


有工具把多個(gè)文件級別的模塊打包成一個(gè)文件,引入單個(gè)文件可在瀏覽器中使用(browserify曾沈,webpack这嚣,component)

首先全局安裝 browserify 模塊,在命令行輸入?

browserify caculator.js>caculator-bunde.js

文件被函數(shù)體包起來塞俱,形參為 require姐帚,module,exports


AMD

由于 commonjs 天然的不適合異步環(huán)境

AMD 是天然地作用于異步環(huán)境(IO環(huán)境)

依賴聲明及注入:define(["./math"],function(math){...})

接口暴露:return {Caculator:Caculator}

同時(shí) AMD 支持 Simplified CommonJS wrapping障涯,用一層函數(shù)把 commonjs 包裹起來:

define(function(require,exports){...})

獲取依賴列表:通過 function.toString() 打印函數(shù)體罐旗,再用正則表達(dá)式提取

AMD 還有一個(gè)在草案階段的 Loader Plugins 規(guī)范,定義了 AMD 可以加載其他資源

完整組件 = 結(jié)構(gòu) + 邏輯 + 樣式

define(["regularjs","text!path/to/foo.html","css!path/to/style.css"],function(Regular,template){...})

優(yōu)點(diǎn):

依賴管理成熟可靠唯蝶;社區(qū)活躍九秀,規(guī)范接受度高;專為異步 IO 環(huán)境打造粘我,適合瀏覽器環(huán)境鼓蜒;

支持類似 commonjs 的書寫方式;通過插件 API 可支持加載非 js 資源征字;

成熟的打包工具都弹,并可結(jié)合插件

缺點(diǎn):

模塊定義繁瑣,需要額外嵌套匙姜;只是庫級別的支持畅厢,需要引入額外庫;

無法處理循環(huán)依賴氮昧;無法實(shí)現(xiàn)條件加載


ES6 module

未來JS支持的模塊化標(biāo)準(zhǔn)

import{add} from './math'; 引入依賴

export{Caculator}暴露接口

優(yōu)點(diǎn):

是真正的規(guī)范框杜,未來的模塊標(biāo)準(zhǔn);語言級別的關(guān)鍵字支持袖肥;適應(yīng)所有 JavaScript 運(yùn)行咪辱;

同樣可處理循環(huán)依賴

缺點(diǎn):

規(guī)范并未到穩(wěn)定級別;基本還沒有瀏覽器支持昭伸;現(xiàn)有項(xiàng)目使用


System js

支持加載 AMD?

支持加載 CommonJS

支持加載 ES6

支持 Transpiler梧乘,可支持任意資源


2.框架

框架和類庫

庫:針對特定問題的解答澎迎;不控制應(yīng)用程序庐杨;被動(dòng)的被調(diào)用

框架:控制反轉(zhuǎn);決定應(yīng)用程序的生命周期夹供;一般會集成大量的庫

解決方案:DOM Communication Utility Templating Component Routing Architecture

為什么使用解決方案:

開發(fā)效率灵份;可靠性(瀏覽器兼容性/測試覆蓋);更好的配套(文檔/Demo/工具)

設(shè)計(jì)得更好哮洽;專業(yè)性

什么時(shí)候不使用:

問題過于簡單填渠;備選框架的質(zhì)量與可控性無法保證;無法滿足當(dāng)前業(yè)務(wù)需求;團(tuán)隊(duì)中已有相關(guān)積累


解決方案

1.DOM操作

提供便利的 DOM 查詢 / 操作 / 移動(dòng)等操作

提供事件綁定 / 事件等支持

提供瀏覽器特性檢測氛什、UA 檢測

提供節(jié)點(diǎn)屬性莺葫、樣式、類名等操作

保證所有以上操作實(shí)現(xiàn)目標(biāo)平臺的跨瀏覽器支持

jQuery

優(yōu)點(diǎn):社區(qū)強(qiáng)大枪眉,普及率高捺檬;包裝對象,不污染原生贸铜;基本上專注于 DOM

缺點(diǎn):包裝對象堡纬,容易混淆;接口兩義性蒿秦;社區(qū)水平層次不齊烤镐,容易踩坑

Zepto.js

優(yōu)點(diǎn):小,啟動(dòng)快棍鳖;接口與 jQuery 兼容炮叶;提供了簡單的手勢

缺點(diǎn):與 jQuery 不能做到百分百對應(yīng);支持瀏覽器少鹊杖、功能較弱

mootools

優(yōu)點(diǎn):概念清晰悴灵,沒有包裝對象;接口設(shè)計(jì)優(yōu)秀骂蓖;源碼清晰易懂积瞒;不局限于 DOM 和 Ajax

缺點(diǎn):擴(kuò)展原生對象(致命);社區(qū)衰弱


DOM(專業(yè)領(lǐng)域)

手勢 Hammer.js:常見手勢封裝登下,包括 top,hold,transform,swipe等茫孔,并支持自定義擴(kuò)展

局部滾動(dòng) scroll.js:移動(dòng)端 position:fix + overflow:scroll 的救星

高級動(dòng)畫 Velocity.js:復(fù)雜動(dòng)畫序列實(shí)現(xiàn),不僅限于 dom

視頻播放 video.js:類似原生 video 標(biāo)簽的使用方式被芳,對低級瀏覽器回退到 flash 播放


2.Communication

處理與服務(wù)器的請求響應(yīng)

預(yù)處理請求數(shù)據(jù) / 響應(yīng)數(shù)據(jù) Error / Success 的判斷封裝

多種類型請求缰贝,統(tǒng)一接口

處理瀏覽器兼容性

Request

優(yōu)點(diǎn):支持 JSONP;穩(wěn)定 / IE6+ support畔濒;CORS 跨域剩晴;Promise/A 支持

quest

優(yōu)點(diǎn):更小的代碼量;支持 XmlHttpRequest2侵状;CORS 跨域赞弥;支持高級數(shù)據(jù)類型如 ArrayBuffer,Blob 和 FormData

socket.io

優(yōu)點(diǎn):實(shí)時(shí)性趣兄;支持二進(jìn)制數(shù)據(jù)流绽左;智能自動(dòng)的回退支持(非二進(jìn)制數(shù)據(jù)流);多種后端語言支持


3.Utility

提供 JS 原生不提供的功能

方法門面包裝艇潭,使其更易于使用

異步隊(duì)列 / 流程控制

兩種形式:Shim Extension


4. Templating

5.Component

提供基礎(chǔ)組件 CSS 支持

提供常用組件如 Slider拼窥、Modal

提供聲明式的調(diào)用方式

Bootstrap 和 Foundation


6.Routing

監(jiān)聽 url 變化戏蔑,并通知注冊的模塊

通過 JavaScript 進(jìn)行主動(dòng)跳轉(zhuǎn)

歷史管理

對目標(biāo)瀏覽器的兼容性支持

page.js:類似 Express.Router 的路由規(guī)則的前端路由庫

Director.js:可以前后端使用一套規(guī)則來定義路由

Stateman:用于處理深層復(fù)雜路由的獨(dú)立路由庫


7.Architecture

提供一種范式幫助(強(qiáng)制)開發(fā)者進(jìn)行模塊解耦

視圖與模型分離

更容易進(jìn)行單元測試

更容易實(shí)現(xiàn)應(yīng)用程序的擴(kuò)展

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鲁纠,隨后出現(xiàn)的幾起案子总棵,更是在濱河造成了極大的恐慌,老刑警劉巖改含,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彻舰,死亡現(xiàn)場離奇詭異,居然都是意外死亡候味,警方通過查閱死者的電腦和手機(jī)刃唤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來白群,“玉大人尚胞,你說我怎么就攤上這事≈穆” “怎么了笼裳?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粱玲。 經(jīng)常有香客問我躬柬,道長,這世上最難降的妖魔是什么抽减? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任允青,我火速辦了婚禮,結(jié)果婚禮上卵沉,老公的妹妹穿的比我還像新娘颠锉。我一直安慰自己,他們只是感情好史汗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布琼掠。 她就那樣靜靜地躺著,像睡著了一般停撞。 火紅的嫁衣襯著肌膚如雪瓷蛙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天戈毒,我揣著相機(jī)與錄音艰猬,去河邊找鬼。 笑死副硅,一個(gè)胖子當(dāng)著我的面吹牛姥宝,可吹牛的內(nèi)容都是我干的翅萤。 我是一名探鬼主播恐疲,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼腊满,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了培己?” 一聲冷哼從身側(cè)響起碳蛋,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎省咨,沒想到半個(gè)月后肃弟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡零蓉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年笤受,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敌蜂。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡箩兽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出章喉,到底是詐尸還是另有隱情汗贫,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布秸脱,位于F島的核電站落包,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摊唇。R本人自食惡果不足惜咐蝇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巷查。 院中可真熱鬧嘹害,春花似錦、人聲如沸吮便。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽髓需。三九已至许师,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間僚匆,已是汗流浹背微渠。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咧擂,地道東北人逞盆。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像松申,于是被迫代替她去往敵國和親云芦。 傳聞我的和親對象是個(gè)殘疾皇子俯逾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容