JavaScript 2018: 你需要和不需要深入的
JavaScript 現(xiàn)今已發(fā)展成熟 -- 我們也不再是在頁(yè)面上做一些小小的互動(dòng)元素了,而是使用 JavaScript 構(gòu)建整個(gè)大型應(yīng)用。 當(dāng)然,這也使得其比過(guò)去更為復(fù)雜, 在這個(gè)變化萬(wàn)千的 JavaScript 生態(tài)系統(tǒng)中,我們也已難以知道整個(gè)系統(tǒng)到底有多大。
Ethan Brown,以軟件工程師為職業(yè)的同時(shí),還是 兩本 JavaScript 書(shū)籍 的作者,均由 O'Reilly 出版。 Ethan Brown 花了大量的時(shí)間剖析 JavaScript,嘗試著弄清楚這里面都有什么,以及一個(gè)現(xiàn)代 JavaScript 開(kāi)發(fā)者該如何去開(kāi)始迎合這些東西。
在2018里,對(duì)于聰明的開(kāi)發(fā)者們可以去熟悉的東西, Brown 給出了他對(duì) JavaScript 生態(tài)系統(tǒng)中各個(gè)方面最前沿,至少也是很有用的預(yù)測(cè)。有兩點(diǎn)需要說(shuō)明的是: 首先,他基于所有 JavaScript于 標(biāo)準(zhǔn)的這些變化中,指出了一些好的可以去了解的,盡管里面所羅列的一些東西可能不是你所關(guān)注的。對(duì)這些有一些大體上的了解能夠讓你在遇到困難難以抉擇時(shí),產(chǎn)生聯(lián)系,知道去找誰(shuí),知道該去了解什么樣的技術(shù)。
他還強(qiáng)調(diào)到,他所做的這些選擇完全根據(jù)他個(gè)人的想法以及經(jīng)驗(yàn),這當(dāng)然可能和你的完全不一樣。Brown 說(shuō)到: “這些只是我的個(gè)人想法,我們都各有各的想法,而且這其中我也會(huì)有疏漏。”
先從需要關(guān)注的點(diǎn)開(kāi)始
WebAssembly: WebAssembly 屬于 JavaScript 的一個(gè)子集, 它提供了一個(gè)針對(duì)其他語(yǔ)言的編譯器。 如果你想將你的 C++ 代碼編譯成 JavaScript, WebAssembly 就是你需要了解的 — 它允許幾乎任何語(yǔ)言運(yùn)行于瀏覽器或者 Node 之中,而且也有了一些比較有意思的應(yīng)用了。 Brown 說(shuō)到:“我感覺(jué)這個(gè)技術(shù)會(huì)火,會(huì)變得非常重要。我也肯定會(huì)細(xì)心留意,并且在 2018 花些時(shí)間去更好的學(xué)習(xí)它。 ”
函數(shù)式編程: “并不是什么新的東西,也已經(jīng)被 JavaScript 社區(qū)的大多數(shù)所應(yīng)用, 但我覺(jué)的 2018 才是函數(shù)式編程真正達(dá)到具有質(zhì)量和規(guī)模的一年”,Brown 說(shuō)到。對(duì)其常見(jiàn)的批評(píng)都是更難去學(xué)習(xí),更難去理解,Brown 繼續(xù)說(shuō)到,但這也是看待問(wèn)題的角度不同:讓所有人都開(kāi)始使用函數(shù)式編程,在這種強(qiáng)制性的編程風(fēng)格下所顯現(xiàn)出的迷惑、副作用以及混亂,我們看來(lái)也是非常奇怪的。
Brown 的建議:“如果你想嘗試真正嚴(yán)格的函數(shù)式編程,你可以看看 Elm 或者 ClojureScript, 不過(guò),你也可以一句話從今天開(kāi)始 ‘好的,我所有的代碼都要變成純函數(shù)式的了’。”
不可變性 (Immutability): 可以和函數(shù)式編程搭配在一起。 Brown 說(shuō)到,“然而大部分人,第一次嘗試不可變數(shù)據(jù)結(jié)構(gòu)時(shí),都會(huì)想:‘Wow, 這不太高效啊,你對(duì)所有的東西都創(chuàng)建了副本,所占用的內(nèi)存不是很必要啊’”。但需要記住的是,Brown 繼續(xù)到,你只是復(fù)制了變化的那一部分 -- 其他的結(jié)構(gòu)依然保持不變。 同時(shí),在 JavaScript 中進(jìn)行嚴(yán)格比較速度快而且開(kāi)銷(xiāo)低,大部分切換到不可變數(shù)據(jù)結(jié)構(gòu)的人都表示性能提升了。
更好的是,不可變性為一些試驗(yàn)行為提供了天然的保護(hù)網(wǎng) -- 你在知道你無(wú)法修改任何已有東西,僅是創(chuàng)建了修改部分的副本的情況下,你會(huì)更愿意去試驗(yàn)?zāi)切┎皇煜さ臇|西。這對(duì)入門(mén)開(kāi)發(fā)者來(lái)說(shuō)也非常好。
單向數(shù)據(jù)綁定: 這是前端同學(xué)關(guān)心的東西,由 Elm 提出,被 Facebook 應(yīng)用于 Flux, 進(jìn)而還有 Redux, 以及現(xiàn)在的 Angular 和 Vue”, Brown 說(shuō)到。大家都越來(lái)越發(fā)覺(jué)這是個(gè)好東西, 在 2018 年也是時(shí)候去了解它了。
單向數(shù)據(jù)綁定讓你更方便地管理應(yīng)用中的狀態(tài) 。 當(dāng)你第一次嘗試的時(shí)候你會(huì)想,天啊,又要寫(xiě)那么多代碼,有點(diǎn)大材小用的樣子了。對(duì)于一些小型應(yīng)用來(lái)說(shuō),確實(shí)是大材小用了,但一旦你的應(yīng)用達(dá)到了一定的規(guī)模,將會(huì)影響你對(duì)整個(gè)應(yīng)用的控制而不僅僅是你所負(fù)責(zé)的部分。因?yàn)楫?dāng)你在使用單向數(shù)據(jù)綁定時(shí),你需要考慮到應(yīng)用的每一層數(shù)據(jù)的流轉(zhuǎn)。
計(jì)算屬性名/字面屬性值簡(jiǎn)寫(xiě): “可以說(shuō)這是 ECMAScript 6 (ES6) 的黑馬級(jí)特性。但我目前并沒(méi)有看到大家經(jīng)常用到,我覺(jué)得會(huì)有很多地方可以用到。 他其實(shí)是一個(gè)小小的語(yǔ)法糖,能夠讓你動(dòng)態(tài)的構(gòu)建屬性名稱(chēng),對(duì)象初始化或簡(jiǎn)寫(xiě)對(duì)象屬性值。”,Brown 說(shuō)到。 “我感覺(jué)像是每周都用這個(gè)特性玩出了新花樣。同時(shí)和函數(shù)式編程搭配在一起也是挺不錯(cuò)的, 如果你之前沒(méi)見(jiàn)過(guò)一定要去了解一下 -- 我更希望看到社區(qū)中越來(lái)越多人去使用這個(gè)特性。”
不需要擔(dān)心的東西:
如 Brown 所說(shuō),至少現(xiàn)在,某些領(lǐng)域的知識(shí)可以選擇跳過(guò)。
面向?qū)ο缶幊? “我本人并不太喜歡在 JavaScript 中使用經(jīng)典的面向?qū)ο缶幊?。我認(rèn)為會(huì)有更好的模型,更好的方式去實(shí)現(xiàn)代碼復(fù)用。所以在 JavaScript 領(lǐng)域中,你也會(huì)涉及到面向?qū)ο缶幊痰闹R(shí)但不必為此而感到煩惱。 ”
Generators: “這是 JavaScript 中一個(gè)比較酷的特性, 一些地方肯定會(huì)有它的使用案例,但我認(rèn)為其主要的特性已經(jīng)被 async/await 所替代。 我們很興奮的在 Koa.js 中使用 Generator ,這樣我們就可以用著同步的語(yǔ)義進(jìn)行異步編程, 但現(xiàn)在有了 async 和 await 而且更好用。 所以除非你覺(jué)得在一些奇怪的使用案例中使用生成器比較合理的話也不用在意太多”, Brown 說(shuō)到。
Symbol: “另外一個(gè)好的特性,對(duì) JavaScript 語(yǔ)言的一個(gè)補(bǔ)充,但首先:我并沒(méi)有看到大家再用他;其次,每次我嘗試去使用 Symbol,除了在框架使用和序列化上出現(xiàn)問(wèn)題外無(wú)其他收獲。”,Brown 說(shuō)到??偟恼f(shuō)來(lái),對(duì)于 JavaScript 這門(mén)語(yǔ)言,他并不認(rèn)為 Symbol 是個(gè)合適的設(shè)計(jì)。 他的建議:保持觀望的態(tài)度。