摘要:不過(guò)細(xì)想想,我郵只有前端的選修課啥的,課程也不是那么就業(yè)導(dǎo)向。至少目前,很少有大公司完全把作為前后端通用的技術(shù)棧。不能把簡(jiǎn)單看做是在服務(wù)端的延展。編譯這個(gè)思想在前端領(lǐng)域很重要不改變現(xiàn)有的語(yǔ)言環(huán)境同時(shí)進(jìn)行最佳的工程實(shí)踐。
P.S. 噴神請(qǐng)繞道,大神勿噴,不引戰(zhàn),不攻擊,不鉆牛角尖。
大二時(shí)第一次接觸前端。許多同學(xué)估計(jì)都想過(guò)要做一個(gè)網(wǎng)站,大部分又是從PHP開(kāi)始的(誰(shuí)讓它是世界上最好的語(yǔ)言呢)。后端語(yǔ)言參與渲染HTML一直很主流,跟著教程做,你會(huì)寫(xiě)一堆樣式表,到后來(lái)也許是需要在提交表單時(shí)進(jìn)行客戶端驗(yàn)證,你開(kāi)始寫(xiě)一些JS。
想做個(gè)網(wǎng)站啥的(以前app沒(méi)有那么多),必須要學(xué)會(huì)HTML、CSS、JS,HTML構(gòu)造結(jié)構(gòu),CSS表現(xiàn)樣式,JS決定行為。JS似乎充滿奇技淫巧,可以做各種效果啊,飛雪花片啊,搞咱們選課、評(píng)老師的網(wǎng)站啊。
后來(lái)接觸了jQuery,用起來(lái)無(wú)比順手,特別是看完《DOM編程藝術(shù)》以后。那段時(shí)間擔(dān)心JS掌握得不好,心想總是用jQuery以后不會(huì)寫(xiě)Native怎么辦?也會(huì)關(guān)注“可以直接學(xué)習(xí)jQuery嗎”這樣一些問(wèn)題。學(xué)習(xí)了Ajax后又做過(guò)瀑布流圖片墻,覺(jué)得無(wú)比興奮。不過(guò)認(rèn)識(shí)也僅僅停留在異步加載局部更新DOM可以創(chuàng)造更好地用戶體驗(yàn)。
實(shí)習(xí)期間,看到公司前端做雪碧圖、切片、搞div、css布局,然后花很多時(shí)間在瀏覽器兼容的問(wèn)題的調(diào)試上。尤其是活動(dòng)頁(yè)面,寫(xiě)HTML、CSS基本占到工程的80%,JS寫(xiě)起來(lái)很快。后來(lái)Bootstrap逐漸流行起來(lái),后端同學(xué)可以直接寫(xiě)后臺(tái),甚至都不需要前端和射雞師了。加點(diǎn)柵格,加幾個(gè)類,輪播組件啥的樣樣有,再引入jQuery,前端便成為了順帶做的事了。
我接觸前端的過(guò)程沒(méi)有系統(tǒng)性,充滿了探(瞎)索(搞),也缺少引導(dǎo)。不過(guò)細(xì)想想,我郵只有前端的選修課啥的,課程也不是那么就業(yè)導(dǎo)向。就像論壇里的同學(xué),自己搞,自己提升。
我們把上面這些點(diǎn)提取出來(lái):HTML、CSS、JS、jQuery、Bootstrap,再刷刷題,看看基礎(chǔ)知識(shí),基本就可以參加校招了。
那些求入門、求實(shí)習(xí)、趕春招、趕秋招的同學(xué)一定來(lái)得及:不過(guò)潑一盆冷水,進(jìn)入大公司只是開(kāi)始,你的認(rèn)識(shí)、習(xí)慣、思維方式最終會(huì)決定你事業(yè)或者專業(yè)的高度。
面對(duì)新技術(shù)我覺(jué)得了解它為什么產(chǎn)生,解決什么問(wèn)題,會(huì)怎么發(fā)展,如何在現(xiàn)有的工程中進(jìn)行實(shí)踐,比討論它們的優(yōu)劣更有意義:
首先 html5 不是一個(gè)新技術(shù),而是在現(xiàn)代瀏覽器中使用CSS 3等特性進(jìn)行前端開(kāi)發(fā)的過(guò)程。以前我們更關(guān)注瀏覽器的差異性,而現(xiàn)代的瀏覽器對(duì)標(biāo)準(zhǔn)的支持越來(lái)越統(tǒng)一。
回到j(luò)Query,在web app中使用越來(lái)越少了,一方面這個(gè)庫(kù)太“大”了(吃流量),從頁(yè)面加載、打開(kāi)速度理論看,英明的老大會(huì)把它砍掉。針對(duì)庫(kù)大小的問(wèn)題,Zepto.js是一個(gè)解決方案。這個(gè)庫(kù)與jQuery API相對(duì)統(tǒng)一,拋卻了很多瀏覽器的兼容性的代碼。
但是現(xiàn)在瀏覽器的querySelector方法,已經(jīng)很好地解決了jQuery中的“Query”,使用原生的fetch方法請(qǐng)求數(shù)據(jù),返回Promise也能比jQuery.ajax()的實(shí)現(xiàn)更好、更清晰的解決問(wèn)題。
看待jQuery,我覺(jué)得應(yīng)該更多看到它的歷史意義。jQuery,一定程度上成為了工業(yè)標(biāo)準(zhǔn),影響了JS語(yǔ)言的發(fā)展和其他JS庫(kù)的構(gòu)建。如同coffeescript對(duì)ES2015的影響。至于實(shí)踐,越來(lái)越多的web已經(jīng)不依賴jQuery進(jìn)行開(kāi)發(fā)了。
前端這幾年進(jìn)步太快了,我嘗試按照不同方向討論一下這些技術(shù)棧。
脫離瀏覽器的JavaScript Node.js我們討論的JavaScript更多是以瀏覽器為宿主的ECMAScript,同源的ActionScript以Adobe的Flash作為宿主的。
瀏覽器中的JavaScript提供了大量與瀏覽器相關(guān)的API。脫離這些特定API看JavaScript,異步是它特別重要的一個(gè)特性。Google的V8引擎,讓JavaScript的運(yùn)行時(shí)性能大大提升,是Node.js的產(chǎn)生另一個(gè)必要的條件。
Jser突然可以全棧了,面對(duì)新的技術(shù),不乏布道師。國(guó)內(nèi)第一本Node.js書(shū)籍是BYVoid寫(xiě)的,當(dāng)時(shí)盛傳這個(gè)同學(xué)拿到了我司的60w的offer,一片沸沸揚(yáng)揚(yáng);大家可以向他學(xué)習(xí),在一個(gè)技術(shù)還未在祖國(guó)大地流行起來(lái)時(shí),迅速寫(xiě)一本書(shū)。
至少目前,很少有大公司完全把JavaScript作為前后端通用的技術(shù)棧。傳統(tǒng)的后端語(yǔ)言和技術(shù)并未沒(méi)有被代替的危險(xiǎn)。不能把Node.js簡(jiǎn)單看做是JavaScript在服務(wù)端的延展。
我覺(jué)得,Node.js很大程度拓展了JavaScript的使用范圍,改變了傳統(tǒng)前端的工作流程(后面提)。特別是NPM的產(chǎn)生,意義非常之大,它讓JavaScript成為了一個(gè)生態(tài)系統(tǒng),CommonJs也在JavaScript模塊化未成熟之前,提供了優(yōu)秀的模塊化解決方案。
通過(guò)package.json,我們可以依賴已有的NPM項(xiàng)目構(gòu)建自己的庫(kù)。前段時(shí)間,某個(gè)同學(xué)應(yīng)為法律的問(wèn)題,撤消了發(fā)布在NPM上的leftpad包,短短11行代碼的包撤消后,造成了React-Native、Babel等項(xiàng)目構(gòu)建失敗的災(zāi)難。
module.exports = leftpad; function leftpad (str, len, ch) { str = String(str); var i = -1; if (!ch && ch !== 0) ch = " "; len = len - str.length; while (++i < len) { str = ch + str; } return str; }
許多人反思,為啥那么簡(jiǎn)單的代碼要依賴,不自己寫(xiě)?是不是Jser忘記了怎么寫(xiě)代碼了?我覺(jué)得,盲目解除對(duì)其他庫(kù)的依賴會(huì)失去NPM社區(qū)的初衷,除非你想做超級(jí)輪子哥。NPM生態(tài)圈制定一下撤包的規(guī)則,這種災(zāi)難或許以后就不會(huì)發(fā)生。自給自足的同學(xué)們,如果lodash撤包了,或者是tj holowaychuk大神激情起來(lái)刪了所有包,你們?cè)趺崔k?
Node.js也讓服務(wù)端渲染成為可能(universal),代碼段技能在服務(wù)端運(yùn)行也可以在客戶端運(yùn)行(universal)。從這點(diǎn)看,代碼更容易維護(hù)和編寫(xiě)了,部分解耦了前端和服務(wù)端。對(duì)于SEO這個(gè)令人頭大的商業(yè)問(wèn)題,服務(wù)端渲染可以較好地解決。感興趣的同學(xué),可以去了解一下搜索引擎的爬蟲(chóng)是如何干活的。
總結(jié)一下,Node.js的產(chǎn)生完善了JavaScript生態(tài)圈,讓大家看到了JavaScript的潛力,讓構(gòu)建更為龐大的JavaScript項(xiàng)目成為可能,同時(shí)前端可以使用更為工程化的流程和工具進(jìn)行開(kāi)發(fā)。
推薦大家一定去了解和使用Node.js,使用NPM構(gòu)建自己的項(xiàng)目。
JSONJSON變成了事實(shí)上Web數(shù)據(jù)的傳輸標(biāo)準(zhǔn),這個(gè)是JavaScript另一大貢獻(xiàn)。
對(duì)終端的開(kāi)發(fā),使用JSON數(shù)據(jù)后使得服務(wù)端的開(kāi)發(fā)更加專注和統(tǒng)一。
data.each do |key, value| puts "Key #{key.inspect} has value #{value.inspect}" end
這種代碼展示了服務(wù)端渲染的能力。但是對(duì)于對(duì)于iOS、Android等原生應(yīng)用,除了在WebView中,無(wú)法消費(fèi)這些渲染好的HTML。
JSON和App的流行,讓后端語(yǔ)言在渲染方面逐漸讓道,向純粹的Service發(fā)展。比如beta版本的 Rails 5 大大增強(qiáng)了 Rails 作為 API Service的能力。
從Ruby 或者 PHP轉(zhuǎn)換到JSON需要相應(yīng)的映射函數(shù),Node.js來(lái)得更為直接,因?yàn)镴SON就是一個(gè)普通的JavaScript對(duì)象。
大家可以去學(xué)習(xí)成熟的JSON風(fēng)格指南。同時(shí)通過(guò)實(shí)踐逐步加強(qiáng)對(duì)JSON的認(rèn)識(shí),設(shè)計(jì)更為規(guī)范的JSON(這個(gè)會(huì)森森影響到Mongo的存儲(chǔ),查詢效率,React的性能)。
二進(jìn)制處理后的JSON,是MongoDB存儲(chǔ)的內(nèi)容,這個(gè)基于文檔的數(shù)據(jù)庫(kù)被越來(lái)越多的公司使用,使得編寫(xiě)嵌套數(shù)據(jù),存儲(chǔ)流數(shù)據(jù)更為容易。傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù),將查詢結(jié)果表示為JSON,需要經(jīng)過(guò)查詢、封裝、Transform等多個(gè)步驟,而MongoDB的查詢結(jié)果就是JSON,直接查詢直接使用。當(dāng)然我們看到,在處理事務(wù)型問(wèn)題上,關(guān)系型數(shù)據(jù)庫(kù)還是首選,比如電商。我們?nèi)グH關(guān)系型數(shù)據(jù)庫(kù)是否落后沒(méi)有意義——使用場(chǎng)景不同。
如果大家有興趣,可以去嘗試MongoDB,感受一下沖擊。
前端工程化接下來(lái)提一下前端工程化。腳本語(yǔ)言并不一定需要編譯再執(zhí)行。傳統(tǒng)的工程中,通過(guò)標(biāo)簽引入依賴的JavaScript庫(kù)、樣式表后直接開(kāi)發(fā),寫(xiě)樣式表。
當(dāng)工程規(guī)模增大后,傳統(tǒng)實(shí)踐維護(hù)成本直線上升——于是模塊化開(kāi)發(fā)成為工程上的最佳實(shí)踐。我們可以使用特定的技術(shù)對(duì)JavaScript、CSS進(jìn)行壓縮,同時(shí)合并JS與CSS解決腳本間的依賴問(wèn)題,以此減少線上環(huán)境中HTTP請(qǐng)求的數(shù)量。
Sass Less StylusCSS在前端領(lǐng)域,進(jìn)步最慢。聲明式的樣式表缺乏邏輯性,層層嵌套,維護(hù)成本高且不易團(tuán)隊(duì)合作,樣式覆蓋這個(gè)問(wèn)題也相當(dāng)惱人。
Sass等技術(shù),輸出編譯后的CSS樣式表,把開(kāi)發(fā)過(guò)程和實(shí)際樣式表分開(kāi)。.scss文件結(jié)構(gòu)清晰,通過(guò)變量定義、mixin等的使用讓樣式表的開(kāi)發(fā)更加正規(guī)化。
Less與Sass類似,Stylus是TJ大神的作品,實(shí)在非常簡(jiǎn)約抽象,個(gè)人感覺(jué)不易維護(hù)。最新的Bootstrap 4使用Sass,放棄了Bootstrap 3中使用的Less。
個(gè)人覺(jué)得,這些技術(shù)深入掌握一門就可以了。實(shí)際開(kāi)發(fā)還要看公司的技術(shù)棧。
CoffeeScript 與 TypeScript與Sass等技術(shù)思想類似,Coffee 與 TypeScript 也是一個(gè)編譯技術(shù)——把.coffee、.ts文件編譯成javascript。編譯這個(gè)思想在前端領(lǐng)域很重要:不改變現(xiàn)有的語(yǔ)言環(huán)境(JS、CSS)同時(shí)進(jìn)行最佳的工程實(shí)踐。
使用過(guò)一段TypeScript,真心覺(jué)得是神器,在無(wú)類型語(yǔ)言中寫(xiě)類型不是倒退嗎?請(qǐng)摒棄這些激進(jìn)思想(世界上最好的語(yǔ)言第7代不是也支持類型了嗎),嘗試在項(xiàng)目中使用TypeScript,你就會(huì)感知到它的神器之處。首先,多人協(xié)作更為容易了,結(jié)合IntelliSense,IDE更為智能,開(kāi)發(fā)快感直線提升。
TypeScript是微軟的開(kāi)源項(xiàng)目,Angular 2 放棄 Dart完全擁抱了TypeScript,TypeScript與Angular 2 強(qiáng)強(qiáng)合作,加入了許多構(gòu)建 Angular 2的新特性。
我們整理一下這些工程化的實(shí)踐:預(yù)編譯、合并、壓縮、打包,引入下一個(gè)概念Package工具:
Webpack Gulp Grunt BrowerifyPackage工具,是任務(wù)驅(qū)動(dòng)型的工程化工具。通過(guò)打包構(gòu)建,線上代碼更為精簡(jiǎn),循環(huán)引用等問(wèn)題迎刃而解。
上述這些工具變化極快,Webpack 2快接近穩(wěn)定了,JSPM這個(gè)新的工具也得到了使用:但是沒(méi)有最好的,只有最合適的工具。都說(shuō)Grunt已經(jīng)過(guò)時(shí),jQuery等庫(kù)還一度使用Grunt進(jìn)行構(gòu)建。對(duì)于新的工具,我們可以了解它們的思想,不要被它們壓得喘不過(guò)氣:比如Gulp更像是一個(gè)PipeLine,對(duì)代碼流一步步通過(guò)Loader進(jìn)行加工。
在淘寶無(wú)線時(shí),有些H5前端用Grunt構(gòu)建工程,使用Less寫(xiě)樣式表(還有些人什么都不用,直接在JsBin里面寫(xiě)樣式、寫(xiě)JS)。
任務(wù)工具結(jié)合CommonJS后,可以只引用需要的模塊、樣式表。這樣打包后,文件更小:當(dāng)然如果結(jié)合sourcemap,調(diào)試和定位問(wèn)題會(huì)更為容易。
JavaScript Libraries工程化、模塊化解決了code如何生產(chǎn),模塊、結(jié)構(gòu)如何組織等問(wèn)題。大家也在不斷思考在前端與數(shù)據(jù)的關(guān)系。傳統(tǒng)前端開(kāi)發(fā)并不是數(shù)據(jù)導(dǎo)向的,多數(shù)頁(yè)面由服務(wù)端渲染,前端的重心不在數(shù)據(jù)而是聚焦在用戶行為的響應(yīng)上,這時(shí)前端僅僅是產(chǎn)品的視覺(jué)末梢。
單頁(yè)應(yīng)用開(kāi)發(fā)技術(shù)越來(lái)越多地被實(shí)踐后,前端逐步變得更為數(shù)據(jù)導(dǎo)向(JSON API),由末梢變?yōu)榇竽X——業(yè)務(wù)邏輯前移;對(duì)瀏覽器歷史的管理也是也是單頁(yè)應(yīng)用的另外一個(gè)中心,前端也逐步變得更為歷史導(dǎo)向。
為了更為數(shù)據(jù),JavaScript 庫(kù)借鑒了很多服務(wù)端的思想比如MVC。MVC將數(shù)據(jù)抽象為模型,在模型中定義操作數(shù)據(jù)的基本方法;在控制器中定義商業(yè)邏輯,并控制模型的渲染。
這個(gè)階段的代表是Backbone.js。Backbone有一個(gè)可以自定義的依賴于jQuery的前端模版引擎,是MVC模式在前端開(kāi)發(fā)中的實(shí)踐。同時(shí)Backbone.js 依賴于同一個(gè)作者創(chuàng)建的 Underscore 庫(kù),以函數(shù)式編程思想操作數(shù)據(jù)或者集合(這個(gè)Jser創(chuàng)造了CoffeScript、Backbone、UnderScore,Lodash是從Underscore項(xiàng)目派生出來(lái)的,大家可以膜拜大神Jeremy Ashkenas)。Backbone影響深遠(yuǎn)。比如facebook的 parse(中國(guó)克隆版叫LeanCloud)這種無(wú)后端服務(wù)就從Backbone借鑒了很多。
Angular.js的產(chǎn)生是跨時(shí)代的,這個(gè)大而全的框架讓單頁(yè)應(yīng)用的開(kāi)發(fā)更為容易。
最開(kāi)始Jser們并不是很適應(yīng)Angular,反倒Java程序員可以很快的上手,因?yàn)锳ngular 借助了很多 Spring的思想比如依賴注入。
Angular 仍然深受 jQuery 的影響,內(nèi)部實(shí)現(xiàn)了極簡(jiǎn)版本的選擇器。Angular進(jìn)行雙向綁定,這個(gè)牛逼的特性也有時(shí)因?yàn)樾阅軉?wèn)題被詬病。
JavaScript 庫(kù)也借鑒了很多客戶端開(kāi)發(fā)的思想,比如React、Vue。
個(gè)人覺(jué)得,拿Angular、React、Vue這些庫(kù)比較,論其優(yōu)劣意義不大。他們產(chǎn)生的時(shí)代不同,解決的問(wèn)題不同。React、Vue離開(kāi)Router和生態(tài)圈的其他組件也無(wú)法構(gòu)建單頁(yè)應(yīng)用。
React.jsReact并不是一個(gè)大而全的框架,主要專注在UI層,React以Component的方式組織應(yīng)用:一個(gè)Component包含這個(gè)組件的模版(樣式)和行為邏輯。多個(gè)Component可以組合,產(chǎn)生兄弟、父子的Component結(jié)構(gòu)關(guān)系。
以往開(kāi)發(fā)強(qiáng)調(diào)結(jié)構(gòu)、樣式、行為的分離。但從組件角度看來(lái),所有這些都是構(gòu)成組件不可分割的整體。JSX使得HTML與JS的混編更為容易,同時(shí)React組件也可以使用內(nèi)聯(lián)方式來(lái)組織樣式。
React默認(rèn)單向綁定,在State發(fā)生變換后重新渲染DOM。從Component的生命周期中,我們可以看到客戶端開(kāi)發(fā)的影子(特別有iOS開(kāi)發(fā)的經(jīng)驗(yàn)的話)。譬如componentWillMount、componentDidMount、componentWillReceiveProps、componentWillUnmount這些生命周期的鉤子就是像客戶端開(kāi)發(fā)學(xué)習(xí)的例子。一方面,生命周期的增加細(xì)化了開(kāi)發(fā)的粒度,另一方,也為前端的再一次拓展做了充分地準(zhǔn)備。
父組件通過(guò)props向子組件傳值,子組件調(diào)用porps所傳遞的父組件的方法來(lái)執(zhí)行業(yè)務(wù)邏輯。這點(diǎn),非常類似iOS開(kāi)發(fā)中的委托代理模式,同樣是向客戶端開(kāi)發(fā)技術(shù)學(xué)習(xí)的例子。
React調(diào)用render方法對(duì)Component進(jìn)行渲染,其中涉及了Virtual DOM機(jī)制和只能的diff算法——只更新發(fā)生變化的DOM,以此提高渲染的效率。
React并沒(méi)有提供完成的數(shù)據(jù)管理方案,F(xiàn)lux也僅僅是一個(gè)實(shí)踐的建議。去年,各種Flux解決方案百花齊放,Redux獲得了最大的關(guān)注度。使用Redux是一個(gè)從入門到懵逼的過(guò)程,而且往往不知所以然,然后“這廝”有引入了Store、Action、這些概念。建議大家不要為了Flux而Flux,多做一些實(shí)踐,了解函數(shù)式編程,了解Map、Reduce的概念,再深入Redux:
在這里分享些自己的認(rèn)識(shí):每一個(gè)組件都有自己的State,有層次關(guān)系的State共同組成一顆狀態(tài)樹(shù)來(lái)記錄整個(gè)應(yīng)用的狀態(tài)。當(dāng)Aciton被觸發(fā)后,State隨之更新,React以此部分地更新應(yīng)用的狀態(tài)和視圖(State ---Action---> State")。貼一個(gè)自己總結(jié)的白板圖:
這里第一次提到Immultable這個(gè)概念:總是不改變?cè)瓉?lái)的對(duì)象而生成新的對(duì)象。Immultable,讓時(shí)光大法得以實(shí)現(xiàn)。我們?nèi)绻袲OM看做是State在UI層的映射,難么從State"到State后,自然能把UI層還原到原來(lái)的狀態(tài):Redux黑魔法。
Angular 2Angular 2 已經(jīng)到了Realease Candidate階段,從alpha階段開(kāi)始,每一次release都有一大堆BREAKING CHANGES(MD API說(shuō)變就變)。
不過(guò)好在基本每個(gè)版本我都在跟進(jìn),還是做了些實(shí)踐。
如果大家抱著學(xué)習(xí)的心態(tài),一定不要去看國(guó)外或者知乎大神們對(duì)各種框架的褒貶,也不要去搜“我究竟是學(xué)習(xí)(使用)React、Angular 2、Ember還是Vue這種問(wèn)題”,了解它們的思想和解決問(wèn)題的方式。
Angular 一直使用依賴注入的單例模式解決數(shù)據(jù)管理的問(wèn)題。Angular 2使用zone.js實(shí)現(xiàn)了一個(gè)新的臟值檢查機(jī)制,并在瀏覽器端使用System.js管理code的依賴。
使用 TypeScript 進(jìn)行開(kāi)發(fā),意味著從生產(chǎn)到上線過(guò)程必須經(jīng)過(guò)編譯和轉(zhuǎn)換,特別裝飾符的使用,讓代碼表意性更強(qiáng),同時(shí)裝飾符作為元數(shù)據(jù),指導(dǎo)TypeScript的編譯過(guò)程。
舉個(gè)例子,我們看看Angular 2如何解決表單的驗(yàn)證問(wèn)題:
Angular 2將每一個(gè)表單項(xiàng)(比如 input、textArea、radio)抽象為一個(gè)Control,將整個(gè)表單抽象為一個(gè)ControlGroup。每一個(gè)Control都有自己的驗(yàn)證規(guī)則,ControlGroup的合法性又由其包含的所有Control共同決定。這個(gè)實(shí)踐使得驗(yàn)證邏輯與表單DOM實(shí)現(xiàn)了分離,更為清晰,同時(shí)原本操蛋的表單測(cè)試變得簡(jiǎn)單易行,因?yàn)闇y(cè)試ControlGroup時(shí)并不需要依賴于DOM。
分享一篇我翻譯的文章:Angular 2核心概念,閱讀后可以對(duì)Angular 2 有一個(gè)大致的了解。
Angular 2是對(duì)WebComponent的漸進(jìn),通過(guò)WebComponent,我們可以導(dǎo)入和使用各種成熟的組件,而不用關(guān)心它的具體實(shí)現(xiàn),就像黑盒一樣進(jìn)行使用:例如我們想嵌入一個(gè)百度地圖的WebComponent,可以這么寫(xiě):
于是就I生成一個(gè)指定大小和位置的地圖組件(百度地圖沒(méi)有這東西,我YY的,股溝有)。
Vue這個(gè)框架我不是很了解,開(kāi)發(fā)者是尤雨溪大神,在github上stars超過(guò)10,000。
手機(jī)淘寶的勾股大神一直在布道、推廣、實(shí)踐。個(gè)人覺(jué)得Vue的核心貢獻(xiàn)者太少了,拉上阿里巴巴是一個(gè)明智的選擇,畢竟很多前端大神可以共同完善它。
再看Virtual DOM這個(gè)概念,就像是薛定諤的貓,在渲染前什么都是、什么都不是。Virtual DOM是一個(gè)抽象的概念,也組成了另一個(gè)抽象概念—— Component。(這個(gè)堪稱是FB的野心,以后估計(jì)很多人被這個(gè)東西搞失業(yè))。
一個(gè)視覺(jué)元素,一個(gè)用戶事件,可以做如下抽象:
/***** /(html) View (iOS) UIView click /(html) Click (iOS) TouchUpInside *****/
我們發(fā)現(xiàn),如果在編譯時(shí)View、Click才與運(yùn)行環(huán)境相關(guān),那么app、web app的開(kāi)發(fā)其實(shí)是可以共享大部分代碼的,這個(gè)時(shí)候JavaScript變?yōu)榱酥虚g語(yǔ)言。
這個(gè)想法早在cocos2d中就已經(jīng)實(shí)現(xiàn),進(jìn)行游戲開(kāi)發(fā)的同學(xué)使用c++進(jìn)行游戲開(kāi)發(fā),編譯后產(chǎn)生安卓和 iOS 的版本平臺(tái)相關(guān)的游戲。
React-Native就是這個(gè)思路的實(shí)踐者,通過(guò)js綁定了OC或者安卓的運(yùn)行環(huán)境,開(kāi)發(fā)出性能接近于原生的原生應(yīng)用。React-Native大法延展了JS的廣度,也填補(bǔ)了iOS和安卓開(kāi)發(fā)間的技術(shù)溝壑。
另一個(gè)黑魔法是熱更新,以往大幅度更新App只能在App Store、安卓各大渠道發(fā)布更新,然后從應(yīng)用商店提示用戶升級(jí),每一次提交都需要被審核,更何況并不是每一個(gè)用戶都知道或者想去安裝每一個(gè)更新版本(比如我媽)。通過(guò)React-Native可以直接下載新的bundle,實(shí)現(xiàn)熱更新。
論壇里,有人討論React-Native熱度驟減,你們?nèi)ス倬W(wǎng)看看,人家才v0.25。很多公司用不好駕馭不了React-Native原因出在缺少既了解客戶端開(kāi)發(fā)有了解前端開(kāi)發(fā)的程序猿(媛):不能否認(rèn),Reactive-Natvie的產(chǎn)生是大勢(shì)所趨。
說(shuō)道阿里在搞的Weex,也是在向這個(gè)方向探索,如果特別成功并且使用廣泛的話一定會(huì)把Vue搞得更大:尤雨溪大神在這個(gè)問(wèn)題上相當(dāng)?shù)拿髦堑摹?/p>
再回到Angular 2,DomRenderer.getNativeElementSync(elementRef)也不是在做同樣的事情嗎?相關(guān)項(xiàng)目詳見(jiàn):NativeScript 。
除了JavaScript,CSS 也在嘗試成為與平臺(tái)無(wú)關(guān)的樣式語(yǔ)言。React-Native就實(shí)現(xiàn)了CSS 的部分子集與iOS、Android的綁定。
大前端未來(lái)的前端是一個(gè)包含但不僅限于app和web,從事多端構(gòu)建任務(wù)的程序員工種。團(tuán)隊(duì)中單一技能的人員會(huì)越來(lái)越少,客戶端與web端的界限也會(huì)越來(lái)越模糊。
同時(shí)新的技術(shù)大多會(huì)在不同領(lǐng)域交叉點(diǎn)產(chǎn)生。網(wǎng)絡(luò)提速,設(shè)別處理能力提高后,應(yīng)用大小、性能可能退居第二,用戶體驗(yàn)和開(kāi)發(fā)效率提升到第一。
比如很多公司,由于擔(dān)心js、css打包后過(guò)大,放棄使用框架。這點(diǎn)我持保留意見(jiàn),快速迭代的產(chǎn)品必須有敏捷的技術(shù)棧和穩(wěn)定的框架。
目前新版本的Chrome、Node.js對(duì)ES6標(biāo)準(zhǔn)的支持已經(jīng)超過(guò)90%,Babel這一類工具的生命周期不會(huì)很長(zhǎng),TypeScript可能會(huì)越走越遠(yuǎn)。
給大家的建議道阻且長(zhǎng),冰凍三尺非一日之寒;
廣泛地學(xué)習(xí),有條件和能力的同學(xué)盡早地接觸客戶端開(kāi)發(fā),更多地了解服務(wù)端開(kāi)發(fā);
前端大有可為,新技術(shù)的發(fā)明者大多不是老東西,老東西經(jīng)驗(yàn)足但是歷史包袱重;
只在瀏覽器中思考必死無(wú)疑;
像一位同學(xué)提到的,打好基礎(chǔ),offer就有。學(xué)校里倒騰幾年真的很難搞出什么大新聞,面試官也不會(huì)刻意為難你;
測(cè)試測(cè)試測(cè)試,前端測(cè)試值得學(xué)習(xí)掌握,比如e2e,這是一個(gè)機(jī)會(huì):我能告訴你很多公司的前端測(cè)試都瞎JB點(diǎn)嗎?
學(xué)習(xí)一些函數(shù)式編程的思想,例如:lodash、Redux、RxJS;
拿到offer只是開(kāi)始不要嘚瑟。
番外篇——理性看待前端緊缺的現(xiàn)象剛?cè)肼毺詫殨r(shí),團(tuán)隊(duì)里有許多前端外包同學(xué),后來(lái)很大一部分轉(zhuǎn)正了,有經(jīng)驗(yàn)的前端工程師一直稀缺。
2012年,PC購(gòu)物還是主流,我們見(jiàn)證了無(wú)線成交額(GMV)逐漸趕超PC的時(shí)刻:端的重心越來(lái)越向mobile(App)移動(dòng)。
Hybrid App很流行,部分是因?yàn)镹ative開(kāi)發(fā)更為復(fù)雜,同時(shí)審核、更新機(jī)制緩慢。每一次手淘release都要考慮與老版本的兼容性,幾百號(hào)人同時(shí)開(kāi)發(fā)二個(gè)(安卓、iOS)App想想多復(fù)雜。
H5在webview中運(yùn)行,隨時(shí)可以更新、快速迭代,新產(chǎn)品或者是活動(dòng)頁(yè)面大多數(shù)會(huì)采用H5的形式進(jìn)行發(fā)布;甚至很多小公司由于財(cái)力和技術(shù)儲(chǔ)備有限,直接用App做殼,里面全是用H5來(lái)開(kāi)發(fā):因此市場(chǎng)上產(chǎn)生了很大的H5程序員的需求。
且慢,沒(méi)有任何人說(shuō)過(guò)H5比Native更好,也沒(méi)有什么H5的春天,一切的一切都是因?yàn)镹ative 開(kāi)發(fā)、更新不夠成熟。但也僅限在一個(gè)時(shí)間段內(nèi)。
如果一切問(wèn)題都不是問(wèn)題了,干嘛不全做Native?目前看來(lái)類似于React-Native、JsPatch這樣的技術(shù)逐漸會(huì)讓很多前端失業(yè)或是是被動(dòng)轉(zhuǎn)崗到純PC業(yè)務(wù)。
番外篇——推薦學(xué)習(xí)資源You don"t know JS,clone下來(lái)以后用markdone閱讀器閱讀;
ES6 教程,阮一峰大神的ES6教程,紙質(zhì)書(shū)可以在京東啥的買到;
LeanPub,自出版書(shū)籍網(wǎng)站,每次更新都會(huì)發(fā)布新版本。支持Visa支付;
Manning,特別是MEAP系列的圖書(shū),按章節(jié)更新,最新一手資料,支持Visa、PayPal支付;
CodeSchool,在線學(xué)習(xí)網(wǎng)站,覆蓋前端、iOS、Ruby等,可以先試試免費(fèi)課程,支持Visa、PayPal支付;
EggHead,在線學(xué)習(xí)網(wǎng)站,先試試免費(fèi)課程,授課人大神極多,基本涵蓋了最新的前端技術(shù),支持Visa支付,200刀一年略貴;
要是覺(jué)得貴,想想火麒麟。
番外篇——F&QQ:樓主現(xiàn)在在干嘛?
A:五道口,創(chuàng)業(yè)狗。負(fù)責(zé)公司的技術(shù)和產(chǎn)品。
Q:還有什么想說(shuō)的?
A:帖子還會(huì)更新維護(hù)。
Q:聯(lián)系方式?
A:微信請(qǐng)加mumuzhenzhen,告訴我你是誰(shuí)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/87757.html
摘要:圍繞以太坊的開(kāi)發(fā)生態(tài)是目前相對(duì)最成熟的,比如有開(kāi)發(fā)框架,有智能合約在線集成開(kāi)發(fā)環(huán)境,還有專設(shè)的開(kāi)發(fā)者問(wèn)答頻道。 showImg(https://segmentfault.com/img/bVbaJOL?w=1200&h=514); 張泉靈說(shuō),時(shí)代拋棄我們的時(shí)候連聲再見(jiàn)都不會(huì)說(shuō),馬云說(shuō)對(duì)于新興事物,絕大多數(shù)人是看不見(jiàn)、看不起、看不懂、來(lái)不及。自從學(xué)完 Coursera 上的 Crypto...
摘要:圍繞以太坊的開(kāi)發(fā)生態(tài)是目前相對(duì)最成熟的,比如有開(kāi)發(fā)框架,有智能合約在線集成開(kāi)發(fā)環(huán)境,還有專設(shè)的開(kāi)發(fā)者問(wèn)答頻道。 showImg(https://segmentfault.com/img/bVbaJOL?w=1200&h=514); 張泉靈說(shuō),時(shí)代拋棄我們的時(shí)候連聲再見(jiàn)都不會(huì)說(shuō),馬云說(shuō)對(duì)于新興事物,絕大多數(shù)人是看不見(jiàn)、看不起、看不懂、來(lái)不及。自從學(xué)完 Coursera 上的 Crypto...
摘要:轉(zhuǎn)行前端有哪些疑慮在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無(wú)可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫(xiě)在前面這里前后端指的是開(kāi)發(fā)的前后端。 轉(zhuǎn)行前端有哪些疑慮? 在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無(wú)可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫(xiě)在前面:這里前后端指的是web開(kāi)發(fā)的前后端。1、前端崗位需...
摘要:轉(zhuǎn)行前端有哪些疑慮在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無(wú)可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫(xiě)在前面這里前后端指的是開(kāi)發(fā)的前后端。 轉(zhuǎn)行前端有哪些疑慮? 在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無(wú)可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫(xiě)在前面:這里前后端指的是web開(kāi)發(fā)的前后端。1、前端崗位需...
摘要:轉(zhuǎn)行前端有哪些疑慮在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無(wú)可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫(xiě)在前面這里前后端指的是開(kāi)發(fā)的前后端。 轉(zhuǎn)行前端有哪些疑慮? 在人生的抉擇處,尋求一些別人的經(jīng)驗(yàn)和總結(jié),無(wú)可厚非,但是決定了就一定要堅(jiān)定的走下去,謹(jǐn)慎是為了更好的堅(jiān)持,而不是放棄的理由。寫(xiě)在前面:這里前后端指的是web開(kāi)發(fā)的前后端。1、前端崗位需...
閱讀 3684·2021-08-10 09:42
閱讀 584·2019-08-30 15:55
閱讀 880·2019-08-30 15:54
閱讀 3104·2019-08-30 13:45
閱讀 549·2019-08-29 16:23
閱讀 1986·2019-08-29 16:23
閱讀 976·2019-08-29 15:18
閱讀 2255·2019-08-29 12:57