vue對(duì)比react匈子、Angular(轉(zhuǎn)官方文檔)
React 和 Vue 有許多相似之處路召,它們都有:
使用 Virtual DOM
提供了響應(yīng)式 (Reactive) 和組件化 (Composable) 的視圖組件续室。
將注意力集中保持在核心庫(kù)栋烤,而將其他功能如路由和全局狀態(tài)管理交給相關(guān)的庫(kù)。
由于有著眾多的相似處挺狰,我們會(huì)用更多的時(shí)間在這一塊進(jìn)行比較明郭。這里我們不只保證技術(shù)內(nèi)容的準(zhǔn)確性,同時(shí)也兼顧了平衡的考量丰泊。我們需要承認(rèn) React 比 Vue 更好的地方薯定,比如更豐富的生態(tài)系統(tǒng)。
React 社區(qū)為我們準(zhǔn)確進(jìn)行平衡的考量提供了非常積極的幫助瞳购,特別感謝來(lái)自 React 團(tuán)隊(duì)的 Dan Abramov 话侄。他非常慷慨的花費(fèi)時(shí)間來(lái)貢獻(xiàn)專(zhuān)業(yè)知識(shí)來(lái)幫助我們完善這篇文檔。
React 和 Vue 都是非衬甓眩快的吞杭,所以速度并不是在它們之中做選擇的決定性因素。對(duì)于具體的數(shù)據(jù)表現(xiàn)嘀韧,可以移步這個(gè)第三方 benchmark篇亭,它專(zhuān)注于渲染/更新非常簡(jiǎn)單的組件樹(shù)的真實(shí)性能。
優(yōu)化
在 React 應(yīng)用中锄贷,當(dāng)某個(gè)組件的狀態(tài)發(fā)生變化時(shí)译蒂,它會(huì)以該組件為根,重新渲染整個(gè)組件子樹(shù)谊却。
如要避免不必要的子組件的重渲染柔昼,你需要在所有可能的地方使用PureComponent,或是手動(dòng)實(shí)現(xiàn)shouldComponentUpdate方法炎辨。同時(shí)你可能會(huì)需要使用不可變的數(shù)據(jù)結(jié)構(gòu)來(lái)使得你的組件更容易被優(yōu)化捕透。
然而,使用PureComponent和shouldComponentUpdate時(shí)碴萧,需要保證該組件的整個(gè)子樹(shù)的渲染輸出都是由該組件的 props 所決定的乙嘀。如果不符合這個(gè)情況,那么此類(lèi)優(yōu)化就會(huì)導(dǎo)致難以察覺(jué)的渲染結(jié)果不一致破喻。這使得 React 中的組件優(yōu)化伴隨著相當(dāng)?shù)男闹秦?fù)擔(dān)虎谢。
在 Vue 應(yīng)用中,組件的依賴(lài)是在渲染過(guò)程中自動(dòng)追蹤的曹质,所以系統(tǒng)能精確知曉哪個(gè)組件確實(shí)需要被重渲染婴噩。你可以理解為每一個(gè)組件都已經(jīng)自動(dòng)獲得了shouldComponentUpdate,并且沒(méi)有上述的子樹(shù)問(wèn)題限制羽德。
Vue 的這個(gè)特點(diǎn)使得開(kāi)發(fā)者不再需要考慮此類(lèi)優(yōu)化几莽,從而能夠更好地專(zhuān)注于應(yīng)用本身。
在 React 中宅静,一切都是 JavaScript章蚣。不僅僅是 HTML 可以用 JSX 來(lái)表達(dá),現(xiàn)在的潮流也越來(lái)越多地將 CSS 也納入到 JavaScript 中來(lái)處理姨夹。這類(lèi)方案有其優(yōu)點(diǎn)究驴,但也存在一些不是每個(gè)開(kāi)發(fā)者都能接受的取舍。
Vue 的整體思想是擁抱經(jīng)典的 Web 技術(shù)匀伏,并在其上進(jìn)行擴(kuò)展。我們下面會(huì)詳細(xì)分析一下蝴韭。
JSX vs Templates
在 React 中够颠,所有的組件的渲染功能都依靠 JSX。JSX 是使用 XML 語(yǔ)法編寫(xiě) JavaScript 的一種語(yǔ)法糖榄鉴。
JSX 說(shuō)是手寫(xiě)的渲染函數(shù)有下面這些優(yōu)勢(shì):
你可以使用完整的編程語(yǔ)言 JavaScript 功能來(lái)構(gòu)建你的視圖頁(yè)面履磨。比如你可以使用臨時(shí)變量蛉抓、JS 自帶的流程控制、以及直接引用當(dāng)前 JS 作用域中的值等等剃诅。
開(kāi)發(fā)工具對(duì) JSX 的支持相比于現(xiàn)有可用的其他 Vue 模板還是比較先進(jìn)的 (比如巷送,linting、類(lèi)型檢查矛辕、編輯器的自動(dòng)完成)笑跛。
事實(shí)上 Vue 也提供了渲染函數(shù),甚至支持 JSX聊品。然而飞蹂,我們默認(rèn)推薦的還是模板。任何合乎規(guī)范的 HTML 都是合法的 Vue 模板翻屈,這也帶來(lái)了一些特有的優(yōu)勢(shì):
對(duì)于很多習(xí)慣了 HTML 的開(kāi)發(fā)者來(lái)說(shuō)陈哑,模板比起 JSX 讀寫(xiě)起來(lái)更自然。這里當(dāng)然有主觀偏好的成分伸眶,但如果這種區(qū)別會(huì)導(dǎo)致開(kāi)發(fā)效率的提升惊窖,那么它就有客觀的價(jià)值存在。
基于 HTML 的模板使得將已有的應(yīng)用逐步遷移到 Vue 更為容易厘贼。
這也使得設(shè)計(jì)師和新人開(kāi)發(fā)者更容易理解和參與到項(xiàng)目中界酒。
你甚至可以使用其他模板預(yù)處理器,比如 Pug 來(lái)書(shū)寫(xiě) Vue 的模板涂臣。
有些開(kāi)發(fā)者認(rèn)為模板意味著需要學(xué)習(xí)額外的 DSL (Domain-Specific Language 領(lǐng)域特定語(yǔ)言) 才能進(jìn)行開(kāi)發(fā)——我們認(rèn)為這種區(qū)別是比較膚淺的盾计。首先,JSX 并不是免費(fèi)的——它是基于 JS 之上的一套額外語(yǔ)法赁遗,因此也有它自己的學(xué)習(xí)成本署辉。同時(shí),正如同熟悉 JS 的人學(xué)習(xí) JSX 會(huì)很容易一樣岩四,熟悉 HTML 的人學(xué)習(xí) Vue 的模板語(yǔ)法也是很容易的哭尝。最后,DSL 的存在使得我們可以讓開(kāi)發(fā)者用更少的代碼做更多的事剖煌,比如v-on的各種修飾符材鹦,在 JSX 中實(shí)現(xiàn)對(duì)應(yīng)的功能會(huì)需要多得多的代碼。
更抽象一點(diǎn)來(lái)看耕姊,我們可以把組件區(qū)分為兩類(lèi):一類(lèi)是偏視圖表現(xiàn)的 (presentational)桶唐,一類(lèi)則是偏邏輯的 (logical)。我們推薦在前者中使用模板茉兰,在后者中使用 JSX 或渲染函數(shù)尤泽。這兩類(lèi)組件的比例會(huì)根據(jù)應(yīng)用類(lèi)型的不同有所變化,但整體來(lái)說(shuō)我們發(fā)現(xiàn)表現(xiàn)類(lèi)的組件遠(yuǎn)遠(yuǎn)多于邏輯類(lèi)組件。
組件作用域內(nèi)的 CSS
除非你把組件分布在多個(gè)文件上 (例如CSS Modules)坯约,CSS 作用域在 React 中是通過(guò) CSS-in-JS 的方案實(shí)現(xiàn)的 (比如styled-components熊咽、glamorous和emotion)。這引入了一個(gè)新的面向組件的樣式范例闹丐,它和普通的 CSS 撰寫(xiě)過(guò)程是有區(qū)別的横殴。另外,雖然在構(gòu)建時(shí)將 CSS 提取到一個(gè)單獨(dú)的樣式表是支持的卿拴,但 bundle 里通常還是需要一個(gè)運(yùn)行時(shí)程序來(lái)讓這些樣式生效衫仑。當(dāng)你能夠利用 JavaScript 靈活處理樣式的同時(shí),也需要權(quán)衡 bundle 的尺寸和運(yùn)行時(shí)的開(kāi)銷(xiāo)巍棱。
如果你是一個(gè) CSS-in-JS 的愛(ài)好者惑畴,許多主流的 CSS-in-JS 庫(kù)也都支持 Vue (比如styled-components-vue和vue-emotion)。這里 React 和 Vue 主要的區(qū)別是航徙,Vue 設(shè)置樣式的默認(rèn)方法是單文件組件里類(lèi)似style的標(biāo)簽如贷。
單文件組件讓你可以在同一個(gè)文件里完全控制 CSS,將其作為組件代碼的一部分到踏。
@media (min-width: 250px) {
.list-container:hover {
background: orange;
}
}
這個(gè)可選scoped屬性會(huì)自動(dòng)添加一個(gè)唯一的屬性 (比如data-v-21e5b78) 為組件內(nèi) CSS 指定作用域杠袱,編譯的時(shí)候.list-container:hover會(huì)被編譯成類(lèi)似.list-container[data-v-21e5b78]:hover。
最后窝稿,Vue 的單文件組件里的樣式設(shè)置是非常靈活的楣富。通過(guò)vue-loader,你可以使用任意預(yù)處理器伴榔、后處理器纹蝴,甚至深度集成CSS Modules——全部都在標(biāo)簽內(nèi)。
向上擴(kuò)展
Vue 和 React 都提供了強(qiáng)大的路由來(lái)應(yīng)對(duì)大型應(yīng)用踪少。React 社區(qū)在狀態(tài)管理方面非常有創(chuàng)新精神 (比如 Flux塘安、Redux),而這些狀態(tài)管理模式甚至Redux 本身也可以非常容易的集成在 Vue 應(yīng)用中援奢。實(shí)際上兼犯,Vue 更進(jìn)一步地采用了這種模式 (Vuex),更加深入集成 Vue 的狀態(tài)管理解決方案 Vuex 相信能為你帶來(lái)更好的開(kāi)發(fā)體驗(yàn)集漾。
兩者另一個(gè)重要差異是切黔,Vue 的路由庫(kù)和狀態(tài)管理庫(kù)都是由官方維護(hù)支持且與核心庫(kù)同步更新的。React 則是選擇把這些問(wèn)題交給社區(qū)維護(hù)具篇,因此創(chuàng)建了一個(gè)更分散的生態(tài)系統(tǒng)纬霞。但相對(duì)的,React 的生態(tài)系統(tǒng)相比 Vue 更加繁榮驱显。
最后诗芜,Vue 提供了Vue-cli 腳手架侨舆,能讓你非常容易地構(gòu)建項(xiàng)目,包含了Webpack绢陌,Browserify,甚至no build system熔恢。React 在這方面也提供了create-react-app脐湾,但是現(xiàn)在還存在一些局限性:
它不允許在項(xiàng)目生成時(shí)進(jìn)行任何配置,而 Vue 支持Yeoman-like 定制叙淌。
它只提供一個(gè)構(gòu)建單頁(yè)面應(yīng)用的單一模板秤掌,而 Vue 提供了各種用途的模板。
它不能用用戶(hù)自建的模板構(gòu)建項(xiàng)目鹰霍,而自建模板對(duì)企業(yè)環(huán)境下預(yù)先建立協(xié)議是特別有用的闻鉴。
而要注意的是這些限制是故意設(shè)計(jì)的,這有它的優(yōu)勢(shì)茂洒。例如孟岛,如果你的項(xiàng)目需求非常簡(jiǎn)單,你就不需要自定義生成過(guò)程督勺。你能把它作為一個(gè)依賴(lài)來(lái)更新渠羞。如果閱讀更多關(guān)于不同的設(shè)計(jì)理念。
向下擴(kuò)展
React 學(xué)習(xí)曲線(xiàn)陡峭智哀,在你開(kāi)始學(xué) React 前次询,你需要知道 JSX 和 ES2015,因?yàn)樵S多示例用的是這些語(yǔ)法瓷叫。你需要學(xué)習(xí)構(gòu)建系統(tǒng)屯吊,雖然你在技術(shù)上可以用 Babel 來(lái)實(shí)時(shí)編譯代碼,但是這并不推薦用于生產(chǎn)環(huán)境摹菠。
就像 Vue 向上擴(kuò)展好比 React 一樣盒卸,Vue 向下擴(kuò)展后就類(lèi)似于 jQuery。你只要把如下標(biāo)簽放到頁(yè)面就可以運(yùn)行:
然后你就可以編寫(xiě) Vue 代碼并應(yīng)用到生產(chǎn)中辨嗽,你只要用 min 版 Vue 文件替換掉就不用擔(dān)心其他的性能問(wèn)題世落。
由于起步階段不需學(xué) JSX,ES2015 以及構(gòu)建系統(tǒng)糟需,所以開(kāi)發(fā)者只需不到一天的時(shí)間閱讀指南就可以建立簡(jiǎn)單的應(yīng)用程序屉佳。
React Native 能使你用相同的組件模型編寫(xiě)有本地渲染能力的 APP (iOS 和 Android)。能同時(shí)跨多平臺(tái)開(kāi)發(fā)洲押,對(duì)開(kāi)發(fā)者是非常棒的武花。相應(yīng)地,Vue 和Weex會(huì)進(jìn)行官方合作杈帐,Weex 是阿里的跨平臺(tái)用戶(hù)界面開(kāi)發(fā)框架体箕,Weex 的 JavaScript 框架運(yùn)行時(shí)用的就是 Vue专钉。這意味著在 Weex 的幫助下,你使用 Vue 語(yǔ)法開(kāi)發(fā)的組件不僅僅可以運(yùn)行在瀏覽器端累铅,還能被用于開(kāi)發(fā) iOS 和 Android 上的原生應(yīng)用跃须。
在現(xiàn)在,Weex 還在積極發(fā)展娃兽,成熟度也不能和 React Native 相抗衡菇民。但是,Weex 的發(fā)展是由世界上最大的電子商務(wù)企業(yè)的需求在驅(qū)動(dòng)投储,Vue 團(tuán)隊(duì)也會(huì)和 Weex 團(tuán)隊(duì)積極合作確保為開(kāi)發(fā)者帶來(lái)良好的開(kāi)發(fā)體驗(yàn)第练。
另一個(gè) Vue 的開(kāi)發(fā)者們很快就會(huì)擁有的選項(xiàng)是NativeScript,這是一個(gè)社區(qū)驅(qū)動(dòng)的插件玛荞。
Mobx 在 React 社區(qū)很流行娇掏,實(shí)際上在 Vue 也采用了幾乎相同的反應(yīng)系統(tǒng)。在有限程度上勋眯,React + Mobx 也可以被認(rèn)為是更繁瑣的 Vue婴梧,所以如果你習(xí)慣組合使用它們,那么選擇 Vue 會(huì)更合理凡恍。
Vue 的一些語(yǔ)法和 AngularJS 的很相似 (例如v-ifvsng-if)志秃。因?yàn)?AngularJS 是 Vue 早期開(kāi)發(fā)的靈感來(lái)源。然而嚼酝,AngularJS 中存在的許多問(wèn)題浮还,在 Vue 中已經(jīng)得到解決。
在 API 與設(shè)計(jì)兩方面上 Vue.js 都比 AngularJS 簡(jiǎn)單得多闽巩,因此你可以快速地掌握它的全部特性并投入開(kāi)發(fā)钧舌。
Vue.js 是一個(gè)更加靈活開(kāi)放的解決方案。它允許你以希望的方式組織應(yīng)用程序涎跨,而不是在任何時(shí)候都必須遵循 AngularJS 制定的規(guī)則洼冻,這讓 Vue 能適用于各種項(xiàng)目。我們知道把決定權(quán)交給你是非常必要的隅很。
這也就是為什么我們提供webpack template撞牢,讓你可以用幾分鐘,去選擇是否啟用高級(jí)特性叔营,比如熱模塊加載屋彪、linting、CSS 提取等等绒尊。
AngularJS 使用雙向綁定畜挥,Vue 在不同組件間強(qiáng)制使用單向數(shù)據(jù)流。這使應(yīng)用中的數(shù)據(jù)流更加清晰易懂婴谱。
在 Vue 中指令和組件分得更清晰蟹但。指令只封裝 DOM 操作躯泰,而組件代表一個(gè)自給自足的獨(dú)立單元——有自己的視圖和數(shù)據(jù)邏輯。在 AngularJS 中兩者有不少相混的地方华糖。
Vue 有更好的性能麦向,并且非常非常容易優(yōu)化,因?yàn)樗皇褂门K檢查客叉。
在 Angular 中磕蛇,當(dāng) watcher 越來(lái)越多時(shí)會(huì)變得越來(lái)越慢,因?yàn)樽饔糜騼?nèi)的每一次變化十办,所有 watcher 都要重新計(jì)算。并且超棺,如果一些 watcher 觸發(fā)另一個(gè)更新向族,臟檢查循環(huán) (digest cycle) 可能要運(yùn)行多次。AngularJS 用戶(hù)常常要使用深?yuàn)W的技術(shù)棠绘,以解決臟檢查循環(huán)的問(wèn)題件相。有時(shí)沒(méi)有簡(jiǎn)單的辦法來(lái)優(yōu)化有大量 watcher 的作用域。
Vue 則根本沒(méi)有這個(gè)問(wèn)題氧苍,因?yàn)樗褂没谝蕾?lài)追蹤的觀察系統(tǒng)并且異步隊(duì)列更新夜矗,所有的數(shù)據(jù)變化都是獨(dú)立觸發(fā),除非它們之間有明確的依賴(lài)關(guān)系让虐。
有意思的是紊撕,Angular 和 Vue 用相似的設(shè)計(jì)解決了一些 AngularJS 中存在的問(wèn)題。
我們將新的 Angular 獨(dú)立開(kāi)來(lái)討論赡突,因?yàn)樗且粋€(gè)和 AngularJS 完全不同的框架对扶。例如:它具有優(yōu)秀的組件系統(tǒng),并且許多實(shí)現(xiàn)已經(jīng)完全重寫(xiě)惭缰,API 也完全改變了浪南。
Angular 事實(shí)上必須用 TypeScript 來(lái)開(kāi)發(fā),因?yàn)樗奈臋n和學(xué)習(xí)資源幾乎全部是面向 TS 的漱受。TS 有很多好處——靜態(tài)類(lèi)型檢查在大規(guī)模的應(yīng)用中非常有用络凿,同時(shí)對(duì)于 Java 和 C# 背景的開(kāi)發(fā)者也是非常提升開(kāi)發(fā)效率的。
然而昂羡,并不是所有人都想用 TS——在中小型規(guī)模的項(xiàng)目中絮记,引入 TS 可能并不會(huì)帶來(lái)太多明顯的優(yōu)勢(shì)。在這些情況下紧憾,用 Vue 會(huì)是更好的選擇到千,因?yàn)樵诓挥?TS 的情況下使用 Angular 會(huì)很有挑戰(zhàn)性。
最后赴穗,雖然 Vue 和 TS 的整合可能不如 Angular 那么深入憔四,我們也提供了官方的類(lèi)型聲明和組件裝飾器膀息,并且知道有大量用戶(hù)在生產(chǎn)環(huán)境中使用 Vue + TS 的組合。我們也和微軟的 TS / VSCode 團(tuán)隊(duì)進(jìn)行著積極的合作了赵,目標(biāo)是為 Vue + TS 用戶(hù)提供更好的類(lèi)型檢查和 IDE 開(kāi)發(fā)體驗(yàn)潜支。
這兩個(gè)框架都很快,有非常類(lèi)似的 benchmark 數(shù)據(jù)柿汛。你可以瀏覽具體的數(shù)據(jù)做更細(xì)粒度的對(duì)比冗酿,不過(guò)速度應(yīng)該不是決定性的因素。
在體積方面络断,最近的 Angular 版本中在使用了AOT和tree-shaking技術(shù)后使得最終的代碼體積減小了許多裁替。但即使如此,一個(gè)包含了 Vuex + Vue Router 的 Vue 項(xiàng)目 (gzip 之后 30kB) 相比使用了這些優(yōu)化的angular-cli生成的默認(rèn)項(xiàng)目尺寸 (~130kB) 還是要小得多貌笨。
Vue 相比于 Angular 更加靈活弱判,Vue 官方提供了構(gòu)建工具來(lái)協(xié)助你構(gòu)建項(xiàng)目,但它并不限制你去如何組織你的應(yīng)用代碼锥惋。有人可能喜歡有嚴(yán)格的代碼組織規(guī)范昌腰,但也有開(kāi)發(fā)者喜歡更靈活自由的方式。
要學(xué)習(xí) Vue膀跌,你只需要有良好的 HTML 和 JavaScript 基礎(chǔ)遭商。有了這些基本的技能,你就可以非惩鄙耍快速地通過(guò)閱讀指南投入開(kāi)發(fā)劫流。
Angular 的學(xué)習(xí)曲線(xiàn)是非常陡峭的——作為一個(gè)框架,它的 API 面積比起 Vue 要大得多丛忆,你也因此需要理解更多的概念才能開(kāi)始有效率地工作困介。當(dāng)然,Angular 本身的復(fù)雜度是因?yàn)樗脑O(shè)計(jì)目標(biāo)就是只針對(duì)大型的復(fù)雜應(yīng)用蘸际;但不可否認(rèn)的是座哩,這也使得它對(duì)于經(jīng)驗(yàn)不甚豐富的開(kāi)發(fā)者相當(dāng)?shù)牟挥押谩?/p>
Ember 是一個(gè)全能框架。它提供了大量的約定粮彤,一旦你熟悉了它們根穷,開(kāi)發(fā)會(huì)變得很高效。不過(guò)导坟,這也意味著學(xué)習(xí)曲線(xiàn)較高屿良,而且并不靈活。這意味著在框架和庫(kù) (加上一系列松散耦合的工具) 之間做權(quán)衡選擇惫周。后者會(huì)更自由尘惧,但是也要求你做更多架構(gòu)上的決定。
也就是說(shuō)递递,我們最好比較的是 Vue 內(nèi)核和 Ember 的模板與數(shù)據(jù)模型層:
Vue 在普通 JavaScript 對(duì)象上建立響應(yīng)喷橙,提供自動(dòng)化的計(jì)算屬性啥么。在 Ember 中需要將所有東西放在 Ember 對(duì)象內(nèi),并且手工為計(jì)算屬性聲明依賴(lài)贰逾。
Vue 的模板語(yǔ)法可以用全功能的 JavaScript 表達(dá)式悬荣,而 Handlebars 的語(yǔ)法和幫助函數(shù)相比來(lái)說(shuō)非常受限。
在性能上疙剑,Vue 比 Ember好很多氯迂,即使是 Ember 2.x 的最新 Glimmer 引擎。Vue 能夠自動(dòng)批量更新言缤,而 Ember 在性能敏感的場(chǎng)景時(shí)需要手動(dòng)管理嚼蚀。
Knockout 是 MVVM 領(lǐng)域內(nèi)的先驅(qū),并且追蹤依賴(lài)管挟。它的響應(yīng)系統(tǒng)和 Vue 也很相似驰坊。它在瀏覽器支持以及其他方面的表現(xiàn)也是讓人印象深刻的。它最低能支持到 IE6哮独,而 Vue 最低只能支持到 IE9。
隨著時(shí)間的推移察藐,Knockout 的發(fā)展已有所放緩皮璧,并且略顯有點(diǎn)老舊了。比如分飞,它的組件系統(tǒng)缺少完備的生命周期事件方法悴务,盡管這些在現(xiàn)在是非常常見(jiàn)的。以及相比于Vue調(diào)用子組件的接口它的方法顯得有點(diǎn)笨重譬猫。
如果你有興趣研究讯檐,你還會(huì)發(fā)現(xiàn)二者在接口設(shè)計(jì)的理念上是不同的。這可以通過(guò)各自創(chuàng)建的simple Todo List體現(xiàn)出來(lái)染服”鸷椋或許有點(diǎn)主觀,但是很多人認(rèn)為 Vue 的 API 接口更簡(jiǎn)單結(jié)構(gòu)更優(yōu)雅柳刮。
Polymer 是另一個(gè)由谷歌贊助的項(xiàng)目挖垛,事實(shí)上也是 Vue 的一個(gè)靈感來(lái)源。Vue 的組件可以粗略的類(lèi)比于 Polymer 的自定義元素秉颗,并且兩者具有相似的開(kāi)發(fā)風(fēng)格痢毒。最大的不同之處在于,Polymer 是基于最新版的 Web Components 標(biāo)準(zhǔn)之上蚕甥,并且需要重量級(jí)的 polyfills 來(lái)幫助工作 (性能下降)哪替,瀏覽器本身并不支持這些功能。相比而言菇怀,Vue 在支持到 IE9 的情況下并不需要依賴(lài) polyfills 來(lái)工作凭舶。
在 Polymer 1.0 版本中记盒,為了彌補(bǔ)性能,團(tuán)隊(duì)非常有限的使用數(shù)據(jù)綁定系統(tǒng)癣疟。例如悼潭,在 Polymer 中唯一支持的表達(dá)式只有布爾值否定和單一的方法調(diào)用,它的 computed 方法的實(shí)現(xiàn)也并不是很靈活义屏。
Polymer 自定義的元素是用 HTML 文件來(lái)創(chuàng)建的靠汁,這會(huì)限制使用 JavaScript/CSS (和被現(xiàn)代瀏覽器普遍支持的語(yǔ)言特性)。相比之下闽铐,Vue 的單文件組件允許你非常容易的使用 ES2015 和你想用的 CSS 預(yù)編譯處理器蝶怔。
在部署生產(chǎn)環(huán)境時(shí),Polymer 建議使用 HTML Imports 加載所有資源兄墅。而這要求服務(wù)器和客戶(hù)端都支持 Http 2.0 協(xié)議踢星,并且瀏覽器實(shí)現(xiàn)了此標(biāo)準(zhǔn)。這是否可行就取決于你的目標(biāo)用戶(hù)和部署環(huán)境了隙咸。如果狀況不佳沐悦,你必須用 Vulcanizer 工具來(lái)打包 Polymer 元素。而在這方面五督,Vue 可以結(jié)合異步組件的特性和 Webpack 的代碼分割特性來(lái)實(shí)現(xiàn)懶加載 (lazy-loaded)藏否。這同時(shí)確保了對(duì)舊瀏覽器的兼容且又能更快加載。
而 Vue 和 Web Component 標(biāo)準(zhǔn)進(jìn)行深層次的整合也是完全可行的充包,比如使用 Custom Elements副签、Shadow DOM 的樣式封裝。然而在我們做出嚴(yán)肅的實(shí)現(xiàn)承諾之前基矮,我們目前仍在等待相關(guān)標(biāo)準(zhǔn)成熟淆储,進(jìn)而再?gòu)V泛應(yīng)用于主流的瀏覽器中。
Riot 3.0 提供了一個(gè)類(lèi)似于基于組件的開(kāi)發(fā)模型 (在 Riot 中稱(chēng)之為 Tag)家浇,它提供了小巧精美的 API本砰。Riot 和 Vue 在設(shè)計(jì)理念上可能有許多相似處。盡管相比 Riot 钢悲,Vue 要顯得重一點(diǎn)灌具,Vue 還是有很多顯著優(yōu)勢(shì)的:
更好的性能。Riot 使用了遍歷 DOM 樹(shù)而不是虛擬 DOM譬巫,但實(shí)際上用的還是臟檢查機(jī)制咖楣,因此和 AngularJS 患有相同的性能問(wèn)題。
更多成熟工具的支持芦昔。Vue 提供官方支持webpack和Browserify诱贿,而 Riot 是依靠社區(qū)來(lái)建立集成系統(tǒng)。
blog首頁(yè):http://www.cnblogs.com/hubgit/
推薦另一篇文檔:https://www.cnblogs.com/hubgit/p/6633214.html