線上服務(wù)咨詢
近幾年前端技術(shù)盤點(diǎn)以及 2016 年技術(shù)發(fā)展..
2018-10-22
Web 發(fā)展了幾十個(gè)春秋,風(fēng)起云涌,千變?nèi)f化。我很慶幸自己沒有完整地經(jīng)歷過這些年頭,而是站在前人的肩膀上行走。Web 技術(shù)發(fā)展的速度讓人感覺那幾乎不是繼承式的迭代,而是一次又一次的變革,一次又一次的創(chuàng)造。這幾年的前端,更為之甚!
我從 12 年底開始接觸前端,12 年之前的前端發(fā)展情況只能從上一輩的筆觸中領(lǐng)會(huì)。本文會(huì)盤點(diǎn)從 09 年開始到 15 年間前端技術(shù)的革新,同時(shí)也會(huì)從多個(gè)角度,解讀近幾年前端技術(shù)發(fā)展的潛在因素,其中穿插了若干對(duì)前端演進(jìn)的拙見,難免會(huì)有錯(cuò)誤和疏漏,望讀者可以補(bǔ)充和斧正。
那些年,一度追捧,一度放棄
下面,花一些篇幅簡單回顧下 09 年到 15 年前端的發(fā)展歷程(感謝@法海 師兄對(duì)文章部分內(nèi)容的校稿,很多技術(shù)出現(xiàn)的時(shí)間有所偏差,但不影響閱讀)。
09 年,基礎(chǔ)類庫完善,尋求突破
09 年之前,JavaScript 還處于對(duì)自身語言的完善過程中,而到了 09 年,JavaScript 類庫已經(jīng)頗為成熟,jQuery/Prototype//Dojo 等都已經(jīng)發(fā)布了好幾個(gè) stable 版本,各大類庫也是相互吸收優(yōu)點(diǎn),不斷完善并提高自身性能,然而功能上已經(jīng)沒有太多增加的勢(shì)頭。部分框架開始了思想上的轉(zhuǎn)變,更加注重前端開發(fā)的組織和結(jié)構(gòu),條理性強(qiáng)了很多,如 YUI 等。
從 ECMAScript 規(guī)范的爭執(zhí),開啟了瀏覽器引擎大戰(zhàn),各大廠商也趁機(jī)瓜分 IE 份額,Chrome 和 Firefox 在這場戰(zhàn)役中取得大勝,V8 也敲響了前端的大門。為了迎合市場的激烈競爭,IE 開始了升級(jí)之旅,09 年初發(fā)布 IE8,全面兼容 CSS2.1。
而此時(shí),Node.js 和 3G Mobile 這兩只巨獸開始浮出水面,Web 標(biāo)準(zhǔn)也開始向 HTML5、ECMAScript5.0 靠攏。
10 年,看齊標(biāo)準(zhǔn),關(guān)注 Web 性能
毫無疑問,這一年,各大巨頭都看清了 HTML5 是 web 發(fā)展的未來,在保留原來前端技術(shù)的狀態(tài)下,都簇?fù)碇?HTML5 的裙擺。富客戶端應(yīng)用也在這一年蓬勃生長,ExtJS/Dojo 搖身變?yōu)槠髽I(yè)級(jí)框架,各類組件化概念和產(chǎn)品如約而至。
延續(xù)著 09 年的變化,10 年的前端顯得頗為沉寂,然而在標(biāo)準(zhǔn)的運(yùn)用和推動(dòng)上,各大廠商也是十分賣力。IE 9 出來了預(yù)覽第三版,iPhone 的 Safari 已經(jīng)能夠支持眾多 HTML5 內(nèi)容:Canvas/Video/Audio/Geolocation/Storage/Application Cache/Web SQL Database 等。
W3C 宣布成立 Web 性能工作組,Google 和 Mozilla 紛紛推出應(yīng)用商店,瀏覽器調(diào)試工具也豐富了起來,人們開始更多地關(guān)注開發(fā)體驗(yàn)和性能問題。
11 年,HTML5 扛大旗,F(xiàn)lash 堪憂
2011 年 HTML5 的技術(shù)發(fā)展和推廣都向前邁進(jìn)了一大步,語義明確的標(biāo)簽體系、簡潔明了的富媒體支持、本地?cái)?shù)據(jù)的儲(chǔ)存技術(shù)、canvas 等等各類技術(shù)被廣泛應(yīng)用。這一年,很多 web 開發(fā)者也面臨一項(xiàng)技術(shù)的抉擇,HTML5 or Flash?從 Flash Player 11.1 開始,Adobe 不再繼續(xù)開發(fā)面向移動(dòng)設(shè)備瀏覽器的 Flash 插件,積極投身于 HTML5,這意味著 Flash 技術(shù)的凋零。
這一年,HTML5 游戲火爆到了一個(gè)高潮,移動(dòng)端開發(fā)工具和調(diào)試工具也日益成熟。jQuery 已經(jīng)成為大小公司日常開發(fā)的標(biāo)配,成千上萬的 JQ 插件讓網(wǎng)頁開發(fā)變得尤為輕松,而隨之而來的也是頁面的臃腫和性能調(diào)優(yōu)的深入探索。
Node.js 已經(jīng)悄然崛起,在 github 上的訪問量已經(jīng)超過了 Rails,國內(nèi)的云應(yīng)用開始嘗試使用 Node.js,Node.js 相關(guān)工具也紛紛出來。
12 年,響應(yīng)式開發(fā),工程化推進(jìn)
隨著硬件技術(shù)的發(fā)展,各手機(jī)廠商又開始騷動(dòng)起來,為了占有更多的市場,不斷提高產(chǎn)品的性價(jià)比,體驗(yàn)也得到了不斷的優(yōu)化。借著先前兩年 HTML5 刮起的東風(fēng),移動(dòng)端上的 web 開發(fā)也顫抖了起來。移動(dòng)端的開發(fā)挑戰(zhàn)不亞于 PC 上對(duì)多個(gè)瀏覽器的支持,這一年,萌生了眾多移動(dòng)端框架,如 Sencha Touch/Zepto.js/JQ Mobile 等,相對(duì) PC 端框架,它們更加輕便。
而移動(dòng)端的崛起,帶來了許多終端開發(fā)難題:多終端適配,多分辨率適配,遠(yuǎn)程調(diào)試等等,而隨著這些難題一個(gè)個(gè)被解決,移動(dòng)端生長的勢(shì)頭變得更加強(qiáng)盛。此時(shí) Twitter 也推出了 Bootstrap, 這個(gè)前端開發(fā)工具包不僅方便了前端,也方便了后端同學(xué),它的出現(xiàn)讓快速建站更加簡單。
編程思想的切換,迎來了 CoffeeScript 和 TypeScript,這兩個(gè)預(yù)處理語言的出現(xiàn)又為 JavaScript 引來了不少其他方向轉(zhuǎn)型過來的開發(fā)者。JavaScript 的兄弟 Node.js,也在命令行領(lǐng)域開拓了一片不小的疆域,甚至有動(dòng)搖 Perl 和 Ruby 地位的趨勢(shì)。
在前端工程化上,幾個(gè)派系相互爭斗,產(chǎn)出了 AMD、CMD、UMD 等規(guī)范,也衍生了 SeaJS、RequireJS 等模塊化工具。前端在這一年很有跳躍感。
13 年,爆發(fā)式增長,百花齊放
規(guī)范和標(biāo)準(zhǔn)上有不少產(chǎn)出。Web Components 的出現(xiàn)給前端開發(fā)開辟了新思路;WebDriver 規(guī)范的出來推動(dòng)了自動(dòng)化測試的進(jìn)程,ECMAScript 6 的規(guī)范草案落地,Webapp 工作小組在這一年也是相當(dāng)活躍。
Chrome 瀏覽器在這一年也有了很大的突破,開始支持 SPDY,使用 Blink 取代 webkit 作為 Chromium 的新渲染引擎,Chrome DevTools 的調(diào)試體驗(yàn)大幅度提升。這一年中,Chrome 連同其他瀏覽器廠商快速推動(dòng)了各項(xiàng)草案規(guī)范的實(shí)現(xiàn)。
語言能力上依舊在增強(qiáng),并且從 JS 開始擴(kuò)散到 CSS,LESS、SASS 和 Stylus 等 CSS 預(yù)處理語言開始走俏,Web 開發(fā)變得更加緊湊。
而在無線端,應(yīng)用不再局限于 Webapp,由于流暢度、性能等方面不能滿足用戶體驗(yàn)的需求,各大公司開始轉(zhuǎn)向 Native 方向的研究,進(jìn)而出現(xiàn)了 Hybrid 和 PhoneGap 的繁榮,它們?yōu)?JS 調(diào)用了提供更多的設(shè)備 API。
Node.js 大放異彩,很多公司在生產(chǎn)環(huán)境中使用 Node.js,同時(shí)也出現(xiàn)了諸如 Express、Meteor 等小巧的快速搭建 Node.js Server 的應(yīng)用框架。
各瀏覽器的調(diào)試也是種類繁多、功能豐富,PhantomJS 在自動(dòng)化測試上開始取代 Selenium,出現(xiàn)了眾多的遠(yuǎn)程調(diào)試方案和工具。
前端工程化開始普及,各公司開始推出自己的前端集成開發(fā)解決方案。
14 年,移動(dòng)端的崛起,HTML5 和 ES6 落地
HTML5 正式定稿,這意味著,web page 正式演變?yōu)?web application。ES6 華麗麗走進(jìn)前端,走的很穩(wěn)重,它的 Module/Class 等特性已經(jīng)完全讓這門語言具備了開發(fā)大型應(yīng)用的能力。
大而厚的基礎(chǔ)庫難以滿足靈活場景,Mobile 要求極致體驗(yàn),MV* 庫鋪卷而來,如 vue/angular/knockout 等。
Web Components 跨終端組件快速發(fā)展,移動(dòng)端開發(fā)迎來一次升華。Node.js 前后端分離的流行,中間層的出現(xiàn)改變了前后端的合作模式。2014 是顛覆式的一年,前端發(fā)展在這一年開始形成了一個(gè)短暫的穩(wěn)定格局。
15 年,觀念的轉(zhuǎn)變,步入前端工業(yè)化生產(chǎn)
今年格外引人注目的框架是,類 React。Facebook 在 React.js Conf 2015 大會(huì)上推出了基于 JavaScript 的開源框架 React Native,它結(jié)合了 Web 應(yīng)用和 Native 應(yīng)用的優(yōu)勢(shì),可以使用 JavaScript 來開發(fā) iOS 和 Android 原生應(yīng)用。在 JavaScript 中用 React 抽象操作系統(tǒng)原生的 UI 組件,代替 DOM 元素來渲染等。敲一次代碼,能夠運(yùn)行在多個(gè)平臺(tái)上,其優(yōu)勢(shì)可見一斑。除了 React ,還有手機(jī)淘寶推出的 Weex 框架,它吸收了 vue.js 的編程精華,編程風(fēng)格更加簡約。
在眾多構(gòu)建工具中,如今瀟灑存活的并不多。體驗(yàn)完 grunt 和 browserify 后,gulp 順勢(shì)而至,爾后又出現(xiàn)了 webpack、jspm 等。而包管理工具,經(jīng)歷了 components、bower、spm 后,npm 開始主導(dǎo)整個(gè)市場。
Node.js 的應(yīng)用已經(jīng)鋪天蓋地,各大公司前端都把 Node.js 作為分離前后端的主要手段,并且在測試、監(jiān)控等方面沉淀了大量內(nèi)容。不過,這個(gè)市場是很苛刻的,Node.js 的性能難以達(dá)到 C/C++ 的水平,那么接下來要做的就是要提升性能,至少得接近 C/C++。
// @法海 師兄 批注:對(duì)時(shí)間點(diǎn)的總結(jié)是,其實(shí)很多技術(shù)方案很早就出現(xiàn)了,只不過沒有大規(guī)模應(yīng)用,因此,對(duì)于上文中時(shí)間點(diǎn)的謬誤,你可以將語句從「xxx 出現(xiàn)了」改成「xxx 得到廣泛應(yīng)用」。其實(shí)我發(fā)現(xiàn),問題在于,一個(gè)技術(shù)領(lǐng)域的新起和發(fā)展并不是一年內(nèi)能完成的,一個(gè)技術(shù)方案的出現(xiàn)和廣泛應(yīng)用也不是一年內(nèi)能落地的,所以執(zhí)著于以「年」為時(shí)間點(diǎn)來編史,會(huì)畫地為牢。
Web 規(guī)范和標(biāo)準(zhǔn)
最開始,我們看到的 JavaScript 還只是一個(gè)簡單的腳本語言,配合著 AJAX,在網(wǎng)頁上翻騰了好幾個(gè)年頭。隨著互聯(lián)網(wǎng)趨勢(shì)越來越明顯,互聯(lián)網(wǎng)業(yè)務(wù)量和業(yè)務(wù)復(fù)雜度不斷增加,很多網(wǎng)頁變得相當(dāng)復(fù)雜,如讓我們震驚了好一會(huì)兒的 Gmail,交互復(fù)雜,體驗(yàn)優(yōu)良。為了更好的多人協(xié)作,代碼中的 Utils 庫越來越大,在這些庫中,基礎(chǔ)部分更多的是對(duì) JavaScript 語言本身的拓展,比如給 String 加一個(gè) repeat 函數(shù),再加一個(gè) trim 函數(shù),再加一個(gè) endWith 函數(shù)等等。
復(fù)雜的業(yè)務(wù)中會(huì)經(jīng)常看到一層又一層的回調(diào)處理,回調(diào)的嵌套讓代碼的可讀性變的很差,而且很難將多個(gè)異步并行處理。為了改變這種編程范式,我們做了很多的思考,使用事件監(jiān)聽,使用各種手段拉直回調(diào),平坦地調(diào)用。
慢慢的,如果你在關(guān)注 W3C 小組的動(dòng)向,會(huì)發(fā)現(xiàn),那些被認(rèn)可的,并且被廣泛重復(fù)定義的東西,都被納入了標(biāo)準(zhǔn)。最開始的 jQuery/prototype,前者主要是對(duì)瀏覽器做兼容處理,讓開發(fā)者不再把精力放到瀏覽器的差異上;后者是對(duì)語言本身的拓展,對(duì) JavaScript 各種類型做拓展,并且提供了一套拓展任何對(duì)象的功能集。而現(xiàn)在的開發(fā),我們很大程度上不再依托這些類庫。規(guī)范和標(biāo)準(zhǔn)已經(jīng)把這些差異都統(tǒng)一了,String 中自帶了 includes/startsWith/endsWith/repeat/padStart/padEnd 等函數(shù),Array 自帶了 from/forEach/of/keys/values/find/findIndex 函數(shù)…
規(guī)范的標(biāo)準(zhǔn)是為了讓開發(fā)者得到更好的編程體驗(yàn),編程不是目標(biāo),目標(biāo)是將編程生產(chǎn)力轉(zhuǎn)化成實(shí)際效益,越少的阻礙對(duì)開發(fā)者越有利。各瀏覽器廠商當(dāng)然也認(rèn)識(shí)到了這一點(diǎn),他們不斷地提升自己產(chǎn)品的體驗(yàn),將標(biāo)準(zhǔn)中的新特性都融合進(jìn)去,比如 ES6 中的 Promise/Generator/Class/Module 等等。在這些內(nèi)容普及之前,我們不需要加入 jQuery/prototype 這些「不純粹」的東西,而是添加兩個(gè) shim 和 polyfill,如 es5-shim,html5shiv 等等。待到山花爛漫時(shí),再輕松刪掉這些補(bǔ)丁程序。
這兩年工程化很熱,W3C 小組也看到了,這就是市場的需求,為了完成一個(gè)大型應(yīng)用的編程,就必須模塊化、組件化,于是在規(guī)范中也出現(xiàn)了 Module & Module Loader;Node.js 的到來,讓很多前端工程師開始接觸數(shù)據(jù)庫操作,面對(duì)巨量的異步,我們?nèi)虤馔搪晫懥藷o數(shù)的回調(diào)地獄,盡管使用了很多 Promise 相關(guān)的操作,程序結(jié)構(gòu)依然松散難以閱讀,于是規(guī)范中也開始出現(xiàn)了 async/await 等對(duì) Generator 的上層封裝。文字已經(jīng)不能滿足當(dāng)代人的溝通需求,音視頻等富媒體傳輸走進(jìn)了我們的生活,于是規(guī)范中也出來了 WebRTC/WebAudio 等規(guī)范。
只要規(guī)范出來了,后續(xù)市面上就會(huì)根據(jù)規(guī)范來實(shí)現(xiàn)一套 shiv,這些 shiv 提供了同樣的 API,提供了同樣的編程體驗(yàn)。當(dāng)瀏覽器自我進(jìn)化完成之后,這些 shiv 也將成為歷史,被開發(fā)者遺棄在代碼的注釋之中。這些都是規(guī)范和標(biāo)準(zhǔn)的魅力,它的存在,就是讓開發(fā)者把精力投入到自己的業(yè)務(wù)之中,編程和范式的工作交給它。
在 這里 可以看到,W3C 各個(gè)小組最近都在干啥。標(biāo)準(zhǔn)不能囊括一切。
生態(tài)的自我完善和自我拓展
技術(shù)的更迭過于頻繁,我們能夠清晰地看到,很多人還在用更迭前一波甚至是前好幾波的產(chǎn)品。
當(dāng)年的 IE6,在戰(zhàn)場上鏖戰(zhàn)了 10 多個(gè)年頭,依然屹立不到,而現(xiàn)在它在市面上依然有百分之一左右的占有率,這種小強(qiáng)精神不得不讓人肅然起敬?!爸灰脩粼?,我們就得追隨”,這可能是很多公司的服務(wù)理念,因?yàn)橛脩艟褪菨撛诘睦麧櫋U且驗(yàn)檫@種服務(wù)理念,成就了 IE6 一個(gè)又一個(gè)的 5 年!然而低版本的 IE 已經(jīng)不僅僅是被前端從業(yè)人員抵制和排斥了,網(wǎng)絡(luò)安全、網(wǎng)絡(luò)運(yùn)維、QA 等等,各個(gè)技術(shù)崗位的人員都開始對(duì)他不屑,它的存在對(duì)工作效率、對(duì)安全、對(duì)很多方面產(chǎn)生了極為不良的影響,甚至影響到一些核心內(nèi)容的推廣,所以 2016 將是低版本 IE 消亡的一年,我也呼吁業(yè)界所有的朋友舉起義旗反抗起來!
慶幸的是,也有人開始吃螃蟹了。從支付寶到天貓到淘寶,阿里巴巴在很多業(yè)務(wù)上已經(jīng)主(bèi)動(dòng)(bī)地放棄了對(duì) IE6 和 IE7 的支持,甚至在統(tǒng)一接入層直接做了 302 跳轉(zhuǎn),提示用戶更新瀏覽器或者引導(dǎo)流量到無線端。這是一個(gè)好的開始,我們期望這也是業(yè)界達(dá)成共識(shí)的開始!
HTTP 協(xié)議,從 1.0 快速過度到了 1.1,整個(gè)互聯(lián)網(wǎng)的上層建筑變的十分穩(wěn)固。當(dāng)然,我也了解到依然有很多產(chǎn)品還是保持了 1.0 的狀態(tài),據(jù)說電信公司的很多產(chǎn)品就是使用 HTTP/1.0 進(jìn)行通訊,這無疑讓人驚愕。為了追求更高的效率,減少網(wǎng)絡(luò)傳輸中的無效流量,W3C 工作組對(duì) HTTP 協(xié)議也做了重新的定義,SPDY 就是 13 年比較火熱的一個(gè)話題,F(xiàn)irefox 和 Chrome 都陸續(xù)開始支持 SPDY,后來在 SPDY 的基礎(chǔ)上做了升級(jí),正式定義為 HTTP/2.0,它的一個(gè)很大特點(diǎn)就是多路復(fù)用,這個(gè)小小的特點(diǎn)改變了我們前端編程的很多優(yōu)化模式,比如
域名不是越多越好,為了能夠充分利用瀏覽器的連接數(shù),我們給 JS 和 CSS 開一個(gè)域名,給 img 開好幾個(gè)域名,網(wǎng)頁打開的時(shí)候,恰到好處的利用瀏覽器的連接數(shù)上限限制。HTTP/2.0 的多路復(fù)用,就是可以在一個(gè) HTTP 請(qǐng)求中進(jìn)行多個(gè)資源的傳輸,如果域名散列,反而不能利用這個(gè)特性
資源合并沒有任何優(yōu)勢(shì),以前的資源合并是為了減少請(qǐng)求數(shù)以節(jié)約建立 TCP 鏈接的網(wǎng)絡(luò)開銷和頭部傳輸?shù)牧髁块_銷,而在 HTTP/2.0 中,一個(gè) HTTP 請(qǐng)求上完全可以把所有的資源全部推送過來,如果合并了資源,反而不能良好運(yùn)用瀏覽器對(duì)資源的緩存。
當(dāng)然,除了多路復(fù)用,還有很多其他的優(yōu)化,比如傳輸?shù)臄?shù)據(jù)為二進(jìn)制流,HEAD 頭會(huì)被壓縮處理,服務(wù)器可以向客戶端推送內(nèi)容等。在這個(gè)技術(shù)水平指數(shù)式增長的年代,我相信以后的革新不會(huì)比消滅 IE6 痛苦。
模塊加載上,經(jīng)過了各派系的爭論之后,流傳下來幾個(gè)不錯(cuò)的產(chǎn)品 SeaJS、RequireJS 等,那么那個(gè)模塊加載器將成為工具平臺(tái)中短暫的終點(diǎn)呢?似乎這些都不是。當(dāng)我們按照規(guī)范中的方式進(jìn)行模塊定義,按照規(guī)范中的方式加載定義的模塊時(shí),加載這個(gè)流程就顯得不那么重要了,因?yàn)檫@些事情最后都會(huì)變成 shiv/polyfill 的事情,最終會(huì)變成瀏覽器的固有屬性。
當(dāng)一個(gè)東西在社區(qū)中被暴力追捧的時(shí)候,會(huì)有很多衍生的產(chǎn)品出來,當(dāng)這些衍生物根深蒂固時(shí),可能又會(huì)出現(xiàn)一個(gè)更加原生更加符合開發(fā)習(xí)慣的東西出來。就像 jQuery,我們?yōu)樗帉懙牟寮挥?jì)其數(shù),而在工程化的需求沖擊下,它卻顯得那么的弱不禁風(fēng),因?yàn)樗P(guān)注的點(diǎn)和當(dāng)前的發(fā)展態(tài)勢(shì)不太吻合,僅此而已。
Mobile 的發(fā)展驅(qū)動(dòng)著戰(zhàn)場的轉(zhuǎn)移
記得當(dāng)年拿著 Nokia5230 學(xué)完了 HTML 和 JavaScript 的入門,那屏幕尺寸也就是三個(gè)手指的寬度,緊緊攥在手里看著頁面混排效果極差的網(wǎng)頁文檔。
現(xiàn)如今,iPhone 都出到 6s 了,一個(gè)版本一個(gè)尺寸,而且尺寸越來越大,還有各種寬高不一的 Android 機(jī)器,種類繁多。以前的觸屏是電阻式,只支持單點(diǎn)觸碰;而現(xiàn)在電容式的觸屏精度更高,還支持多指觸控,這如絲般順滑的體驗(yàn)在三四年前是完全體會(huì)不到的。曾經(jīng)手機(jī)開一個(gè)程序久了就會(huì)卡,動(dòng)不動(dòng)還會(huì)自動(dòng)重啟;而現(xiàn)在的手機(jī)開一堆程序,完全無感知,這就是硬件發(fā)展前后的差異。
手機(jī)已經(jīng)成為了人們生活中不可或缺的一部分,甚至成為了一些人身體的一部分,淘寶今年雙十一的數(shù)據(jù)顯示,國內(nèi)移動(dòng)端的消費(fèi)比例已經(jīng)遠(yuǎn)遠(yuǎn)超過了 PC 端,占比 68%。面對(duì)龐大的用戶,我們的技術(shù)是否做好了充足的準(zhǔn)備,這里還得打一個(gè)問號(hào)。
PC 上那一套經(jīng)驗(yàn)不是直接搬到移動(dòng)端就可以使用了,在移動(dòng)端還需要解決更多的問題:
多分辨率問題,這里涉及到了響應(yīng)式設(shè)計(jì)和前端響應(yīng)式技術(shù)
不同網(wǎng)絡(luò)環(huán)境的網(wǎng)頁加載優(yōu)化問題,2g/3g/4g/wifi
手指交互帶來的一系列體驗(yàn)問題
為了提升用戶體驗(yàn),將 Web Native 化 —— 類 React 技術(shù)帶來的一系列問題
遠(yuǎn)程調(diào)試問題
移動(dòng)安全問題等等
上面提到的問題很多已經(jīng)有了的解決方案,當(dāng)然也有很多未提及的。WebApp 的性能、流暢度和穩(wěn)定性遠(yuǎn)遠(yuǎn)不如原生應(yīng)用,同時(shí)它也無法良好地運(yùn)用設(shè)備提供的原生功能,這些都是大家轉(zhuǎn)投 Native 的原因。
端的融合
不同分辨率的手機(jī),不同物理尺寸的終端,為了保持良好的視覺體驗(yàn)和用戶體驗(yàn),我們不得不為每一個(gè)尺寸寫一份 Media Query 代碼,那么對(duì)應(yīng)的,設(shè)計(jì)師也需要設(shè)計(jì)多套版式供前端使用,這給設(shè)計(jì)師、前端和測試帶來了無盡的麻煩。為此,我們通過前端技術(shù)重塑屏幕,重新定義像素尺寸,使用流式布局,通過百分比來響應(yīng)不同的終端尺寸。這是端的融合。
后續(xù)的 Mobile 的技術(shù)發(fā)展方向上,應(yīng)該是相當(dāng)明確的。很多公司都是三套人馬維護(hù)三端的程序,iOS、Android 和 Web,而這三端做的事情都是一樣的,一樣的界面,一樣的后端接口,一樣的交互方式。為了能夠快速響應(yīng)業(yè)務(wù)的變更,我們不得不將三端合并為一端對(duì)待,用一套程序編程成三端代碼,然后發(fā)布到三個(gè)平臺(tái)上。這也是端的融合。React 系列技術(shù)發(fā)展到此,絕對(duì)不是終點(diǎn),它只是一個(gè)探路燈,給我們照明了方向。
技術(shù)需要為業(yè)務(wù)做保障,而好的技術(shù)是能夠及時(shí)響應(yīng)業(yè)務(wù)的變化,我們不可能投入大量的人力在 Web 的修補(bǔ)工作上,通過開發(fā)統(tǒng)一工具,屏蔽端和端之間的差異,統(tǒng)一開發(fā)模式和開發(fā)體驗(yàn),這才是 Mobile 的未來。
當(dāng)然,回到我們之前說的規(guī)范和標(biāo)準(zhǔn),我們目前所做的「屏蔽差異」工作,今后,也會(huì)有統(tǒng)一的標(biāo)準(zhǔn)來規(guī)范,目前手機(jī)廠商沒有這個(gè)共識(shí),是因?yàn)檫€處于當(dāng)年 Chrome、Firefox 搶占 IE6 市場份額的階段。端的最終融合在于一個(gè)統(tǒng)一的標(biāo)準(zhǔn),以及強(qiáng)有力的執(zhí)行。
棧的融合
我剛接觸前端的時(shí)候,還沒有聽說「全?!?,Web 技術(shù)棧往小里說,包含了從前端設(shè)計(jì)、交互、前端實(shí)現(xiàn)、網(wǎng)絡(luò)數(shù)據(jù)傳輸、后端實(shí)現(xiàn)、后端運(yùn)維和數(shù)據(jù)庫等幾個(gè)方面,能短時(shí)間內(nèi)從無到有實(shí)現(xiàn)這么一套系統(tǒng),并且能夠抗得住一定流量沖擊的人,我們可以稱之為全棧工程師。能夠有架構(gòu)有條理地實(shí)現(xiàn)這套系統(tǒng),并且抗得住大流量、有集成測試、有監(jiān)控的,這種我們可以稱之為資深全棧工程師?,F(xiàn)在不乏這種人才,也不乏自吹為這種人。
棧的融合得益于 Node.js 的出現(xiàn),作為前后端分離的橋梁,它拉近了前端工程師與后端的距離,有的人在這座橋梁上賣力行走,漸漸的也從前端走進(jìn) 了后端,甚至走進(jìn)了后端的運(yùn)維。至此,前端也擁有了部署和發(fā)布整個(gè)應(yīng)用的能力,這是一個(gè)質(zhì)的突破。
使用 Node.js,簡單幾行程序便能實(shí)現(xiàn)一個(gè) web 服務(wù)器、便能搭建一個(gè)多人聊天的網(wǎng)頁,它的便捷性可見一斑。NPM 社區(qū)的發(fā)展,沉淀了成千上萬的組件包,一行命令即可獲取,這種組件拼湊式的開發(fā),任何功能的實(shí)現(xiàn)都不會(huì)顯得太復(fù)雜,而這里的「不復(fù)雜」也蘊(yùn)含了無數(shù)的坑坑洼洼,在這一層的融合上也會(huì)遇上不少阻礙:
冗余的龐大的包內(nèi)容,為了使用一個(gè)小功能,我們從網(wǎng)絡(luò)上拉取下來一個(gè)巨大的包,而且這里的「巨大」對(duì)很多人來說都是無感知的,很少會(huì)有人進(jìn)入 node_modules 去查看依賴的第三方包是如何實(shí)現(xiàn)的,實(shí)際情況可能會(huì)相當(dāng)震撼,第三方包還引用了一堆第三方包,這些包都會(huì)在 Node.js 執(zhí)行的時(shí)候被收納進(jìn)去,放在內(nèi)存中。
猛烈的迭代,今年的 Node.js 被人嫌棄迭代太慢了(當(dāng)然,這是表面原因),走出了一個(gè)分支 io.js,發(fā)展了一會(huì)兒,進(jìn)度趕超了 Node.js,后來覺得一家人不干兩家活,又合并回去了。雖說上層 API 幾乎沒有變化,但是底層卻被翻了一個(gè)天。
偶爾的巨大漏洞,每隔一端時(shí)間就會(huì)暴露 Node.js 存在漏洞,這些漏洞的補(bǔ)救措施就是立即升級(jí)版本號(hào),比較讓人擔(dān)心受怕。
后端意識(shí)不強(qiáng)烈,前端占領(lǐng)了中間層的開發(fā),有的時(shí)候還干這后端的活兒,然而卻沒有后端沉淀多年固有的意識(shí),測試和監(jiān)控做的相當(dāng)潦草。
JavaScript 從客戶端的腳本語言縱身躍進(jìn)進(jìn)入了后端行列,而今也開始深入到移動(dòng)端 Native 領(lǐng)域,確實(shí)是無孔不入,這可能就是語言的特性,也可能是技術(shù)本身就在尋求融合點(diǎn),把有差異的地方全部躺平,然后用統(tǒng)一的方式去關(guān)注業(yè)務(wù),關(guān)注用戶。端和棧也在融合。
后端服務(wù)化,云數(shù)據(jù),云安全
用戶體驗(yàn)變得越來越重要,響應(yīng)式技術(shù)的發(fā)展也是后續(xù)網(wǎng)頁應(yīng)用的一大特點(diǎn),端和端之間的差異只是在表現(xiàn)上,數(shù)據(jù)這一層差異不是特別大,很多應(yīng)用 PC 和 Mobile 共用一套接口,或者 Mobile 的接口在 PC 接口的基礎(chǔ)上做了一層包裝,對(duì)接口字段做了些許刪減。后端為了響應(yīng)各個(gè)端之間的數(shù)據(jù)需求,也需要關(guān)注數(shù)據(jù)的可利用性,接口包裝的拓展性等,這是后端服務(wù)化的一個(gè)表現(xiàn)。移動(dòng)端的開發(fā)上,前后端間隙十分明顯,越來越多移動(dòng)端應(yīng)用的發(fā)布已經(jīng)脫離了后端,前端完全通過異步方式獲取數(shù)據(jù)。
業(yè)務(wù)變化很快很快快,今天這個(gè)產(chǎn)品被并購,明天那個(gè)業(yè)務(wù)被砍掉,每個(gè)人負(fù)責(zé)的業(yè)務(wù)線可能冷不丁地就變了。很多大公司的決策是由上往下的,上面微動(dòng),下面可能就是大動(dòng),可能某個(gè)部門就不存在了,也可能被劃分成幾個(gè)產(chǎn)品部門。
所以「大后臺(tái),小前臺(tái)」的趨勢(shì)必然形成。前端,毫無疑問,在這個(gè)前臺(tái)之中。前臺(tái)的特點(diǎn)是靈活的,多變的,可快速重組的。對(duì)后臺(tái)而言,為了響應(yīng)前臺(tái)的變化,需要提供更細(xì)粒化的 API,將數(shù)據(jù)打散,打得更加零碎,零碎的數(shù)據(jù)易于重組,這是在考驗(yàn)后端的架構(gòu)能力。如今,很多前端也都是半棧工程師,盤踞在前后端中間層上,然而如何迎接這種后端服務(wù)化的模式,似乎這個(gè)準(zhǔn)備還是不夠充足的。
GraphQL 的出現(xiàn)場景跟 React 類似,React 是前端應(yīng)對(duì)不同場景的一種強(qiáng)有力手段,而 GraphQL 則是后端應(yīng)對(duì)不同需求場景的一次嘗試,Web APIs 將會(huì)成為 Web App 和 Mobile App 的一個(gè)中心點(diǎn),前端基于后端的 RESTful 服務(wù)構(gòu)建應(yīng)用,這里面存在太多未知的問題需要探索,這是一個(gè)大數(shù)據(jù)下探索的新起點(diǎn),也給前端開發(fā)者創(chuàng)造了無數(shù)的可能。
這幾年各類網(wǎng)盤,各個(gè)云服務(wù)商都在搶占市場,有提供圖片儲(chǔ)存的,有提供 CDN 靜態(tài)資源緩存的,有提供大文件儲(chǔ)存的,也有賣數(shù)據(jù)庫服務(wù)的。種類繁多,而歸根到底都是,你付錢給我,我提供儲(chǔ)存和安全,還提供方便的 SDK 讓你獲取自己的數(shù)據(jù)。云服務(wù)賣的是一套服務(wù),它是把所有人的數(shù)據(jù)風(fēng)險(xiǎn)集于一身,用強(qiáng)硬的技術(shù)做安全防御。云,賦予了我們無窮的想象空間。
三輛馬車,我們還差一輛
開發(fā)功能對(duì)很多人來說是輕松活兒,基本的前端語言加些復(fù)雜的特效,實(shí)現(xiàn)成本不會(huì)很高;即便是搭建一個(gè)網(wǎng)站,使用 Node.js 社區(qū)中的框架也能夠輕松實(shí)現(xiàn)。然后極少人會(huì)去關(guān)注每個(gè)功能點(diǎn)的測試,一個(gè)項(xiàng)目下來基本看不到測試用例,更不用說會(huì)去做監(jiān)控相關(guān)的事情。結(jié)果就是,踏過了無數(shù)的坑洼之后終于上線了,而后續(xù)加功能的時(shí)候發(fā)現(xiàn),加了東西就跑不通,新內(nèi)容影響了之前的邏輯,只好去修復(fù)之前的邏輯,修好之后發(fā)現(xiàn)更早之前的邏輯又不通了,整個(gè)修復(fù)過程就像玩多米諾骨牌。
程序開發(fā)三板斧:功能、測試和監(jiān)控。在 github 上可以看到很多程序都加入了持續(xù)集成,這是一個(gè)好兆頭,意味著我們寫的程序也越來越健壯,至少貢獻(xiàn)給世人使用的程序是健壯的。很多程序的代碼覆蓋率也達(dá)到了 90%+,這些數(shù)據(jù)都是重視測試的證據(jù)。
然而,三輛馬車,我們最后一輛依然沒有開動(dòng)起來。很多公司都會(huì)有自己的 log 平臺(tái),每個(gè)用戶訪問頁面中的任何一個(gè)鏈接都會(huì)將用戶信息和訪問信息以 log 日志形式收集到 log 平臺(tái)上,然后通過監(jiān)控平臺(tái)或者離線分析的方式,獲取業(yè)務(wù)數(shù)據(jù)或者技術(shù)數(shù)據(jù),進(jìn)行分析和二次開發(fā)。這些東西在大公司見的很多,而這方面的東西在前端,尤其是使用 Node.js 做程序開發(fā)的前端身上,看到的并不多。
最后
2016 年,我覺得技術(shù)上的新創(chuàng)造會(huì)稍微緩和些,這兩年很多人已經(jīng)被新技術(shù)沖擊得有些找不著方向了,同一類東西,前者還沒學(xué)完,后者就開始火爆了,緊接著又是一陣技術(shù)的凋零和新技術(shù)的出現(xiàn),這樣搞久了也會(huì)有一絲的疲倦。而更多的會(huì)關(guān)注,如何更好地服務(wù)多端,如何更大幅度地提升開發(fā)體驗(yàn)和用戶體驗(yàn),很多技術(shù)都會(huì)往性能、往極致這個(gè)方向上鉆研。
寫長文真不輕松。寫到這里,感覺說的不通透,還有很多想說的,但是個(gè)人理解力有限,也難以表達(dá)全面。技術(shù)的變化很快,今天說過的東西,到了明天就可能過時(shí)了。我們猜不透未來,只能把現(xiàn)有的東西好好消化吸收下,留下一個(gè)話柄,給讀者吧。