框架就是提供了前端項目整體解決方案。庫就是自己組合來實現(xiàn)項目。
某種層面上來說每辟,前端庫就像我平時家里的工具箱塔淤,里面有起子、錘子斥杜,我們可以通過這個工具箱來給小孩子創(chuàng)造玩具虱颗,我們甚至可以自己創(chuàng)造一些工具,方便我們?nèi)蘸髣?chuàng)造玩具蔗喂。而框架忘渔,更像是我們在淘寶上買好了車的骨架,回來后拼裝好了缰儿,可以根據(jù)自己的需要畦粮,貼上不同的貼紙,噴上不同的顏色返弹,我們跟其他使用框架的人锈玉,拿到手上的玩具骨架都是一樣的,我們很難自己去改變义起。
前端基于js的框架(frameworks)/庫(librarys)更是層出不窮拉背,且各自都有其自身的優(yōu)勢以及劣勢,有些是向開發(fā)使用者提供整套的服務(wù)默终,比如MVC一整套椅棺,有些則是專注于某一個點(diǎn),比如專注于dom操作或異步請求齐蔽;
框架與庫之間最本質(zhì)區(qū)別在于控制權(quán):you call libs, frameworks call you(控制反轉(zhuǎn))
庫:庫是更多是一個封裝好的特定的集合两疚,提供給開發(fā)者使用,而且是特定于某一方面的集合(方法和函數(shù))含滴,庫沒有控制權(quán)诱渤,控制權(quán)在使用者手中,在庫中查詢需要的功能在自己的應(yīng)用中使用谈况,我們可以從封裝的角度理解庫勺美;
框架:框架顧名思義就是一套架構(gòu)递胧,會基于自身的特點(diǎn)向用戶提供一套相當(dāng)于叫完整的解決方案,而且控制權(quán)的在框架本身赡茸,使用者要找框架所規(guī)定的某種規(guī)范進(jìn)行開發(fā)缎脾。
其實框架和庫關(guān)系還是很緊密的,他們以聚合的形式讓我們在所要開發(fā)的應(yīng)用中使用占卧;現(xiàn)在嘗試?yán)斫庖幌聝蓤D下圖:
在實際中遗菠,像angular、backbone华蜒、vue就屬于框架辙纬,而jQuery、React友多、underscore就是庫牲平,在前者中我們完全可以自由的使用后者,同時也可以沒有前者的基礎(chǔ)之上使用后者域滥,都是很自由纵柿,控制權(quán)始終在我們的手中,但是使用框架時候就必須按照它的規(guī)范來進(jìn)行模塊化的開發(fā)启绰;
可能有人會問react也是庫么昂儒?的確它就是一個庫,為什么呢委可?
評論區(qū):React和react-router, react-redux結(jié)合起來才叫框架渊跋,本身只是充當(dāng)一個前端渲染的庫而已;感謝@米斯特white的提出
開頭有說到框架是有一套解決方案的着倾,react就是純粹寫UI組件的 沒有什么異步處理機(jī)制拾酝、模塊化、表單驗證這些
庫卡者、插件蒿囤、組件、控件崇决、擴(kuò)展
組件本質(zhì):封裝材诽。一定程度上可以約等于模塊化,調(diào)用者只需關(guān)注輸入和輸出恒傻,總思想就是分而治之脸侥、重復(fù)利用。低耦合盈厘;
組件解決資源整合問題睁枕、增強(qiáng)功能促進(jìn)開發(fā)效率。提高可維護(hù)性,便于協(xié)同開發(fā)譬重,每個模塊都可以分拆為一個組件拒逮,例如異步請求組件罐氨,路由組件臀规,各個視圖組件。
庫:為解決某種特定需求的程序功能集合栅隐;即library塔嬉,如jquery,常用于方便dom操作租悄、解決瀏覽器兼容等問題谨究。
插件:參與程序內(nèi)部運(yùn)行環(huán)節(jié)的一段或多段代碼集合;即Plugin泣棋,遵循一定規(guī)范寫出來方便程序展示效果胶哲,擁有特定功能且方便調(diào)用。如輪播圖和瀑布流插件潭辈,
擴(kuò)展:使用程序API擴(kuò)展程序適用面的一段或多段代碼集合鸯屿;即Extension,
組件:可重復(fù)使用并且可以和其他對象進(jìn)行交互的對象把敢;即Component寄摆,能復(fù)用的js代碼其實跟插件差不多,區(qū)別可能就是插件專注于特定功能而組件更專注于復(fù)用吧修赞。
控件:提供或?qū)崿F(xiàn)用戶界面功能的組件婶恼,控件即組件,反之不一定柏副。即Control勾邦,
組件(Component)是是一個含義很大的概念,一般是指軟件系統(tǒng)的一部分割择,承擔(dān)了特定的職責(zé)眷篇,可以獨(dú)立于整個系統(tǒng)進(jìn)行開發(fā)和測試,一個良好設(shè)計的組件應(yīng)該可以在不同的軟件系統(tǒng)中被使用(可復(fù)用)锨推。例如V8引擎是Chrome瀏覽器的一部分铅歼,負(fù)責(zé)運(yùn)行JavaScript代碼,這里V8引擎就可以視為一個組件换可。V8引擎同時也是Node.js的javascript解釋器椎椰,這體現(xiàn)了組件的可復(fù)用性。
庫(Library)是一系列預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu)和函數(shù)(對于面向?qū)ο笳Z言來說沾鳄,是類)的集合慨飘,程序員通過使用這些數(shù)據(jù)結(jié)構(gòu)和函數(shù)實現(xiàn)功能。例如Moment.js是一個javascript庫,提供了處理時間的一些函數(shù)瓤的。
框架(Framework)也是一系列預(yù)先定義好的數(shù)據(jù)結(jié)構(gòu)和函數(shù)休弃,一般用于作為一個軟件的骨架,但程序真正的功能還需要由開發(fā)者實現(xiàn)圈膏∷框架和庫的最大區(qū)別在于“控制反轉(zhuǎn)”,當(dāng)你使用一個庫稽坤,你會調(diào)用庫中的代碼丈甸,而當(dāng)你使用一個框架,框架會調(diào)用你的代碼尿褪∧览蓿框架和庫是一個有交叉的概念,很多框架都是以庫的形式發(fā)布的杖玲,例如Java的Spring MVC框架顿仇,其發(fā)布的jar包本身就是一個庫。而一個庫如果也能通過依賴反轉(zhuǎn)的方式進(jìn)行擴(kuò)展摆马,那也可以視為一個框架臼闻,例如Python的markdonw解析庫Python Markdown,可以添加自定義的解析擴(kuò)展今膊,那么可以被視為一個markdonw解析框架些阅。
插件(Plugin)和擴(kuò)展(extension)是兩個很相似的概念,我沒有辦法在軟件系統(tǒng)的角度給出這二者的區(qū)別斑唬。插件(或擴(kuò)展)是對已有應(yīng)用程序或者庫的功能補(bǔ)充市埋,一個軟件的插件(或擴(kuò)展)是實現(xiàn)了該軟件預(yù)定義接口的組件,用來向已有的軟件添加功能恕刘。插件在目標(biāo)軟件發(fā)布時可以不預(yù)先包含缤谎,而是在運(yùn)行時被使用者注冊,然后再被目標(biāo)軟件調(diào)用褐着。另一個很接近的概念是加載項(Add-on)坷澡,可以認(rèn)為加載項是插件(或擴(kuò)展)的子集,是僅針對應(yīng)用程序來說的功能補(bǔ)充含蓉。一個插件的例子是Flash的瀏覽器插件频敛,為瀏覽器實現(xiàn)了運(yùn)行Flash程序的功能。
控件(Control)是gui編程的一個概念馅扣,一般來說一個最終用戶可以看到的斟赚、可交互的組件,被稱為一個控件差油。例如.NET編程中的System.Windows.Controls.Button是一個控件拗军。
轉(zhuǎn)自:https://zhuanlan.zhihu.com/p/26078359?group_id=830801800406917120