摘要:它不過是硬幣的另一面。因此,既然我們能夠接受與通過這種方式混合在一塊兒,那么是時(shí)候讓介入并向我們展示硬幣的另一面了第三階段的并不是一個(gè)激進(jìn)的改變,是因?yàn)槲覀冞@個(gè)行業(yè)從一開始就注定和應(yīng)該是在一起的。
React框架剛剛發(fā)布的時(shí)候,JSX顛覆了很多人的想法。習(xí)慣了HTML標(biāo)簽與JavaScript代碼分離的前端工程師們,看到JSX大概都會不禁吐槽:“這些奇怪的標(biāo)簽出現(xiàn)在JavaScript里是要干啥?!”我們一向貫徹的關(guān)注點(diǎn)分離原則呢?Facebook的工程師難道一點(diǎn)都不了解這些社區(qū)中已經(jīng)默認(rèn)的規(guī)范?
像很多人一樣,我一開始對JSX這種語法是持懷疑態(tài)度的。甚至當(dāng)我愛上JSX后,每次我向別的開發(fā)者推薦這種語法,我都會覺得我是在向別人展示我丑陋的孩子。
從一開始的懷疑到愛上JSX,我漸漸意識到JSX其實(shí)并沒有那么激進(jìn)。它不過是硬幣的另一面。JSX其實(shí)是前端開發(fā)中自然進(jìn)化的一個(gè)過渡。為什么這么說呢,我們有必要回顧一下前端這幾年的發(fā)展歷程了。
第一階段:非侵入式JavaScript(Unobtrusive JavaScript)還記得那個(gè)jQuery盛行的時(shí)代么?非侵入式的JavaScript被各種提倡。我們的HTML是純HTML,我們的JavaScript是純JavaScript。我們開發(fā)時(shí)是嚴(yán)格貫徹所謂的關(guān)注點(diǎn)分離的。
我們像下面這樣寫HTML:
Click to hide me
而我們的JavaScript會這樣寫:
$(".hide").click(function() { $(this).hide(); })
按照之前的理解,這樣做是真的做到了關(guān)注點(diǎn)分離對吧?然而我覺得并不是這樣。
這樣寫看起來像是一個(gè)好主意。我們的HTML是絕對純凈的,完全不參合任何邏輯代碼。但是我們會慢慢發(fā)現(xiàn)一個(gè)問題:我怎么知道哪行JavaScript代碼在控制我的HTML呢?答案是:除非我閱讀了整個(gè)JavaScript文件,我才能明白,哪段JavaScript代碼在控制哪段HTML。(譯者注:這樣的情況很常見,尤其是在大型項(xiàng)目中,我們有無數(shù)的還有可能重復(fù)的DOM節(jié)點(diǎn),HTML和JavaScript文件不在一起,要修改起來簡直太復(fù)雜了)。在這種模式中,你不能僅僅簡單的修改一個(gè)標(biāo)簽而不去檢查對應(yīng)的JavaScript代碼以確保你的修改沒有破換選擇器執(zhí)行。你看,這里實(shí)際上并沒有實(shí)現(xiàn)關(guān)注點(diǎn)分離,我們還是要不斷的關(guān)注HTML和JavaScript之間的聯(lián)系。我們做到的僅僅是把JS和HTML分離到了兩個(gè)不同的文件中。在本質(zhì)上這兩種技術(shù)是密不可分的,他們必須保持步調(diào)一致,否則就會導(dǎo)致我們的應(yīng)用崩潰。
直接分割HTML和JS導(dǎo)致我們的應(yīng)用更加難以維護(hù)和調(diào)試。每次你想修改一個(gè)標(biāo)簽,總是會擔(dān)心破壞一個(gè)jQuery選擇器。如果我們對關(guān)注點(diǎn)的分離不那么嚴(yán)格,也許可以減輕一些痛苦。于是,我們迎來了第二階段...
第二階段:雙向綁定(Two-way Binding)在Knockout和Angular中出現(xiàn)的雙向綁定,讓所有前端開發(fā)者眼前一亮。許多開發(fā)者開始拋棄之前信奉的關(guān)注點(diǎn)分離,并全力擁抱這種在HTML標(biāo)簽中聲明式綁定的力量。當(dāng)數(shù)據(jù)發(fā)生改變,UI也自動(dòng)發(fā)生變動(dòng)。當(dāng)UI發(fā)生變動(dòng),數(shù)據(jù)也隨之變動(dòng)。如此清晰,如此簡單。(譯者注:我認(rèn)為這是另一種意義上的關(guān)注點(diǎn)分離,我們不再需要關(guān)注HTML與JavaScript之間的聯(lián)系,我們需要做的就是維護(hù)好數(shù)據(jù)。)
這些框架的實(shí)現(xiàn)的確大不相同,但他們都在試圖做相同的事情。試想使用這幾個(gè)流行框架實(shí)現(xiàn)迭代數(shù)組這個(gè)例子:
//Angular//Ember {{#each user in users}} //Knockout data-bind=”foreach: users”但是這里出現(xiàn)了一些有意思的事情————很少有人意識到一個(gè)非常顯著的問題:我們實(shí)際上在把JavaScript放到HTML中。這并不是我們所理解的那種關(guān)注點(diǎn)分離。我們可以發(fā)現(xiàn)這些框架都在處理同一件事:通過為HTML添加額外的特殊標(biāo)記使其更強(qiáng)大。這些標(biāo)記可以被解析為JavaScript。因此,既然我們能夠接受JavaScript與HTML通過這種方式混合在一塊兒,那么是時(shí)候讓React介入并向我們展示硬幣的另一面了...
第三階段:JSXReact的JSX并不是一個(gè)激進(jìn)的改變,是因?yàn)槲覀冞@個(gè)行業(yè)從一開始就注定HTML和JavaScript應(yīng)該是在一起的。
只有當(dāng)你體驗(yàn)過React和JSX之后,才能體會到這樣做有多少好處。React的JSX完全優(yōu)于所有的“第二階段”風(fēng)格的框架的原因有以下幾點(diǎn):
編譯時(shí)錯(cuò)誤(Compile-time Errors)當(dāng)你的HTML中出現(xiàn)輸入錯(cuò)誤時(shí),你很難知道自己是哪里寫錯(cuò)了。在很多情況下這是一種無聲的運(yùn)行時(shí)錯(cuò)誤。比如,如果你在寫Angular應(yīng)用時(shí)輸入n-repeat而不是ng-repeat,什么都不會發(fā)生。當(dāng)你在寫Knockout應(yīng)用時(shí)把data-bind寫成data-bnd,也同樣什么都不會發(fā)生。在出現(xiàn)這些錯(cuò)誤時(shí),你的應(yīng)用會悄無聲息的運(yùn)行時(shí)失敗。這太令人沮喪了。
相比之下,當(dāng)你在JSX中發(fā)生類似的輸入錯(cuò)誤時(shí),它是不會被編譯的。忘記閉合標(biāo)簽了?難道你不想在你輸入錯(cuò)誤的HTML時(shí)得到豐富的反饋么?
ReactifyError: /components/header.js: Parse Error: Line 23: Expected corresponding JSX closing tag for li while parsing file: /components/header.js有了JSX,這樣豐富的錯(cuò)誤反饋終于成為現(xiàn)實(shí)!靠這一點(diǎn)JSX絕對完勝。如此快速而又豐富的反饋極大的提高了生產(chǎn)效率。正如我在我的Clean Code課程中討論的那樣————良好的工程解決方案遵循速錯(cuò)原則。(譯者注:原文是:well- engineered solutions fail fast,關(guān)于fail fast可以查看http://geeklu.com/2010/07/fai... 進(jìn)行了解)
充分利用JavaScript(Leverage the Full Power of JavaScript)使用JavaScript編寫你的標(biāo)記,意味著這些標(biāo)記可以借助JavaScript的全部能力,而不是像Angular或者Knockout這種以HTML為中心的框架只能提供有限的特殊標(biāo)記。(譯者注:我認(rèn)為這里作者的表述并不準(zhǔn)確,Angular也同樣可以自由擴(kuò)展HTML,只不過沒有React那么靈巧方便)。
Client-side frameworks shouldn’t require you to learn a proprietary syntax for declaring loops and conditionals.
客戶端框架不應(yīng)當(dāng)要求使用者學(xué)習(xí)特殊的語法來聲明循環(huán)或者條件語句。React減少了使用者學(xué)習(xí)另一種特殊的聲明循環(huán)和基本條件語句的成本。你可以看看第二階段中提到的幾個(gè)框架,他們實(shí)現(xiàn)雙向綁定的方式都是依靠一些屬于他們自己的特殊語法。相反,JSX看上去和HTML幾乎一樣,像循環(huán)和條件語句,完全依賴原生的JavaScript。與眾多的JavaScript框架相比,不需要去學(xué)習(xí)類似于數(shù)據(jù)綁定等特殊語法,這一點(diǎn)又讓React和JSX脫穎而出。
并且,由于你將這些標(biāo)記與相關(guān)聯(lián)的JavaScript數(shù)據(jù)寫在一個(gè)文件中,當(dāng)你引用函數(shù)時(shí),許多IDE能夠提供一些智能提示。想想當(dāng)你使用那些以HTML為中心的框架時(shí),調(diào)用一個(gè)function卻總是輸入錯(cuò)誤時(shí)的苦惱吧!
Final ThoughtsJSX并不一個(gè)瘋狂的主意,它就是一段很正常的程序,因此不要再反感它了。
JSX isn’t revolutionary. It’s evolutionary.
JSX不是革命,它只是進(jìn)化發(fā)展的結(jié)果。
像很多進(jìn)化、演變一樣,它給我們帶來的是一種改善。
原文鏈接:https://medium.com/@housecor/...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/81658.html
摘要:你是一個(gè)對感興趣的開發(fā)者嗎不用擔(dān)心,這真的不會讓你成為一個(gè)背叛者或其他什么,真的。事實(shí)上,這個(gè)想法并不是或獨(dú)創(chuàng)的它只是一種很棒的軟件開發(fā)實(shí)踐方式。把代碼分離到不同的文件里并不會自動(dòng)導(dǎo)致關(guān)注點(diǎn)分離。 原文鏈接 : Getting to Grips with React (as an Angular developer)原文作者 : DAVE CEDDIA譯者 : 李林璞(web前端領(lǐng)域)...
摘要:問題在于標(biāo)準(zhǔn)是同一硬幣的一面。然后,又改名為現(xiàn)存標(biāo)準(zhǔn)來指定它將不斷發(fā)展和不再支持使用版本號引用。作為這一步的結(jié)果,該組織正在積極開發(fā)的標(biāo)準(zhǔn)被稱為新版本。所以,刪除版本號使其具有連續(xù)性聽起來是比較合理地。特別地,標(biāo)準(zhǔn)去掉了和事件。 原文地址:http://developer.telerik.com/featured/w3c-vs-whatwg-html5-specs-difference...
摘要:通過向組件提供屬性,我們可以控制屬性的渲染。在這種情況下,我們將其包含在包含頁眉和頁腳的中,但這可能只是把其他組件做了簡單的分組。僅此而已短小精悍。的新版本專注于使用組件模型,而這些組件可以非常簡單的組合在一起。 本文翻譯自:Reusing layouts in React Router v4 在 React Router V4 應(yīng)用中,希望在每個(gè)路由上呈現(xiàn)一些默認(rèn)的組件,比如頁眉和頁...
摘要:交易依然表示狀態(tài)的變化遷移。這樣一個(gè)模型的特點(diǎn)是狀態(tài)是第一性的所有者是狀態(tài)的屬性,每一份狀態(tài)只有一個(gè)所有者狀態(tài)不斷的被銷毀和創(chuàng)建。值得指出的是,的編程模型之所以強(qiáng)大,更多是因?yàn)樗袪顟B(tài),而不是因?yàn)樗挠邢迗D靈完備。 在設(shè)計(jì) CKB 的時(shí)候,我們想要解決三個(gè)方面的問題: 狀態(tài)爆炸引起的公地悲劇及去中心化的喪失;計(jì)算和驗(yàn)證耦合在了一起使得無論是計(jì)算還是驗(yàn)證都失去了靈活性,難以擴(kuò)展;交易與價(jià)...
摘要:為了理解底層公鏈的模型,我們前置了幾篇概念性文章,講述了我們應(yīng)該以狀態(tài)為中心設(shè)計(jì)區(qū)塊鏈系統(tǒng)的,以及這么做帶來的好處。交易依然表示狀態(tài)的變化遷移。 為了理解底層公鏈 CKB 的 Cell 模型,我們前置了幾篇概念性文章,講述了我們應(yīng)該以狀態(tài)為中心設(shè)計(jì)區(qū)塊鏈系統(tǒng)的,以及這么做帶來的好處。并且在上一篇文章中,詳細(xì)分析了比特幣 UTXO 模型和以太坊的 Account 模型,以及進(jìn)行了對比分析...
閱讀 1988·2021-11-19 09:40
閱讀 1931·2021-09-28 09:36
閱讀 2279·2021-09-22 10:02
閱讀 2724·2019-08-30 14:00
閱讀 1948·2019-08-29 15:31
閱讀 2893·2019-08-29 15:11
閱讀 2905·2019-08-29 13:04
閱讀 1080·2019-08-27 10:55