2017-12-14 我發(fā)了一篇文章《沒(méi)用過(guò)Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當不錯的,甚至連著(zhù)名的hax賀老都很認同,下班時(shí)讀那篇文章,竟然坐車(chē)的還坐過(guò)站了。大家可以很明顯的感到Node.js的普及度還不夠,還存很多誤解。甚至說(shuō)很多小白用戶(hù)也得不到很好的學(xué)習。大神都功成身退,書(shū)也跟不上,大部分都是2013年左右的,Node.js版本都是基于v0.10左右的,現在已經(jīng)v9了。想想也是有點(diǎn)可惜,使用如此廣泛的Node.js被大家默認,卻沒(méi)人來(lái)科普。
反思之后,我就想準備一個(gè)科普的Live,于是就有了《狼叔:如何正確學(xué)習 Node.js?》,相信能夠對很多喜歡Node.js的朋友有所幫助。Live已完成目前1200多人,230人評價(jià),平均4.8+,還算是一個(gè)比較成功的Live?,F整理出來(lái),希望對更多朋友有用。
感謝 @justjavac 大神的 免費的計算機編程類(lèi)中文書(shū)籍 收錄并推薦
Live 簡(jiǎn)介
現在,越來(lái)越多的科技公司和開(kāi)發(fā)者開(kāi)始使用 Node.js 開(kāi)發(fā)各種應用。Node.js除了能夠輔助大前端開(kāi)發(fā)外,還可以編寫(xiě)Web應用,封裝Api,組裝RPC服務(wù)等,甚至是開(kāi)發(fā)VSCode編輯器一樣的PC客戶(hù)端。和其它技術(shù)相比, Node.js 簡(jiǎn)單易學(xué),性能好、部署容易,能夠輕松處理高并發(fā)場(chǎng)景下的大量服務(wù)器請求。Node.js 周邊的生態(tài)也非常強大,NPM(Node包管理)上有超過(guò)60萬(wàn)個(gè)模塊,日下超過(guò)載量3億次。但編寫(xiě) Node.js 代碼對新人和其它語(yǔ)言背景的開(kāi)發(fā)者來(lái)說(shuō),不是一件容易的事,在入門(mén)之前需要弄懂不少復雜的概念。
我身邊也有很多人問(wèn)我:如何學(xué)習 Node.js ?作為一名 Node.js 布道者,我做過(guò)很多 Node.js 普及和推廣的工作,對它的基本概念和核心模塊都很熟悉; 此外,我還在撰寫(xiě)一本名為《更了不起的 Node.js 》的書(shū),已經(jīng)寫(xiě)了 2 年,積累了很豐富的資料,本次 Live 也將為你提供對 Node.js 更全面的解讀。
本次 Live 主要包括以下內容,目錄
Part 0 :Node.js簡(jiǎn)介
a)Node.js簡(jiǎn)介
b)什么是Node.js?
c)基本原理
Part 1前言:學(xué)習 Node.js 的三個(gè)境界
Part 2準備:如何學(xué)習Node.js
2.1 Node 用途那么多,我該從哪里學(xué)起?
2.2 Node Web 框架那么多,我該怎么選?
2.3 關(guān)于 Node 的書(shū)幾乎都過(guò)時(shí)了,我該買(mǎi)哪本?
Part 3延伸:大前端變化那么快,如何才能做到每日精進(jìn)?
Part 4實(shí)踐:從招聘角度來(lái)看, Node.js 開(kāi)發(fā)需要具備哪些技能?
Part 5答疑:回答大家的問(wèn)題
本次Live主要是科普,適用新用戶(hù)和比較迷茫的Node朋友,希望大家多多理解和支持。
a)Node.js簡(jiǎn)介
b)什么是Node.js?
c)基本原理
Node.js 誕生于 2009 年,由 Joyent 的員工 Ryan Dahl 開(kāi)發(fā)而成,之后 Joyent 公司一直扮演著(zhù) Node.js 孵化者的角色。由于諸多原因,Ryan 在2012年離開(kāi)社區,隨后在2015年由于 Node 貢獻者對 es6 新特性集成問(wèn)題的分歧,導致分裂出iojs,并由 iojs 發(fā)布1.0、2.0和3.0版本。由于 iojs 的分裂最終促成了2015年Node基金會(huì )的成立,并順利發(fā)布了4.0版本。Node.js基金會(huì )的創(chuàng )始成員包括 Google、Joyent、IBM、Paypal、微軟、Fidelity 和 Linux基金會(huì ),創(chuàng )始成員將共同掌管過(guò)去由 Joyent 一家企業(yè)掌控的 Node.js 開(kāi)源項目。此后,Node.js基金會(huì )發(fā)展非常好,穩定的發(fā)布5、6、7、8等版本,截止發(fā)稿最新版本已經(jīng)是8.6,長(cháng)期支持版本是6.11。
Node.js 不是一門(mén)語(yǔ)言也不是框架,它只是基于 Google V8 引擎的 JavaScript 運行時(shí)環(huán)境,同時(shí)結合 Libuv 擴展了 JavaScript 功能,使之支持 io、fs 等只有語(yǔ)言才有的特性,使得 JavaScript 能夠同時(shí)具有 DOM 操作(瀏覽器)和 I/O、文件讀寫(xiě)、操作數據庫(服務(wù)器端)等能力,是目前最簡(jiǎn)單的全棧式語(yǔ)言。
早在2007年,Jeff Atwood 就提出了著(zhù)名的 Atwood定律
任何能夠用 JavaScript 實(shí)現的應用系統,最終都必將用 JavaScript 實(shí)現
目前 Node.js 在大部分領(lǐng)域都占有一席之地,尤其是 I/O 密集型的,比如 Web 開(kāi)發(fā),微服務(wù),前端構建等。不少大型網(wǎng)站都是使用 Node.js 作為后臺開(kāi)發(fā)語(yǔ)言的,用的最多的就是使用Node.js做前端渲染和架構優(yōu)化,比如 淘寶 雙十一、去哪兒網(wǎng) 的 PC 端核心業(yè)務(wù)等。另外,有不少知名的前端庫也是使用 Node.js 開(kāi)發(fā)的,比如,Webpack 是一個(gè)強大的打包器,React/Vue 是成熟的前端組件化框架。
Node.js通常被用來(lái)開(kāi)發(fā)低延遲的網(wǎng)絡(luò )應用,也就是那些需要在服務(wù)器端環(huán)境和前端實(shí)時(shí)收集和交換數據的應用(API、即時(shí)聊天、微服務(wù))。阿里巴巴、騰訊、Qunar、百度、PayPal、道瓊斯、沃爾瑪和 LinkedIn 都采用了 Node.js 框架搭建應用。
另外, Node.js 編寫(xiě)的包管理器 npm 已成為開(kāi)源包管理了領(lǐng)域最好的生態(tài),直接到2017年10月份,有模塊超過(guò)47萬(wàn),每周下載量超過(guò)32億次,每個(gè)月有超過(guò)700萬(wàn)開(kāi)發(fā)者使用npm。
當然了,Node.js 也有一些缺點(diǎn)。Node.js 經(jīng)常被人們吐槽的一點(diǎn)就是:回調太多難于控制(俗稱(chēng)回調地獄)和 CPU 密集任務(wù)處理的不是很好。但是,目前異步流程技術(shù)已經(jīng)取得了非常不錯的進(jìn)步,從Callback、Promise 到 Async函數,可以輕松的滿(mǎn)足所有開(kāi)發(fā)需求。至于 CPU 密集任務(wù)處理并非不可解,方案有很多,比如通過(guò)系統底層語(yǔ)言 Rust 來(lái)擴展 Node.js,但這樣會(huì )比較麻煩。筆者堅信在合適的場(chǎng)景使用合適的東西,尤其是在微服務(wù)架構下,一切都是服務(wù),可以做到語(yǔ)言無(wú)關(guān)。如果大家想使 JavaScript 做 CPU 密集任務(wù),推薦 Node.js 的兄弟項目 fibjs,基于纖程(fiber,可以簡(jiǎn)單理解為更輕量級的線(xiàn)程),效率非常高,兼容npm,同時(shí)沒(méi)有異步回調煩惱。
按照 Node.js官方網(wǎng)站主頁(yè) 的說(shuō)法:
Node.js? is a JavaScript runtime built on Chromes V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js package ecosystem, npm, is the largest ecosystem of open source libraries in the world.從這段介紹來(lái)看,解讀要點(diǎn)如下
Node.js 不是 JavaScript 應用,不是語(yǔ)言(JavaScript 是語(yǔ)言),不是像 Rails(Ruby)、 Laravel(PHP) 或 Django(Python) 一樣的框架,也不是像 Nginx 一樣的 Web 服務(wù)器。Node.js 是 JavaScript 運行時(shí)環(huán)境
構建在 Chromes V8 這個(gè)著(zhù)名的 JavaScript 引擎之上,Chrome V8 引擎以 C/C++ 為主,相當于使用JavaScript 寫(xiě)法,轉成 C/C++ 調用,大大的降低了學(xué)習成本
事件驅動(dòng)(event-driven),非阻塞 I/O 模型(non-blocking I/O model),簡(jiǎn)單點(diǎn)講就是每個(gè)函數都是異步的,最后由 Libuv 這個(gè) C/C++ 編寫(xiě)的事件循環(huán)處理庫來(lái)處理這些 I/O 操作,隱藏了非阻塞 I/O 的具體細節,簡(jiǎn)化并發(fā)編程模型,讓你可以輕松的編寫(xiě)高性能的Web應用,所以它是輕量(lightweight)且高效(efficient)的
使用 npm 作為包管理器,目前 npm 是開(kāi)源庫里包管理最大的生態(tài),功能強大,截止到2017年12月,模塊數量超過(guò) 60 萬(wàn)+
大多數人都認為 Node.js 只能寫(xiě)網(wǎng)站后臺或者前端工具,這其實(shí)是不全面的,Node.js的目標是讓并發(fā)編程更簡(jiǎn)單,主要應用在以網(wǎng)絡(luò )編程為主的 I/O 密集型應用。它是開(kāi)源的,跨平臺,并且高效(尤其是I/O處理),包括IBM、Microsoft、Yahoo、SAP、PayPal、沃爾瑪及GoDaddy都是 Node.js 的用戶(hù)。
下面是一張 Node.js 早期的架構圖,來(lái)自 Node.js 之父 Ryan Dahl 的演講稿,在今天依然不過(guò)時(shí),它簡(jiǎn)要的介紹了 Node.js 是基于 Chrome V8引擎構建的,由事件循環(huán)(Event Loop)分發(fā) I/O 任務(wù),最終工作線(xiàn)程(Work Thread)將任務(wù)丟到線(xiàn)程池(Thread Pool)里去執行,而事件循環(huán)只要等待執行結果就可以了。
核心概念
Chrome V8 是 Google 發(fā)布的開(kāi)源 JavaScript 引擎,采用 C/C++ 編寫(xiě),在 Google 的 Chrome 瀏覽器中被使用。Chrome V8 引擎可以獨立運行,也可以用來(lái)嵌入到 C/C++ 應用程序中執行。
Event Loop 事件循環(huán)(由 libuv 提供)
Thread Pool 線(xiàn)程池(由 libuv 提供)
梳理一下
Chrome V8 是 JavaScript 引擎
Node.js 內置 Chrome V8 引擎,所以它使用的 JavaScript 語(yǔ)法
JavaScript 語(yǔ)言的一大特點(diǎn)就是單線(xiàn)程,也就是說(shuō),同一個(gè)時(shí)間只能做一件事
單線(xiàn)程就意味著(zhù),所有任務(wù)需要排隊,前一個(gè)任務(wù)結束,才會(huì )執行后一個(gè)任務(wù)。如果前一個(gè)任務(wù)耗時(shí)很長(cháng),后一個(gè)任務(wù)就不得不一直等著(zhù)。
如果排隊是因為計算量大,CPU 忙不過(guò)來(lái),倒也算了,但是很多時(shí)候 CPU 是閑著(zhù)的,因為 I/O 很慢,不得不等著(zhù)結果出來(lái),再往下執行
CPU 完全可以不管 I/O 設備,掛起處于等待中的任務(wù),先運行排在后面的任務(wù)
將等待中的 I/O 任務(wù)放到 Event Loop 里
由 Event Loop 將 I/O 任務(wù)放到線(xiàn)程池里
只要有資源,就盡力執行
我們再換一個(gè)維度看一下
核心
Chrome V8 解釋并執行 JavaScript 代碼(這就是為什么瀏覽器能執行 JavaScript 原因)
libuv 由事件循環(huán)和線(xiàn)程池組成,負責所有 I/O 任務(wù)的分發(fā)與執行
在解決并發(fā)問(wèn)題上,異步是最好的解決方案,可以拿排隊和叫號機來(lái)理解
排隊:在排隊的時(shí)候,你除了等之外什么都干不了
叫號機:你要做的是先取號碼,等輪到你的時(shí)候,系統會(huì )通知你,這中間,你可以做任何你想做的事兒
Node.js 其實(shí)就是幫我們構建類(lèi)似的機制。我們在寫(xiě)代碼的時(shí)候,實(shí)際上就是取號的過(guò)程,由 Event Loop 來(lái)接受處理,而真正執行操作的是具體的線(xiàn)程池里的 I/O 任務(wù)。之所以說(shuō) Node.js 是單線(xiàn)程,就是因為在接受任務(wù)的時(shí)候是單線(xiàn)程的,它無(wú)需進(jìn)程/線(xiàn)程切換上下文的成本,非常高效,但它在執行具體任務(wù)的時(shí)候是多線(xiàn)程的。
Node.js 公開(kāi)宣稱(chēng)的目標是 “旨在提供一種簡(jiǎn)單的構建可伸縮網(wǎng)絡(luò )程序的方法”,毫無(wú)疑問(wèn),它確實(shí)做到了。這種做法將并發(fā)編程模型簡(jiǎn)化了,Event Loop和具體線(xiàn)程池等細節被 Node.js 封裝了,繼而將異步調用 Api 寫(xiě)法暴露給開(kāi)發(fā)者。真是福禍相依,一方面簡(jiǎn)化了并發(fā)編程,另一方面在寫(xiě)法上埋下了禍根,這種做法的好處是能讓更多人輕而易舉的寫(xiě)出高性能的程序!
在Node.js Bindings層做的事兒就是將 Chrome V8 等暴露的 C/C++ 接口轉成JavaScript Api,并且結合這些 Api 編寫(xiě)了 Node.js 標準庫,所有這些 Api 統稱(chēng)為 Node.js SDK,后面模塊章節會(huì )有更詳細的討論。
微軟在2016年宣布在MIT許可協(xié)議下開(kāi)放 Chakra 引擎,并以 ChakraCore 為名在 Github 上開(kāi)放了源代碼,ChakraCore 是一個(gè)完整的 JavaScript 虛擬機,它擁有著(zhù)和 Chakra 幾乎相同的功能與特性。微軟向 Node.js 主分支提交代碼合并請求,讓 Node.js 用上 ChakraCore引擎,即 nodejs/node-chakracore 項目。實(shí)際上微軟是通過(guò)創(chuàng )建名為 V8 shim 的庫的賦予了 ChakraCore 處理谷歌 Chrome V8 引擎指令的能力,其原理示意圖如下
目前,Node.js 同時(shí)支持這2種 JavaScript 引擎,二者性能和特性上各有千秋,ChakraCore 在特性上感覺(jué)更潮一些,曾經(jīng)是第一個(gè)支持 Async函數 的引擎,但目前 Node.js 還是以 Chrome V8 引擎為主, ChakraCore 版本需要單獨安裝,大家了解一下就好。
我總結的編程3種境界
打日志:console.log
斷點(diǎn)調試:斷點(diǎn)調試:node debugger 或node inspector 或vscode
測試驅動(dòng)開(kāi)發(fā)(tdd | bdd)
大家可以自測一下,自己在哪個(gè)水平?如果是第三個(gè)階段,那么本場(chǎng)Live可能不太適合你。哈哈哈
Node不是語(yǔ)言,不是框架,只是基于V8運行時(shí)環(huán)境。結合libuv能夠通過(guò)js語(yǔ)法獲得更好的等價(jià)于c/c++的性能。
它很簡(jiǎn)單,異步是解決并發(fā)的最佳實(shí)踐。本節主要講如何學(xué)習Node.js,是本次Live非常核心的內容,大家要注意聽(tīng)。
1)js語(yǔ)法必須會(huì )
js基本語(yǔ)法,都是c語(yǔ)系的,有其他語(yǔ)言背景學(xué)習起來(lái)相對更簡(jiǎn)單
常見(jiàn)用法,比如正則,比如數據結構,尤其是數組的幾種用法。比如bind/call/apply等等
面向對象寫(xiě)法。js是基于對象的,所以它的oo寫(xiě)起來(lái)非常詭異。參見(jiàn)紅皮書(shū)JavaScript高級編程,很多框架都是自己實(shí)現oo基礎框架,比如ext-core等。
犀牛書(shū),《JavaScript權威指南》,沒(méi)事就多翻翻,看少多少遍都不為過(guò)。
2)個(gè)人學(xué)習和技術(shù)選型都要循序漸進(jìn)
先能寫(xiě),采用面向過(guò)程寫(xiě)法,簡(jiǎn)單理解就是定義一堆function,然后調用,非常簡(jiǎn)單
然后再追求更好的寫(xiě)法,可以面向對象。對于規?;木幊虂?lái)說(shuō),oo是有它的優(yōu)勢的,一般java、c#,ruby這些語(yǔ)言里都有面向對象,所以后端更習慣,但對于語(yǔ)言經(jīng)驗不那么強的前端來(lái)說(shuō)算高級技巧。
等oo玩膩了,可以有更好的追求:函數式編程,無(wú)論編程思維,還是用法上都對已有的編程思維是個(gè)挑戰。我很喜歡函數式,但不太會(huì )在團隊里使用,畢竟oo階段還沒(méi)完全掌握,風(fēng)險會(huì )比較大。但如果團隊水平都非常高了,團隊穩定是可以用的。
可以看出我的思路,先能寫(xiě),然后再追求更好的寫(xiě)法,比如面向對象。等團隊水平到一定程度了,并且穩定的時(shí)候,可以考慮更加極致的函數式寫(xiě)法。
團隊是這樣選型的,個(gè)人學(xué)習也這樣,最好是循序漸進(jìn),步子邁大了不好。
3)各種高級的JavaScript友好語(yǔ)言
JavaScript友好語(yǔ)言指的是能夠使用其他語(yǔ)法實(shí)現,但最終編譯成js的語(yǔ)言。自從Node.js出現后,這種黑科技層出不窮。比如比較有名的coffee、typescript、babel(es)等。
CoffeeScript雖然也是JavaScript友好語(yǔ)言,但其語(yǔ)法借鑒ruby,崇尚極簡(jiǎn),對于類(lèi)型和OO機制上還是偏弱,而且這么多年也沒(méi)發(fā)展起來(lái),仍然是比較小眾的活著(zhù)。未來(lái)比例會(huì )越來(lái)越少的。
顯然TypeScript會(huì )越來(lái)越好,TypeScript 的強大之處是要用過(guò)才知道的。
1)規?;幊?,像Java那種,靜態(tài)類(lèi)型,面向對象,前端只有TypeScript能做到
2)親爹是微軟安德斯·海爾斯伯格,不知道此人的請看borland傳奇去
3)開(kāi)源,未來(lái)很好
4)組合拳:TypeScript + VSCode = 神器
當下前端發(fā)展速度極快,以指數級的曲線(xiàn)增長(cháng)。以前可能1年都不一定有一項新技術(shù),現在可能每個(gè)月都有。大前端,Node全棧,架構演進(jìn)等等都在快速變化??梢哉f(shuō),前端越復雜,有越多的不確定性,TypeScript的機會(huì )就越大。
4)再論面向對象
面向對象想用好也不容易的,而且js里有各種實(shí)現,真是讓人眼花繚亂。
基于原型的寫(xiě)法,縱觀(guān)JavaScript高級編程,就是翻來(lái)覆去的講這個(gè),這個(gè)很基礎,但不好是很好用??梢圆挥?,但不可以不會(huì )。
自己寫(xiě)面向對象機制是最好的,但不是每個(gè)人都有這個(gè)能力的。好在es6規范出了更好一點(diǎn)的面向對象,通過(guò)class、extends、super關(guān)鍵字來(lái)定義類(lèi),已經(jīng)明顯好很多了,雖然還很弱,但起碼勉強能用起來(lái)了。從面向過(guò)程走過(guò)來(lái)的同學(xué),推薦這種寫(xiě)法,簡(jiǎn)單易用。但要注意面向對象要有面向對象的寫(xiě)法,要理解抽象,繼承,封裝,多態(tài)4個(gè)基本特征。如果想用好,你甚至還需要看一些設計模式相關(guān)的書(shū)。好在有《JavaScript設計模式》一書(shū)。Koa2里已經(jīng)在用這種寫(xiě)法了。
js是腳本語(yǔ)言,解釋即可執行。所以它的最大缺點(diǎn)是沒(méi)有類(lèi)型系統,這在規?;幊汤锸欠浅NkU的,一個(gè)函數,傳參就能玩死人。于是現在流行使用flow和typescript來(lái)做類(lèi)型校驗。flow只是工具,比較輕量級。而typescript是es6超級,給es6補充了類(lèi)型系統和更完善的面向對象機制,所以大部分人都會(huì )對ts有好感,很有可能是未來(lái)的趨勢。
對于es6高級特性,我是比較保守的,一般node長(cháng)期支持版本lts支持的我都讓用,一些更新的特性我一般不讓使用。根本lts版本保持一致就好。
我的團隊現在是采用es6的面向對象寫(xiě)法開(kāi)發(fā),后面會(huì )一點(diǎn)一點(diǎn)轉到typescript上的。熟練oo轉到ts是非常容易的。
3m安裝法
nvm(node version manager)【需要使用npm安裝,替代品是yrm(支持yarn),nvs對window支持很好】
nrm(node registry manager)【需要使用npm安裝,替代品是yrm(支持yarn)】
npm(node packages manager)【內置,替代品是n或nvs(對win也支持)】
node版本發(fā)布非???,而且多版本共存可能性較大,推薦使用nvm來(lái)安裝node
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash
$ echo export NVM_DIR="$HOME/.nvm" >> ~/.zshrc
$ echo [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm >> ~/.zshrc
$ source ~/.zshrc
$ nvm install 0.10
$ nvm install 4
$ nvm install 6
$ nvm install 8https://registry.npmjs.com 是node官方的源(registry),服務(wù)器在國外,下載速度較慢,推薦安裝nrm來(lái)切換源,國內的cnpm和taobao的源都非???,當然,如果你想自建源也是支持的。
$ npm install --global nrm --registry=https://registry.npm.taobao.org
$ nrm use cnpmnrm切換完源之后,你安裝npm模塊的速度會(huì )更快。
$ npm install --global yarnnpm基本命令
| 名稱(chēng) | 描述 | 簡(jiǎn)寫(xiě) |
|---|---|---|
| npm install xxx | 安裝xxx模塊,但不記錄到package.json里 | npm i xxx |
| npm install --save xxx | 安裝xxx模塊,并且記錄到package.json里,字段對應的dependency,是產(chǎn)品環(huán)境必須依賴(lài)的模塊 | npm i -s xxx |
| npm install --save-de xxx | 安裝xxx模塊,并且記錄到package.json里,字段對應的dev-dependency,是開(kāi)發(fā)環(huán)境必須依賴(lài)的模塊,比如測試類(lèi)的(mocha、chai、sinon、zombie、supertest等)都在 | npm i -D xxx |
| npm install --global xxx | 全局安裝xxx模塊,但不記錄到package.json里,如果模塊里package.json有bin配置,會(huì )自動(dòng)鏈接,作為cli命令 | npm i -g xxx |
1)oh my zsh是我最習慣的shell,終端下非常好用
配合iterm2分屏 + spectacle全屏,幾乎無(wú)敵
2)brew是mac裝軟件非常好的方式,和apt-get、rpm等都非常類(lèi)似
安裝4個(gè)必備軟件
brew install git 最流行的SCM源碼版本控制軟件
brew install wget 下載、扒站神器
brew install ack 搜索代碼神器
brew install autojump 終端下多目錄跳轉神器
3)vim
我雖然不算vim黨,但也深?lèi)?ài)著(zhù)。janus是一個(gè)非常好用的vim集成開(kāi)發(fā)環(huán)境。比如ctrl-p、nerdtree等插件都集成了,對我這種懶人足夠了。
關(guān)于Node.js的IDE和編輯器有很多選擇,對比如下
| 名稱(chēng) | 是否收費 | 斷點(diǎn)調試 | 功能 |
|---|---|---|---|
| Webstorm | 收費 | 支持 | 是IDE,在代碼提示、重構等方面功能非常強大,支持的各種語(yǔ)言、框架、模板也非常多,支持斷點(diǎn)調試,好處是特別智能,缺點(diǎn)也是特別智能 |
| Sublime/TextMate | 收費 | 不支持 | 編輯器里非常好用的,textmate主要針對mac用戶(hù),sublime是跨平臺的,相信很多前端開(kāi)發(fā)都熟悉 |
| Vim/Emace | 免費 | 不支持 | 命令行下的編輯器,非常強大,難度也稍大,但更為酷炫,而且對于服務(wù)器部署開(kāi)發(fā)來(lái)說(shuō)是值得一學(xué)的 |
| VSCode/Atom | 免費 | 支持 | Atom比較早,功能強大,缺點(diǎn)稍卡頓,VSCode是微軟出的,速度快,對于Node.js 調試,重構,代碼提示等方面支持都非常好 |
Visual Studio Code是一個(gè)運行于 Mac、Windows和 Linux 之上的,針對于編寫(xiě)現代 Web 和云應用的跨平臺源代碼編輯器。它功能強大,便于調試,加上它本身也是基于 Node.js 模塊 electron 構建的,尤其要推薦大家使用。
Visual Studio Code(以下簡(jiǎn)稱(chēng)vsc)
vsc是一個(gè)比較潮比較新的編輯器(跨平臺Mac OS X、Windows和 Linux )
vsc功能和textmate、sublime、notepad++,ultraedit等比較,毫不遜色
vsc尤其是在nodejs(調試)和typescript、go上支持尤其好
vsc提供了自定義 Debugger Adapter 和 VSCode Debug Protocol 從而實(shí)現自己的調試器
值得一學(xué),我推薦VSCode編輯器!
更多調試方法,參見(jiàn)https://github.com/i5ting/nod...
《Node.js in action》一書(shū)里說(shuō),Node.js 所針對的應用程序有一個(gè)專(zhuān)門(mén)的簡(jiǎn)稱(chēng):DIRT。它表示數據密集型實(shí)時(shí)(data-intensive real-time)程序。因為 Node.js 自身在 I/O 上非常輕量,它善于將數據從一個(gè)管道混排或代理到另一個(gè)管道上,這能在處理大量請求時(shí)持有很多開(kāi)放的連接,并且只占用一小部分內存。它的設計目標是保證響應能力,跟瀏覽器一樣。
這話(huà)不假,但在今天來(lái)看,DIRT 還是范圍小了。其實(shí) DIRT 本質(zhì)上說(shuō)的 I/O 處理的都算,但隨著(zhù)大前端的發(fā)展,Node.js 已經(jīng)不再只是 I/O 處理相關(guān),而是更加的“Node”!
Node.js 使用場(chǎng)景主要分為4大類(lèi)
1)跨平臺:覆蓋你能想到的面向用戶(hù)的所有平臺,傳統的PC Web端,以及PC客戶(hù)端 nw.js/electron 、移動(dòng)端 cordova、HTML5、react-native、weex,硬件 ruff.io 等
2)Web應用開(kāi)發(fā):網(wǎng)站、Api、RPC服務(wù)等
3)前端:三大框架 React Vue Angular 輔助開(kāi)發(fā),以及工程化演進(jìn)過(guò)程(使用Gulp /Webpack 構建 Web 開(kāi)發(fā)工具)
4)工具:npm上各種工具模塊,包括各種前端預編譯、構建工具 Grunt / Gulp、腳手架,命令行工具,各種奇技淫巧等
下面列出具體的 Node.js 的使用場(chǎng)景,以模塊維度劃分
| 分類(lèi) | 描述 | 相關(guān)模塊 |
|---|---|---|
| 網(wǎng)站 | 類(lèi)似于 cnodejs.org 這樣傳統的網(wǎng)站 | Express / Koa |
| Api | 同時(shí)提供給移動(dòng)端,PC,H5 等前端使用的 HTTP Api 接口 | Restify / HApi |
| Api代理 | 為前端提供的,主要對后端Api接口進(jìn)行再處理,以便更多的適應前端開(kāi)發(fā) | Express / Koa |
| IM即時(shí)聊天 | 實(shí)時(shí)應用,很多是基于 WebSocket協(xié)議的 | Socket.io / sockjs |
| 反向代理 | 提供類(lèi)似于 nginx 反向代理功能,但對前端更友好 | anyproxy / node-http-proxy / hiproxy |
| 前端構建工具 | 輔助前端開(kāi)發(fā),尤其是各種預編譯,構建相關(guān)的工具,能夠極大的提高前端開(kāi)發(fā)效率 | Grunt / Gulp / Bower / Webpack / Fis3 / YKit |
| 命令行工具 | 使用命令行是非??岬姆绞?,前端開(kāi)發(fā)自定義了很多相關(guān)工具,無(wú)論是shell命令,node腳本,還是各種腳手架等,幾乎每個(gè)公司小組都會(huì )自己的命令行工具集 | Cordova / Shell.js |
| 操作系統 | 有實(shí)現,但估計不太會(huì )有人用 | NodeOS |
| 跨平臺打包工具 | 使用 Web 開(kāi)發(fā)技術(shù)開(kāi)發(fā)PC客戶(hù)端是目前最流行的方式,會(huì )有更多前端開(kāi)發(fā)工具是采用這種方式的 | PC端的electron、nw.js,比如釘釘PC客戶(hù)端、微信小程序IDE、微信客戶(hù)端,移動(dòng)的Cordova,即老的Phonegap,還有更加有名的一站式開(kāi)發(fā)框架Ionicframework |
| P2P | 區塊鏈開(kāi)發(fā)、BT客戶(hù)端 | webtorrent / ipfs |
| 編輯器 | Atom 和 VSCode 都是基于 electron 模塊的 | electron |
| 物聯(lián)網(wǎng)與硬件 | ruff.io和很多硬件都支持node sdk | ruff |
Node.js 應用場(chǎng)景非常豐富,比如 Node.js 可以開(kāi)發(fā)操作系統,但一般我都不講的,就算說(shuō)了也沒(méi)多大意義,難道大家真的會(huì )用嗎?一般,我習慣將 Node.js 應用場(chǎng)景氛圍7個(gè)部分。
1)初衷,server端,不想成了前端開(kāi)發(fā)的基礎設施
2)命令行輔助工具,甚至可以是運維
3)移動(dòng)端:cordova,pc端:nw.js和electron
4)組件化,構建,代理
5)架構,前后端分離、api proxy
6)性能優(yōu)化、反爬蟲(chóng)與爬蟲(chóng)
7) 全棧最便捷之路
| 編號 | 場(chǎng)景 | 說(shuō)明 |
|---|---|---|
| 1 | 反向代理 | Node.js可以作為nginx這樣的反向代理,雖然線(xiàn)上我們很少這樣做,但它確確實(shí)實(shí)可以這樣做。比如node-http-proxy和anyproxy等,其實(shí)使用Node.js做這種請求轉發(fā)是非常簡(jiǎn)單的,在后面的http章節里,有單獨的講解。 |
| 2 | 爬蟲(chóng) | 有大量的爬蟲(chóng)模塊,比如node-crawler等,寫(xiě)起來(lái)比python要簡(jiǎn)單一些,尤其搭配jsdom(node版本的jQuery)類(lèi)庫的,對前端來(lái)說(shuō)尤其友好 |
| 3 | 命令行工具 | 所有輔助開(kāi)發(fā),運維,提高效率等等可以用cli做的,使用node來(lái)開(kāi)發(fā)都非常合適,是編寫(xiě)命令行工具最簡(jiǎn)單的方式,java8以后也參考了node的命令行實(shí)現 |
| 4 | 微服務(wù)與RPC | node里有各種rpc支持,比如node編寫(xiě)的dnode,seneca,也有跨語(yǔ)言支持的grpc,足夠應用了 |
| 5 | 微信公眾號開(kāi)發(fā) | 相關(guān)sdk,框架非常多,是快速開(kāi)發(fā)的利器 |
| 6 | 前端流行SSR && PWA | SSR是服務(wù)器端渲染,PWA是漸進(jìn)式Web應用,都是今年最火的技術(shù)。如果大家用過(guò),一定對Node.js不陌生。比如React、Vuejs都是Node.js實(shí)現的ssr。至于pwa的service-worker也是Node.js實(shí)現的。那么為啥不用其他語(yǔ)言實(shí)現呢?不是其他語(yǔ)言不能實(shí)現,而是使用Node.js簡(jiǎn)單、方便、學(xué)習成本低,輕松獲得高性能,如果用其他語(yǔ)言,我至少還得裝環(huán)境 |
可以說(shuō)目前大家能夠看到的、用到的軟件都有 Node.js 身影,當下最流行的軟件寫(xiě)法也大都是基于 Node.js 的,比如 PC 客戶(hù)端 luin/medis 采用 electron 打包,寫(xiě)法采用 React + Redux。我自己一直的實(shí)踐的【Node全?!?,也正是基于這種趨勢而形成的。在未來(lái),Node.js 的應用場(chǎng)景會(huì )更加的廣泛,更多參見(jiàn) sindresorhus/awesome-nodejs。
Node.js是為異步而生的,它自己把復雜的事兒做了(高并發(fā),低延時(shí)),交給用戶(hù)的只是有點(diǎn)難用的Callback寫(xiě)法。也正是坦誠的將異步回調暴露出來(lái),才有更好的流程控制方面的演進(jìn)。也正是這些演進(jìn),讓Node.js從DIRT(數據敏感實(shí)時(shí)應用)擴展到更多的應用場(chǎng)景,今天的Node.js已經(jīng)不只是能寫(xiě)后端的JavaScript,已經(jīng)涵蓋了所有涉及到開(kāi)發(fā)的各個(gè)方面,而Node全棧更是熱門(mén)種的熱門(mén)。
直面問(wèn)題才能有更好的解決方式,Node.js的異步是整個(gè)學(xué)習Node.js過(guò)程中重中之重。
1) 異步流程控制學(xué)習重點(diǎn)
2)Api寫(xiě)法:Error-first Callback 和 EventEmitter
3)中流砥柱:Promise
4)終極解決方案:Async/Await
我整理了一張圖,更直觀(guān)一些。從09年到現在,8年多的時(shí)間里,整個(gè)Node.js社區做了大量嘗試,其中曲折足足夠寫(xiě)一本書(shū)的了。大家先簡(jiǎn)單了解一下。
紅色代表Promise,是使用最多的,無(wú)論async還是generator都可用
藍色是Generator,過(guò)度貨
綠色是Async函數,趨勢
結論:Promise是必須會(huì )的,那你為什么不順勢而為呢?
推薦:使用Async函數 + Promise組合,如下圖所示。
其實(shí),一般使用是不需要掌握上圖中的所有技術(shù)的。對于初學(xué)者來(lái)說(shuō),先夠用,再去深究細節。所以,精簡(jiǎn)一下,只了解3個(gè)就足夠足夠用了。

結論
Node.js SDK里callback寫(xiě)法必須會(huì )的。
Node.js學(xué)習重點(diǎn): Async函數與Promise
中流砥柱:Promise
終極解決方案:Async/Await
所以下面我們會(huì )分個(gè)小部分進(jìn)行講解。
a)Error-first Callback
定義錯誤優(yōu)先的回調寫(xiě)法只需要注意2條規則即可:
回調函數的第一個(gè)參數返回的error對象,如果error發(fā)生了,它會(huì )作為第一個(gè)err參數返回,如果沒(méi)有,一般做法是返回null。
回調函數的第二個(gè)參數返回的是任何成功響應的結果數據。如果結果正常,沒(méi)有error發(fā)生,err會(huì )被設置為null,并在第二個(gè)參數就出返回成功結果數據。
下面讓我們看一下調用函數示例,Node.js 文檔里最常采用下面這樣的回調方式:
function(err, res) {
// process the error and result
}這里的 callback 指的是帶有2個(gè)參數的函數:"err"和 "res"。語(yǔ)義上講,非空的“err”相當于程序異常;而空的“err”相當于可以正常返回結果“res”,無(wú)任何異常。
b)EventEmitter
事件模塊是 Node.js 內置的對觀(guān)察者模式“發(fā)布/訂閱”(publish/subscribe)的實(shí)現,通過(guò)EventEmitter屬性,提供了一個(gè)構造函數。該構造函數的實(shí)例具有 on 方法,可以用來(lái)監聽(tīng)指定事件,并觸發(fā)回調函數。任意對象都可以發(fā)布指定事件,被 EventEmitter 實(shí)例的 on 方法監聽(tīng)到。
在node 6之后,可以直接使用require(events)類(lèi)
var EventEmitter = require(events)
var util = require(util)
var MyEmitter = function () {
}
util.inherits(MyEmitter, EventEmitter)
const myEmitter = new MyEmitter();
myEmitter.on(event, (a, b) => {
console.log(a, b, this);
// Prints: a b {}
});
myEmitter.emit(event, a, b);和jquery、vue里的Event是非常類(lèi)似的。而且前端自己也有EventEmitter。
c)如何更好的查Node.js文檔
API是應用程序接口A(yíng)pplication Programming Interface的簡(jiǎn)稱(chēng)。從Node.js異步原理,我們可以知道,核心在于 Node.js SDK 中API調用,然后交由EventLoop(Libuv)去執行,所以我們一定要熟悉Node.js的API操作。
Node.js的API都是異步的,同步的函數是奢求,要查API文檔,在高并發(fā)場(chǎng)景下慎用。
筆者推薦使用 Dash 或 Zeal 查看離線(xiàn)文檔,經(jīng)常查看離線(xiàn)文檔,對Api理解會(huì )深入很多,比IDE輔助要好,可以有效避免離開(kāi)IDE就不會(huì )寫(xiě)代碼的窘境。

回調地獄
Node.js 因為采用了錯誤優(yōu)先的回調風(fēng)格寫(xiě)法,導致sdk里導出都是回調函數。如果組合調用的話(huà),就會(huì )特別痛苦,經(jīng)常會(huì )出現回調里嵌套回調的問(wèn)題,大家都非常厭煩這種寫(xiě)法,稱(chēng)之為Callback Hell,即回調地獄。一個(gè)經(jīng)典的例子來(lái)自著(zhù)名的Promise模塊q文檔里。
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});這里只是做4步,嵌套了4層回調,如果更多步驟呢?很多新手淺嘗輒止,到這兒就望而卻步,粉轉黑。這明顯不夠成熟,最起碼你要看看它的應對解決方案吧!
Node.js 約定所有Api都采用錯誤優(yōu)先的回調方式,這部分場(chǎng)景都是大家直接調用接口,無(wú)太多變化。而Promise是對回調地獄的思考,或者說(shuō)是改良方案。目前使用非常普遍,可以說(shuō)是在async函數普及之前唯一一個(gè)通用性規范,甚至 Node.js 社區都在考慮 Promise 化,可見(jiàn)其影響之大。
Promise最早也是在commonjs社區提出來(lái)的,當時(shí)提出了很多規范。比較接受的是promise/A規范。后來(lái)人們在這個(gè)基礎上,提出了promise/A+規范,也就是實(shí)際上現在的業(yè)內推行的規范。ES6 也是采用的這種規范。
Promise意味著(zhù)[許愿|承諾]一個(gè)還沒(méi)有完成的操作,但在未來(lái)會(huì )完成的。與Promise最主要的交互方法是通過(guò)將函數傳入它的then方法從而獲取得Promise最終的值或Promise最終最拒絕(reject)的原因。要點(diǎn)有三個(gè):
遞歸,每個(gè)異步操作返回的都是promise對象
狀態(tài)機:三種狀態(tài)轉換,只在promise對象內部可以控制,外部不能改變狀態(tài)
全局異常處理
1)定義
var promise = new Promise(function(resolve, reject) {
// do a thing, possibly async, then…
if (/* everything turned out fine */) {
resolve("Stuff worked!");
}
else {
reject(Error("It broke"));
}
});每個(gè)Promise定義都是一樣的,在構造函數里傳入一個(gè)匿名函數,參數是resolve和reject,分別代表成功和失敗時(shí)候的處理。
2)調用
promise.then(function(text){
console.log(text)// Stuff worked!
return Promise.reject(new Error(我是故意的))
}).catch(function(err){
console.log(err)
})它的主要交互方式是通過(guò)then函數,如果Promise成功執行resolve了,那么它就會(huì )將resolve的值傳給最近的then函數,作為它的then函數的參數。如果出錯reject,那就交給catch來(lái)捕獲異常就好了。
Promise 的最大優(yōu)勢是標準化,各類(lèi)異步工具庫都按照統一規范實(shí)現,即使是async函數也可以無(wú)縫集成。所以用 Promise 封裝 API 通用性強,用起來(lái)簡(jiǎn)單,學(xué)習成本低。在async函數普及之前,絕大部分應用都是采用Promise來(lái)做異步流程控制的,所以掌握Promise是Node.js學(xué)習過(guò)程中必須要掌握的重中之重。
Bluebird是 Node.js 世界里性能最好的Promise/a+規范的實(shí)現模塊,Api非常齊全,功能強大,是原生Promise外的不二選擇。
好處如下:
避免Node.js內置Promise實(shí)現 問(wèn)題,使用與所有版本兼容
避免Node.js 4曾經(jīng)出現的內存泄露問(wèn)題
內置更多擴展,timeout、 promisifyAll等,對Promise/A+規范提供了強有力的補充
限于時(shí)間關(guān)系,這里就不一一列舉了,還是那句話(huà),在學(xué)習Node.js過(guò)程中,對于Promise了解多深入都不過(guò)分。
推薦學(xué)習資料
Node.js最新技術(shù)棧之Promise篇 https://cnodejs.org/topic/560...
理解 Promise 的工作原理 https://cnodejs.org/topic/569...
Promise 迷你書(shū) http://liubin.github.io/promi...
Async/Await是異步操作的終極解決方案,Koa 2在node 7.6發(fā)布之后,立馬發(fā)布了正式版本,并且推薦使用async函數來(lái)編寫(xiě)Koa中間件。
這里給出一段Koa 2應用里的一段代碼
exports.list = async (ctx, next) => {
try {
let students = await Student.getAllAsync();
await ctx.render(students/index, {
students : students
})
} catch (err) {
return ctx.api_error(err);
}
};它做了3件事兒
通過(guò)await Student.getAllAsync();來(lái)獲取所有的students信息。
通過(guò)await ctx.render渲染頁(yè)面
由于是同步代碼,使用try/catch做的異常處理
是不是非常簡(jiǎn)單,現在Eggjs里也都是這樣同步的代碼。
4.1 正常寫(xiě)法
const pkgConf = require(pkg-conf);
async function main(){
const config = await pkgConf(unicorn);
console.log(config.rainbow);
//=> true
}
main();變態(tài)寫(xiě)法
const pkgConf = require(pkg-conf);
(async () => {
const config = await pkgConf(unicorn);
console.log(config.rainbow);
//=> true
})();4.2 await + Promise
const Promise = require(bluebird);
const fs = Promise.promisifyAll(require("fs"));
async function main(){
const contents = await fs.readFileAsync("myfile.js", "utf8")
console.log(contents);
}
main();4.3 await + co + generator
const co = require(co);
const Promise = require(bluebird);
const fs = Promise.promisifyAll(require("fs"));
async function main(){
const contents = co(function* () {
var result = yield fs.readFileAsync("myfile.js", "utf8")
return result;
})
console.log(contents);
}
main();要點(diǎn)
co的返回值是promise,所以await可以直接接co。
co的參數是genrator
在generator里可以使用yield,而yield后面接的有5種可能,故而把這些可以yield接的方式成為yieldable,即可以yield接的。
Promises
Thunks (functions)
array (parallel execution)
objects (parallel execution)
Generators 和 GeneratorFunctions
由上面3中基本用法可以推出Async函數要點(diǎn)如下:
Async函數語(yǔ)義上非常好
Async不需要執行器,它本身具備執行能力,不像Generator需要co模塊
Async函數的異常處理采用try/catch和Promise的錯誤處理,非常強大
Await接Promise,Promise自身就足夠應對所有流程了,包括async函數沒(méi)有純并行處理機制,也可以采用Promise里的all和race來(lái)補齊
Await釋放Promise的組合能力,外加co和Promise的then,幾乎沒(méi)有不支持的場(chǎng)景
綜上所述
Async函數是趨勢,如果Chrome 52. v8 5.1已經(jīng)支持Async函數(https://github.com/nodejs/CTC...,Node.js支持還會(huì )遠么?
Async和Generator函數里都支持promise,所以promise是必須會(huì )的。
Generator和yield異常強大,不過(guò)不會(huì )成為主流,所以學(xué)會(huì )基本用法和promise就好了,沒(méi)必要所有的都必須會(huì )。
co作為Generator執行器是不錯的,它更好的是當做Promise 包裝器,通過(guò)Generator支持yieldable,最后返回Promise,是不是有點(diǎn)無(wú)恥?
小結
這部分共講了4個(gè)小點(diǎn),都是極其直接的必須掌握的知識點(diǎn)。
1) 異步流程控制學(xué)習重點(diǎn)
2)Api寫(xiě)法:Error-first Callback 和 EventEmitter
3)中流砥柱:Promise
4)終極解決方案:Async/Await
這里再提一下關(guān)于Node.js源碼閱讀問(wèn)題,很多人api都還沒(méi)完熟練就去閱讀源碼,這是非常不贊成的,不帶著(zhù)問(wèn)題去讀源碼是比較容易迷失在大量代碼中的。效果并不好。
先用明白,然后再去閱讀Node.js源碼,然后探尋libuv并發(fā)機制。很多人買(mǎi)了樸大的《深入淺出Node.js》一書(shū),看了之后還是不太會(huì )用,不是書(shū)寫(xiě)的不好,而是步驟不對。
Node in action和了不起的Node.js是入門(mén)的絕好書(shū)籍,非常簡(jiǎn)單,各個(gè)部分都講了,但不深入,看了之后,基本就能用起來(lái)了
當你用了一段之后,你會(huì )對Node.js的運行機制好奇,為啥呢?這時(shí)候去讀樸大的《深入淺出Node.js》一書(shū)就能夠解惑。原因很簡(jiǎn)單,九淺一深一書(shū)是偏向底層實(shí)現原理的書(shū),從操作系統,并發(fā)原理,node源碼層層解讀。如果是新手讀,難免會(huì )比較郁悶。
實(shí)踐類(lèi)的可以看看雷宗民(老雷)和趙坤(nswbmw)寫(xiě)的書(shū)
我一般給大家的推薦是把Node in action讀上5遍10遍,入門(mén)干活足夠了。剩下的就是反復實(shí)踐,多寫(xiě)代碼和npm模塊就好。
目前所有的書(shū)籍幾乎都有點(diǎn)過(guò)時(shí)了,大部分都是Node.js v0.10左右的版本的,我得新書(shū)是基于Node.js 8版本的,預計2018年3月或4月出版。別催我,真沒(méi)法更快了。
目錄
01 Node.js初識
02 安裝與入門(mén)
03 更了不起的Node.js
04 更好的Node.js
05 Node.js是如何執行的
06 模塊與核心
07 異步寫(xiě)法與流程控制
08 下一代Web框架Koa入門(mén)
09 Koa的核心擴展機制:中間件
10 HTTP協(xié)議必知必會(huì )
11 Koa練習
12 數據庫入門(mén)
13 數據庫進(jìn)階
14 視圖模板
15 Koa項目實(shí)戰
16 自己動(dòng)手寫(xiě)NPM模塊
17 Node.js企業(yè)級Web開(kāi)發(fā)
18 構建具有Node.js特色的微服務(wù)
19 讓Node.js跑的更穩
20 讓Node.js跑的更快
博文視點(diǎn)的美女編輯在苦逼的整理中,預計出版在3月之后(不要催我,我也沒(méi)法說(shuō)),20章,800頁(yè)+,定價(jià)預計在130+。
一般,后端開(kāi)發(fā)指的是 Web 應用開(kāi)發(fā)中和視圖渲染無(wú)關(guān)的部分,主要是和數據庫交互為主的重業(yè)務(wù)型邏輯處理。但現在架構升級后,Node.js 承擔了前后端分離重任之后,有了更多玩法。從帶視圖的傳統Web應用和面向Api接口應用,到通過(guò) RPC 調用封裝對數據庫的操作,到提供前端 Api 代理和網(wǎng)關(guān),服務(wù)組裝等,統稱(chēng)為后端開(kāi)發(fā),不再是以往只有和數據庫打交道的部分才算后端。這樣,就可以讓前端工程師對開(kāi)發(fā)過(guò)程可控,更好的進(jìn)行調優(yōu)和性能優(yōu)化。
對 Node.js 來(lái)說(shuō),一直沒(méi)有在后端取得其合理的占有率,原因是多方面的,暫列幾條。
1)利益分配,已有實(shí)現大多是Java或者其他語(yǔ)言,基本是沒(méi)法撼動(dòng)的,重寫(xiě)的成本是巨大的,另外,如果用Node寫(xiě)了,那么那些寫(xiě)Java的人怎么辦?搶人飯碗,這是要拼命的。
2)Node相對年輕,大家對Node的理解不夠,回調和異步流程控制略麻煩,很多架構師都不愿意花時(shí)間去學(xué)習。盡管在Web應用部分處理起來(lái)非常簡(jiǎn)單高效,但在遇到問(wèn)題時(shí)并不容易排查定位,對開(kāi)發(fā)者水平要求略高。
3)開(kāi)發(fā)者技能單一,很多是從前端轉過(guò)來(lái)的,對數據庫,架構方面知識欠缺,對系統設計也知之不多,這是很危險的,有種麻桿打狼兩頭害怕的感覺(jué)。
4)Node在科普、培訓、布道等方面做的并不好,國外使用的非常多,國內卻很少人知道,不如某些語(yǔ)言做得好。
盡管如此,Node.js 還是盡人皆知,卷入各種是非風(fēng)口,也算是在大前端浪潮中大紅大紫。原因它的定位非常明確,補足以 JavaScript 為核心的全棧體系中服務(wù)器部分。開(kāi)發(fā)也是人,能夠同時(shí)掌握并精通多門(mén)語(yǔ)言的人畢竟不多,而且程序員的美德是“懶”,能使用 JavaScript 一門(mén)語(yǔ)言完成所有事兒,為什么要學(xué)更多呢?
對于 Web 應用大致分2種,帶視圖的傳統Web應用和面向Api接口應用,我們先看一下 Node.js Web 應用開(kāi)發(fā)框架的演進(jìn)時(shí)間線(xiàn)大致如下:
2010年 TJ Holowaychuk 寫(xiě)的 Express
2011年 Derby.js 開(kāi)始開(kāi)發(fā),8月5日,WalmartLabs 的一位成員 Eran Hammer 提交了 Hapi 的第一次git記錄。Hapi 原本是 Postmile 的一部分,并且最開(kāi)始是基于 Express 構建的。后來(lái)它發(fā)展成自己自己的框架,
2012年1月21日,專(zhuān)注于 Rest api 的 Restify 發(fā)布1.0版本,同構的 Meteor 開(kāi)始投入開(kāi)發(fā),最像Rails 的 Sails 也開(kāi)始了開(kāi)發(fā)
2013年 TJ Holowaychuk 開(kāi)始玩 es6 generator,編寫(xiě) co 這個(gè) Generator 執行器,并開(kāi)始了Koa 項目。2013 年下半年李成銀開(kāi)始 ThinkJS,參考 ThinkPHP
2014年4月9日,Express 發(fā)布4.0,進(jìn)入4.x時(shí)代持續到今天,MEAN.js 開(kāi)始隨著(zhù) MEAN 架構的提出開(kāi)始開(kāi)發(fā),意圖大一統,另外 Total.js 開(kāi)始起步,最像PHP里 Laravel 或 Python 里的 Django 或 ASP.NET MVC的框架,代表著(zhù) Node.js 的成熟,開(kāi)始從其他語(yǔ)言里的成熟框架借鑒
2015年8月22日,下一代 Web 框架 Koa 發(fā)布1.0,可以在Node.js v0.12下面,通過(guò)co 和 generator實(shí)現同步邏輯,那時(shí)候 co 還是基于 thunkfy 的,在2015年10月30日,ThinkJS發(fā)布了首個(gè)基于 Es2015+ 特性開(kāi)發(fā)的 v2.0 版本
2016 年 09 月,螞蟻金服的 Eggjs,在 JSConf China 2016 上亮相并宣布開(kāi)源
2017年2月,下一代Web框架 Koa 發(fā)布v2.0正式版
我們可以根據框架的特性進(jìn)行分類(lèi)
| 框架名稱(chēng) | 特性 | 點(diǎn)評 |
|---|---|---|
| Express | 簡(jiǎn)單、實(shí)用,路由中間件等五臟俱全 | 最著(zhù)名的Web框架 |
| Derby.js && Meteor | 同構 | 前后端都放到一起,模糊了開(kāi)發(fā)便捷,看上去更簡(jiǎn)單,實(shí)際上上對開(kāi)發(fā)來(lái)說(shuō)要求更高 |
| Sails、Total | 面向其他語(yǔ)言,Ruby、PHP等 | 借鑒業(yè)界優(yōu)秀實(shí)現,也是 Node.js 成熟的一個(gè)標志 |
| MEAN.js | 面向架構 | 類(lèi)似于腳手架,又期望同構,結果只是蹭了熱點(diǎn) |
| Hapi和Restfy | 面向Api && 微服務(wù) | 移動(dòng)互聯(lián)網(wǎng)時(shí)代Api的作用被放大,故而獨立分類(lèi)。尤其是對于微服務(wù)開(kāi)發(fā)更是利器 |
| ThinkJS | 面向新特性 | 借鑒ThinkPHP,并慢慢走出自己的一條路,對于A(yíng)sync函數等新特性支持,無(wú)出其右,新版v3.0是基于Koa v2.0的作為內核的 |
| Koa | 專(zhuān)注于異步流程改進(jìn) | 下一代Web框架 |
| Egg | 基于Koa,在開(kāi)發(fā)上有極大便利 | 企業(yè)級Web開(kāi)發(fā)框架 |
對于框架選型
業(yè)務(wù)場(chǎng)景、特點(diǎn),不必為了什么而什么,避免本末倒置
自身團隊能力、喜好,有時(shí)候技術(shù)選型決定團隊氛圍的,需要平衡激進(jìn)與穩定
出現問(wèn)題的時(shí)候,有人能夠做到源碼級定制。Node.js 已經(jīng)有8年歷史,但模塊完善程度良莠不齊,如果不慎踩到一個(gè)坑里,需要團隊在無(wú)外力的情況能夠搞定,否則會(huì )影響進(jìn)度
Tips:個(gè)人學(xué)習求新,企業(yè)架構求穩,無(wú)非喜好與場(chǎng)景而已
Node.js 本來(lái)就為了做后端而設計的,這里我們再看看利益問(wèn)題。Node.js 向后端延伸,必然會(huì )觸動(dòng)后端開(kāi)發(fā)的利益。那么 Proxy 層的事兒,前后端矛盾的交界處,后端不想變,前端又求變,那么長(cháng)此以往,Api接口會(huì )變得越來(lái)越惡心。后端是愿意把Api的事兒叫前端的,對后端來(lái)說(shuō),只要你不動(dòng)我的數據庫和服務(wù)就可以。
但是 Node.js 能不能做這部分呢?答案是能的,這個(gè)是和 Java、PHP 類(lèi)似的,一般是和數據庫連接到一起,處理帶有業(yè)務(wù)邏輯的。目前國內大部分都是以 Java、PHP 等為主,所以要想吃到這部分并不容易。
小公司,創(chuàng )業(yè)公司,新孵化的項目更傾向于 Node.js ,簡(jiǎn)單,快速,高效
微服務(wù)架構下的某些服務(wù),使用 Node.js 開(kāi)發(fā),是比較合理的
國內這部分一直沒(méi)有做的很好,所以 Node.js 在大公司還沒(méi)有很好的被應用,安全問(wèn)題、生態(tài)問(wèn)題、歷史遺留問(wèn)題等,還有很多人對 Node.js 的誤解。
單線(xiàn)程很脆弱,這是事實(shí),但單線(xiàn)程不等于不能多核并發(fā),而且你還有集群呢
運維,其實(shí)很簡(jiǎn)單,比其他語(yǔ)言之簡(jiǎn)單,日志采集、監控也非常簡(jiǎn)單
模塊穩定性,對于 MongoDB、MySQL、Redis 等還是相當不錯,但其他的數據庫支持可能沒(méi)那么好。
安全問(wèn)題是個(gè)偽命題,所有框架面臨的都是一樣的。
這些對于提供Api服務(wù)來(lái)說(shuō)已經(jīng)足夠了,本書(shū)后面有大量篇幅講如何使用 Koa 框架來(lái)構建Api服務(wù)。
Web編程核心
異步流程控制(前面講過(guò)了)
基本框架 Koa或Express,新手推薦Express,畢竟資料多,上手更容易。如果有一定經(jīng)驗,推薦Koa,其實(shí)這些都是為了了解Web編程原理,尤其是中間件機制理解。
數據庫 mongodb或mysql都行,mongoose和Sequelize、bookshelf,TypeOrm等都非常不錯。對于事物,不是Node.js的鍋,是你選的數據庫的問(wèn)題。另外一些偏門(mén),想node連sqlserver等估計還不成熟,我是不會(huì )這樣用的。
模板引擎, ejs,jade,nunjucks。理解原理最好。尤其是extend,include等高級用法,理解布局,復用的好處。其實(shí)前后端思路都是一樣的。
Node.js 編寫(xiě)的包管理器 npm 已成為開(kāi)源包管理了領(lǐng)域最好的生態(tài),直接到2017年10月份,有模塊超過(guò)47萬(wàn),每周下載量超過(guò)32億次,每個(gè)月有超過(guò)700萬(wàn)開(kāi)發(fā)者使用npm?,F在早已經(jīng)超過(guò)60萬(wàn)個(gè)模塊了。
這里就不一一舉例了,給出一個(gè)迷茫時(shí)學(xué)習Node.js最好的方法吧!
某天,我在3w咖啡整理書(shū)稿,然后小弟梁過(guò)來(lái)了,聊聊他的現狀,一副很不好的樣子,在天津我曾帶過(guò)他大半年,總不能不管,我給他的建議是:“每天看10個(gè)npm模塊”
對于學(xué)習Node.js迷茫的人來(lái)說(shuō),這是最好的方式,當你不知道如何做的時(shí)候,就要向前(錢(qián))看,你要知道積累哪些技能對以后有好處。對于學(xué)習Node.js必經(jīng)之路,一定是要掌握很多模塊用法,并從中汲取技巧、思路、設計思想的。與其不知道學(xué)什么,為什么不每天積累幾個(gè)技巧呢?
推薦一個(gè)repo即 https://github.com/parro-it/a... 小型庫集合,一天看十個(gè)不是夢(mèng)!
更多討論 https://zhuanlan.zhihu.com/p/...
有朋友提問(wèn)
狼叔,關(guān)注你和cnode很久了,最近有點(diǎn)迷茫,想請你指點(diǎn)下。
我的情況是這樣的,非科班出身,從事前端工作4年,公司使用的技術(shù)棧是vue2、vue-router、vuex、webpack,目前的能力處理工作還是比較輕松,但是也很明確自己有很多不足,只是對于如何提升比較迷茫。
不足:
1、非科班出身,計算機基礎薄弱
2、對當前使用的技術(shù)了解不夠深入,很多東西只停留在會(huì )用的層面
3、對服務(wù)端了解較少,想學(xué)node,卻不知道如何系統的學(xué)習解答困惑:
1、計算機基礎薄弱該如何完善自己的知識體系?
答:追逐長(cháng)尾,所見(jiàn)所聞不懂的都去學(xué)就好啦。我是這樣過(guò)來(lái)的,頭幾年每天14個(gè)小時(shí)+,很累,不過(guò)效果還可以。os,算法,數據結構,設計模式,編譯原理,基本也就這些重點(diǎn)。做到每天都有進(jìn)步就好,別貪多求快。數學(xué)和英文當然也是越狠越好的!
2、如何在技術(shù)上做更深入的探索?
答:技術(shù)人只關(guān)注技術(shù),想法創(chuàng )意通常比較少。最簡(jiǎn)單的辦法就是抓自己的癢,比我大學(xué)時(shí)和朋友們翻譯過(guò)grails文檔,所以對翻譯有情節。為了翻譯,我用node寫(xiě)了無(wú)數工具嘗試,反復對比各種翻譯工具,理解它們背后的設計。包括markdown里嵌html標簽標識中英文,然后gulp編譯成獨立文檔。甚至一度想上線(xiàn)賣(mài)服務(wù)。這種折騰真的很爽,甚至耽誤了不少翻譯。有時(shí)要警惕長(cháng)尾,不要忘了自己的初衷
3、如何系統的學(xué)習node?
答:階段
1/要會(huì )用,能完成工作任務(wù)
2/寫(xiě)點(diǎn)提高效率的工具
3/參與開(kāi)源項目,甚至是node源碼
應對方法
1/《node in action》看五遍,然后就去寫(xiě)吧,別管代碼質(zhì)量如何,能寫(xiě)敢寫(xiě)
2/多用些模塊,理解它們,如果有機會(huì )就自己寫(xiě)一下,萬(wàn)一有很多人用你,我小弟寫(xiě)過(guò)一個(gè)地區選擇加載的json數據,star數不少呢
3/給別人貢獻代碼,要去學(xué)別人的習慣,網(wǎng)上有g(shù)it標準工作流和提pr方法,你要做的是精研該模塊代碼,關(guān)注issue,其他就是等機會(huì )。另外樸靈的深入淺出多讀幾遍,試著(zhù)讀node源碼,你的理解會(huì )更好。推薦看看我寫(xiě)的《通過(guò)開(kāi)源項目去學(xué)習》https://github.com/i5ting/Stu...
4/跳出node范圍,重新審視node的應用場(chǎng)景,對未來(lái)你的技術(shù)選項和決策大有裨益
2.1 Node 用途那么多,我該從哪里學(xué)起?
答:如果有機會(huì )就直接上Web應用,如果沒(méi)有機會(huì )就從前端構建,工具等方面開(kāi)始做,慢慢引入更潮更酷的前端技術(shù),自然就把Node引入進(jìn)來(lái)了。不要急。
2.2 Node Web 框架那么多,我該怎么選?
答:初學(xué)者推薦Express,如果有一定經(jīng)驗,推薦Koa。當然真正項目里還是推薦Eggjs和Thinkjs這樣的框架。
2.3 關(guān)于 Node 的書(shū)幾乎都過(guò)時(shí)了,我該買(mǎi)哪本?
答:
1)Node in action和了不起的Node.js是入門(mén)的絕好書(shū)籍,非常簡(jiǎn)單,各個(gè)部分都講了,但不深入,看了之后,基本就能用起來(lái)了
2)當你用了一段之后,你會(huì )對Node.js的運行機制好奇,為啥呢?這時(shí)候去讀樸大的《深入淺出Node.js》一書(shū)就能夠解惑。原因很簡(jiǎn)單,九淺一深一書(shū)是偏向底層實(shí)現原理的書(shū),從操作系統,并發(fā)原理,node源碼層層解讀。如果是新手讀,難免會(huì )比較郁悶。
3)實(shí)踐類(lèi)的可以看看雷宗民(老雷)和趙坤(nswbmw)寫(xiě)的書(shū)
如果你不著(zhù)急,也可以等我的那本《更了不起的Node.js》,時(shí)間待定。
有朋友問(wèn)現在A(yíng)ndroid開(kāi)發(fā)和web前端開(kāi)發(fā)哪個(gè)前景更好?我的回答是明顯是前端更好,看一下移動(dòng)端發(fā)展過(guò)程
native < hybrid < rn/weex < h5
目前rn和weex的開(kāi)發(fā)逐漸變得主流,組件化寫(xiě)法已經(jīng)由前端主導了。以前ios和android程序員占比很高,但現在就留1到2個(gè)寫(xiě)插件,真是差別很大。
Web開(kāi)發(fā)對移動(dòng)端的沖擊非常大。當然現在Web技術(shù)也開(kāi)發(fā)PC client了,比如vscode是通過(guò)electron打包的,效果還是相當不錯的。
前端可以說(shuō)是最近幾年開(kāi)發(fā)里最火的部分,原因很多,最主要是開(kāi)發(fā)方式的變更,以今時(shí)今日的眼光來(lái)看,稱(chēng)之為現代Web開(kāi)發(fā)是不為過(guò)的。
先給出現代Web開(kāi)發(fā)的概覽圖

每次演講我會(huì )都問(wèn)大家是不是前端,回答“是”的人非常多,我會(huì )開(kāi)玩笑的恭喜大家:“現在的前端就是錢(qián)端”,確實(shí),現在前端發(fā)展異常的快,而且沒(méi)有趨向于類(lèi)比java里ssh框架的那種穩定,所以未來(lái)很長(cháng)一段時(shí)間,還會(huì )增長(cháng),持續混亂,這對前端來(lái)說(shuō)是把雙刃劍,一方面有很強的壓迫感,不學(xué)習就跟不上時(shí)代,另一方它也是機遇,能夠帶給更多機會(huì ),包括money。
大家都疑惑的一個(gè)問(wèn)題是如何在這樣巨變的時(shí)代能夠通過(guò)學(xué)習來(lái)應變,我可以很負責的告訴大家,沒(méi)有捷徑,但通過(guò)掌握 Node.js 能夠讓你降低這個(gè)學(xué)習曲線(xiàn)而已,畢竟Node.js是大前端的基礎設施。大家可以看一下,前端的開(kāi)發(fā)過(guò)程,模塊化,構建,輔助工具,調優(yōu),架構調整,可以說(shuō)Node.js是無(wú)處不在的。
其實(shí),輔助大前端開(kāi)發(fā)只是Node.js的一個(gè)非常無(wú)心插柳的衍生功能,通過(guò)掌握Node.js能夠讓你能做的更多、獲得的更多,甚至可以說(shuō)有更多自我實(shí)現的快樂(lè ),這也是我那本書(shū)書(shū)名字里“更了不起的”要去闡述的內容。
綜上種種,就是我一直提倡以 JavaScript 語(yǔ)言為中心的 Node全棧 概念的緣由,JavaScript 覆蓋所有前端,Node.js 擅長(cháng)做 I/O 密集型的后端,外加輔助開(kāi)發(fā)的各種基礎設施,無(wú)疑是工作、學(xué)習和成為快速掌握全棧技術(shù)最好的途徑。你會(huì )的越多,你能做的就更多,你的人生也將會(huì )有不一樣的精彩篇章。
全棧核心
后端不會(huì )的 UI(界面相關(guān))
前端不會(huì )的 DB(業(yè)務(wù)相關(guān))
只要打通這2個(gè)要點(diǎn),其他就比較容易了。最怕的是哪樣都接觸點(diǎn),然后就號稱(chēng)自己是全棧,建議大家不要這樣做,這就好比在簡(jiǎn)歷里寫(xiě)精通一樣,基本上都會(huì )被問(wèn)到尷尬。全棧是一種信仰,不是拿來(lái)吹牛逼的,而可以解決更多問(wèn)題,讓自己的知識體系不留空白,享受自我實(shí)現的極致快樂(lè )。
想問(wèn)一下狼叔最近的業(yè)務(wù)一直都是簡(jiǎn)單的用express搭一個(gè)后端服務(wù),沒(méi)有其他更加深入node的業(yè)務(wù)了,這種時(shí)候應該如何自己給自己創(chuàng )應用場(chǎng)景呢
沒(méi)有目標就向錢(qián)看,有目標就向前看
從 java 開(kāi)始,蹭課,背著(zhù)機箱到深圳,3個(gè)月胖20斤
堅持翻譯英文文檔,看 《Thinking in Java》
畢業(yè)后開(kāi)始 bi,整理 bi 文檔
學(xué)長(cháng)明林清,傳授 jQuery,愿意學(xué),別人就更愿意分析
接手《內蒙廣電數據分析與科學(xué)決策系統》,打通前、后端
廣東聯(lián)通,自己造輪子,寫(xiě) jQuery 插件,DRY
做云計算,學(xué)習 AIX,寫(xiě)有《凌云志》
分手、離職,去做 iOS,從 cordova 開(kāi)始搞 H5,研究各種移動(dòng)端框架,自己寫(xiě)框架,轉原生
面試也是學(xué)習的利器,輕松進(jìn)新浪
總結了大量 iOS 經(jīng)驗,想寫(xiě)書(shū),結果寫(xiě)了一堆寫(xiě)書(shū)的工具
既然無(wú)法逃避,就熱愛(ài)它,最后變成興趣
去網(wǎng)秦做技術(shù)總監,做首席,管架構,帶人,寫(xiě)開(kāi)源項目
創(chuàng )業(yè),當 CTO,結婚,做公眾號運營(yíng),寫(xiě)書(shū),最苦的時(shí)候沒(méi)錢(qián)吃飯,又不能找媳婦要,只能在 StuQ 上講點(diǎn)課
加入去哪兒網(wǎng),任職前端架構師
加入阿里巴巴,前端技術(shù)專(zhuān)家
人生不只有代碼,但它能讓我快樂(lè ),終生受益
也曾懵懂,也曾迷茫,但我這人比較傻,一直信奉:“一次只做1件事兒,盡力做到極致”,短時(shí)間看這是比較傻的,但一旦你堅持下去,你就會(huì )發(fā)現技術(shù)其實(shí)是門(mén)手藝,厚積薄發(fā)。
我沒(méi)辦法說(shuō)自己最擅長(cháng)什么,但在什么場(chǎng)景下用什么技術(shù)是我擅長(cháng)的?;蛘哒f(shuō),應變是我最大的本事。很多框架,新技術(shù)我都沒(méi)見(jiàn)過(guò),用過(guò),但花一點(diǎn)點(diǎn)過(guò)一下,就能拿已有的知識快速的理解它,這其實(shí)是長(cháng)期學(xué)習的好處。
現在越來(lái)越忙,寫(xiě)代碼的時(shí)間越來(lái)越少,技術(shù)又越發(fā)展越快,我能做好的就是每日精進(jìn),仗著(zhù)這點(diǎn)已有的知識儲備跟年輕人比賽。我不覺(jué)得累,相反我很享受這種感覺(jué),沒(méi)有被時(shí)代淘汰,是一件多么幸福的事兒。
做后端的人
對數據庫是比較熟悉,無(wú)論 mongodb,還是 mysql、postgres
對前端理解比較弱,會(huì )基本的 html,css,模板引擎等比較熟悉
4階段循序漸進(jìn),build 與工具齊飛
前端開(kāi)發(fā)4階段,我的感覺(jué)是按照順序,循序漸進(jìn)就好。
從前端往后端轉,api 接口非常容易學(xué)會(huì ),像 express、koa 這類(lèi)框架大部分人一周就能學(xué)會(huì ),最難的是對 db、er 模型的理解,說(shuō)直白點(diǎn),還是業(yè)務(wù)需求落地的理解
我們來(lái)想想一般的前端有什么技能?
html
css(兼容瀏覽器)
js 會(huì )點(diǎn)(可能更多的是會(huì )點(diǎn) jquery)
ps 切圖
firebug 和 chrome debuger 會(huì )的人都不太多
用過(guò)幾個(gè)框架,大部分人是僅僅會(huì )用
英語(yǔ)一般
svn/git 會(huì )一點(diǎn)
那么他們如果想在前端領(lǐng)域做的更深有哪些難點(diǎn)呢?
基礎:oo,dp,命令,shell,構建等
編程思想上的理解(mvc、ioc,規約等)
區分概念
外圍驗收,如 H5 和 hybird 等
追趕趨勢,如何學(xué)習新東西
以上皆是痛點(diǎn),所以比較好的辦法應該是這樣的。
玩轉 npm、gulp 這樣的前端工具類(lèi)(此時(shí)還是前端)
使用 node 做前后端分離(此時(shí)還是前端)
express、koa 這類(lèi)框架
jade、ejs 等模板引擎
nginx
玩轉【后端】異步流程處理(promise/es6的(generator|yield)/es7(async|await))
玩轉【后端】mongodb、mysql 對應的 Node 模塊
從我們的經(jīng)驗看,這樣是比較靠譜的。先做最簡(jiǎn)單前后端分離,里面沒(méi)有任何和db相關(guān),前端可以非常容易的學(xué)會(huì ),基本2周就已經(jīng)非常熟練了。一般半年后,讓他們接觸【異步流程處理】和【數據庫】相關(guān)內容,學(xué)習后端代碼,就可以全棧了。
看一下移動(dòng)端發(fā)展過(guò)程
native < hybrid < rn/weex < h5
目前rn和weex的開(kāi)發(fā)逐漸變得主流,組件化寫(xiě)法已經(jīng)由前端主導了。以前ios和android程序員占比很高,但現在就留1到2個(gè)寫(xiě)插件,真是差別很大。狼叔一直固執的以為未來(lái)是h5的。
現在的 Native 開(kāi)發(fā)是姥姥不疼舅舅不愛(ài),非常尷尬,很明顯連培訓出的人就業(yè)不要工資混經(jīng)驗就很明顯了。另外領(lǐng)導們也都在惦記,能不能用 H5 寫(xiě)?這還算是保守的,如果直接激進(jìn)的就直接上 RN 了,那么 Native開(kāi)發(fā)的程序員就變了
一個(gè)寫(xiě)插件的程序員...招誰(shuí)惹誰(shuí)了。。。。
要么忍,要么轉,沒(méi)辦法,認命吧,溫水里舒服了幾年,也該學(xué)點(diǎn)東西了
hybrid 或組件化開(kāi)發(fā),你總要會(huì )一樣
無(wú)論哪種,你都離前端很近,因為 H5 或組件化都是從前端走出來(lái)的
組件化在前端領(lǐng)域先行,無(wú)論借鑒還是學(xué)習都不可避免
如果沒(méi)時(shí)間就直接上組件化,如果有時(shí)間就好好學(xué)學(xué)前端完整體系,最終也還是要學(xué)組件化
原生開(kāi)發(fā)就是 iOS 用 OC/Swift,Android 用 java 或 scala 等,就算偶爾嵌入 webview,能玩js的機會(huì )也非常好少
所以移動(dòng)端轉全棧的方法,最好是從 cordova(以前叫 phonegap)開(kāi)始做 hybrid 開(kāi)發(fā)。
只要關(guān)注 www 目錄里的 H5 即可,比較簡(jiǎn)單
如果 H5 不足以完成的情況下,可以編寫(xiě) cordova 插件,即通過(guò)插件讓 js 調用原生 sdk 里功能
cordova 的 cli 可以通過(guò) npm 安裝,學(xué)習 npm 的好方法
學(xué)習 gulp 構建工具
只要入了 H5 的坑,其實(shí)就非常好辦了。
然后 h5、zeptojs、iscroll、fastclick 等
然后微信常用的,如 weui、vux(vue+weui)、jmui(react+weui)
然后可以玩點(diǎn)框架,比如 jquery mobile,sencha touch
然后可以玩點(diǎn)高級貨,ionicframework(基于 angularjs、cordova)
然后前端4階段,依次打怪升級
然后 node
這個(gè)基本上是我走的路,從2010年寫(xiě)iOS、做phonegap(當時(shí)是0.9.3)、一路走到現在的總結吧!
以前技術(shù)發(fā)展還不是那么明顯,寫(xiě) Java 的時(shí)候 Apache 的開(kāi)源用的比較多,那時(shí)開(kāi)源的代碼托管sourceforge,google code 也都湊合用,自從 Git 和 GitHub 出現時(shí)候,代碼社交興起,極大的促進(jìn)了開(kāi)源的活躍,使得大量明星項目脫引而出。這是好事,如果沒(méi)有開(kāi)源,中國的軟件水平真是要落后好多年。那么問(wèn)題也來(lái)了,如何能夠在技術(shù)快速發(fā)展的今天,個(gè)人成長(cháng)也能更好呢?
學(xué)習的3種層次,跟人學(xué)最快,其次是跟書(shū)(或者博客)學(xué),最差的是自悟。但是牛人不能遇到,遇到了也未必有精力教你,書(shū)本或者博客,別人有,但不一定寫(xiě)出來(lái),就算是寫(xiě)了,可能只是點(diǎn)到為止。至于自悟,如果沒(méi)有深厚的積累的,還是有相當大難度的。
對于開(kāi)發(fā)來(lái)說(shuō)代碼是一切基礎,在掌握了一定計算機基礎后,其差別就在于代碼質(zhì)量和眼界。編程沒(méi)有捷徑,能夠做到每日精進(jìn)就是極好的?,F在開(kāi)源代碼非常多,要能夠從中獲取自己所需的知識,也是一種本領(lǐng)!如果能夠堅持著(zhù)每日精進(jìn),根本不需要向其他人學(xué)習的。

大家可以在 Github 隨便打開(kāi)一個(gè)前端項目,里面有一半以上都是 Node.js 相關(guān)信息,各種包管理、測試、ci、輔助模塊,如果大家對這些基礎信息掌握的非常好,那么學(xué)習一個(gè)新的框架,你要比別人快好多,最重要的是學(xué)了一次,到處使用。
很多人問(wèn)我怎么才能成為一個(gè) Node.js 大神?我的回答是“在cnode論壇上堅持寫(xiě)文章和開(kāi)源項目2年,足矣,輕松進(jìn)阿里騰訊,不用你找他們,他們自會(huì )找你的”。
從今天起,開(kāi)始重視開(kāi)源項目,重視 node,做到每日精進(jìn)
先說(shuō)下我的招人標準,做技術(shù)總監時(shí)上指下派只要看好技術(shù)能力和態(tài)度即可,做CTO時(shí)要考慮團隊文化,人品和能否在公司長(cháng)留,所以不同的人面試要看的點(diǎn)是不一樣的,我曾面過(guò)很多Node.js程序員,也見(jiàn)過(guò)很多面試題,匯總一下,大致有以下9個(gè)點(diǎn):
基本的Node.js幾個(gè)特性,比如事件驅動(dòng)、非阻塞I/O、Stream等
異步流程控制相關(guān),Promise是必問(wèn)的
掌握1種以上Web框架,比如Express、Koa、Thinkjs、Restfy、Hapi等,會(huì )問(wèn)遇到過(guò)哪些問(wèn)題、以及前端優(yōu)化等常識
數據庫相關(guān),尤其是SQL、緩存、Mongodb等
對于常見(jiàn)Node.js模塊、工具的使用,觀(guān)察一個(gè)人是否愛(ài)學(xué)習、折騰
是否熟悉linux,是否獨立部署過(guò)服務(wù)器,有+分
js語(yǔ)法和es6、es7,延伸CoffeeScript、TypeScript等,看看你是否關(guān)注新技術(shù),有+分
對前端是否了解,有+分
是否參與過(guò)或寫(xiě)過(guò)開(kāi)源項目,技術(shù)博客、有+分
補充一句:只看技能沒(méi)人品的人,千萬(wàn)別招,白臉狼
主動(dòng)執行,輔助團隊
掌握一門(mén)后端語(yǔ)言;熟悉用戶(hù)體驗相關(guān)知識;了解軟件工程。
精通瀏覽器工作原理,熟悉HTTP協(xié)議,熟悉設計模式。
掌握改善無(wú)障礙訪(fǎng)問(wèn)的方法;掌握數據采集分析能力;熟悉可維護性問(wèn)題。
通過(guò)開(kāi)發(fā)、使用、推廣效率工具讓自己與團隊的效率得到提高;
提煉可復用組件,為類(lèi)庫貢獻高質(zhì)量代碼.
積極完善知識庫;
跨團隊分享技術(shù)和專(zhuān)業(yè)相關(guān)知識。
輔導新人技能成長(cháng);
協(xié)助主管做招聘和團隊管理工作。
我再知乎上回復的《在跳槽后的第三個(gè)月,收到世界500強的offer,我該怎么辦?》
1)互聯(lián)網(wǎng)公司優(yōu)先,流量大,人才多,機會(huì )也多,流程規范一些
2)今天的世界500強不比從前了,普華永道應該是四大之一,不知道信息化怎么樣,你只要和你現在的公司對比就好了。
3)問(wèn)問(wèn)自己想要什么,錢(qián),經(jīng)歷,還是時(shí)間
如果你很年輕,現在很安逸,我建議你換。如果不是很想動(dòng),那就學(xué)會(huì )所有能接觸到的知識再換。
我是降薪來(lái)的阿里,原因有三,一是有事可為,老板重用你給你機會(huì ),二是集團內部是open的,偏偏我知識面足夠可以看出它們的好處,算是另一種補償吧,三是對個(gè)人品牌是一個(gè)升級,狼叔的職業(yè)生涯到此已經(jīng)足夠了,進(jìn)可攻退可守,也算另一種自由吧!
錢(qián)多是個(gè)優(yōu)勢而已,還有氛圍,文化,信仰
牛人多
業(yè)務(wù)需要
成熟后有更多精力
內部競爭,優(yōu)勝劣汰
財務(wù)相對自由,可以追求信仰了
前幾天還和 @蘇千 聊,我和 @死月絲卡蕾特 相繼入職阿里,還有cnode社區著(zhù)名程序員也即將入職阿里,當時(shí)大家開(kāi)玩笑說(shuō):
“前端的終極歸宿是阿里,不是在阿里,就是在去阿里的路上”
另外要說(shuō)的一點(diǎn)是pc和h5站在使用Node.js做api中間層,其最佳實(shí)踐已成型,量也是極大的。以前前端玩得還是比較弱,如果能夠緩存+控制頁(yè)面數據,獲得一個(gè)性能極大的提升也是極好的。2018年,爭取拿這個(gè)做主題演講上qcon或archsummit大會(huì )。
每天忙得很開(kāi)心,這就是我現在狀態(tài)。其實(shí),我的折騰還是在于想做些事情。如果你也想跟我一起做事,請將簡(jiǎn)歷郵件給我 langshu.ssl@alibaba-inc.com,團隊大量招人,也可以幫忙推薦給集團其他部門(mén)。
大公司的做事方式
按照規矩做事,不要碰紅線(xiàn)
工時(shí)一般壓的都不會(huì )太緊,都是可以商量的,但態(tài)度一定要好
閑的時(shí)候自己學(xué)點(diǎn)東西,上班要學(xué)習相關(guān),下班學(xué)不相干的。別犯傻。
多創(chuàng )造點(diǎn)額外價(jià)值,讓你的領(lǐng)導更喜歡你
理解能力要強,不要讓你的領(lǐng)導說(shuō)二遍。
小公司
簡(jiǎn)單粗暴,快速出東西,領(lǐng)導最關(guān)心的是進(jìn)度
執行力要強,遇佛殺佛,有鬼殺鬼
代碼質(zhì)量其實(shí)沒(méi)太多人管,但自己要注意養成好習慣
沒(méi)有機會(huì )自己創(chuàng )造機會(huì )。創(chuàng )造機會(huì )之前是贏(yíng)得信任。
狼叔經(jīng)常說(shuō)的一句:“少抱怨,多思考,未來(lái)更美好”,大部分人都喜歡積極的人,遇到問(wèn)題不怕不躲不避,要相信自己能夠解決,最多是時(shí)間問(wèn)題。
還有一句是:“沒(méi)目標向錢(qián)看,有目標向前看”。歷史上很多這樣的例子,在2010年左右iOS開(kāi)發(fā)剛起步,會(huì )拖拽弄個(gè)界面的就五位數工資,比做JAVA的幾年的都要多。這世界就是這樣不公平。但是你也不能不思進(jìn)取,這樣也是極其危險。在2016年左右,其實(shí)iOS開(kāi)發(fā)就遇到了市場(chǎng)飽和的問(wèn)題,很多培訓出來(lái)的人都找不到工作,各家公司都在考慮換react-native或weex或者h5。
所以,當你有機會(huì )進(jìn)入一個(gè)很有前途的方向,你要努力學(xué)好,并準備好下一個(gè)階段的應變。相反,如果當成找一個(gè)養老的地方,早晚會(huì )遇到尷尬的。比如現在很多iOS程序員被迫去學(xué)react/vue等,境遇也不太好的,更有甚者直接被開(kāi)除。
職位描述
支撐企業(yè)級應用后臺開(kāi)發(fā),使用 React 等前端框架搭建后臺頁(yè)面,實(shí)現交互需求及后端服務(wù)對接;
以模塊化的思想設計開(kāi)發(fā)通用前端組件,并能夠針對OTT,移動(dòng)端進(jìn)行針對性?xún)?yōu)化;
在理解前端開(kāi)發(fā)流程的基礎上,結合前端實(shí)際建立或優(yōu)化提升工作效率的工具;
在理解產(chǎn)品業(yè)務(wù)的基礎上,提升產(chǎn)品的用戶(hù)體驗,技術(shù)驅動(dòng)業(yè)務(wù)的發(fā)展;
關(guān)注前端前沿技術(shù)研究,通過(guò)新技術(shù)服務(wù)團隊和業(yè)務(wù);
使用 Weex 技術(shù)開(kāi)發(fā)產(chǎn)品需求。"
職位要求
精通前端技術(shù),包括HTML/CSS/JavaScript/Node.JS等;
掌握Bootstrap,jQuery,AngularJS,React等框架,并有項目實(shí)踐;
熟悉前端模塊化、編譯和構建工具,如grunt,gulp,webpack等;
至少熟悉一門(mén)非前端的語(yǔ)言(如Java/PHP/C/C++/Python/Ruby),有項目實(shí)踐更佳;
具備跨終端的前端開(kāi)發(fā)能力,在Web(PC+Mobile)/Node.js/Native App三個(gè)方向上至少精通一個(gè)方向,具備多個(gè)的更佳,鼓勵在Native和Web技術(shù)融合上的探索;
具有較強的學(xué)習能力,對前端技術(shù)有持續的熱情,個(gè)性樂(lè )觀(guān)開(kāi)朗,邏輯性強,善于和產(chǎn)品,UED,后端等方向同學(xué)合作。
PixelLab是與淘寶GM Lab聯(lián)合成立的專(zhuān)注于視頻算法方向的研發(fā)部門(mén),主要涉及視頻的空間感知、軌跡跟蹤、圖像分割、遮擋檢測以及照片級渲染等相關(guān)技術(shù)。用于實(shí)現視頻內的內容植入與后期特效的研發(fā),屬于視頻MR的場(chǎng)景,主要應用于廣告植入平臺的研發(fā),方向靠譜老板人好,歡迎推薦。主要需要的崗位包括了圖像算法、3D視覺(jué)算法,渲染算法,WebGL以及并行計算等幾大方向,因為算法類(lèi)招聘實(shí)在難,所以將JD的鏈接帖出來(lái)希望同事們有適合的人可以?xún)韧埔幌隆?/p>
崗位要求:
1) 本科及以上學(xué)歷,5年以上工作開(kāi)發(fā)經(jīng)驗;
2) 扎實(shí)的計算幾何基礎,熟悉常見(jiàn)數學(xué)工具;
3) 熟練WebGL, Canvas渲染開(kāi)發(fā),熟練Shader編寫(xiě), 熟悉Three.js, OSG.js者優(yōu)先;
4) 熟練運用JavaScript語(yǔ)言與HTML5、CSS3等技術(shù);
5) 熟悉主流移動(dòng)瀏覽器的技術(shù)特點(diǎn),有移動(dòng)端H5, WebGL項目經(jīng)驗者優(yōu)先;
6) 有移動(dòng)端WebGL開(kāi)發(fā)經(jīng)驗者優(yōu)先;
6) 學(xué)習能力強、應變能力強,優(yōu)秀的溝通能力和協(xié)調能力,執行能力強,具備較強的團隊合作精神。
崗位要求:
大學(xué)本科學(xué)歷,2年以上開(kāi)發(fā)經(jīng)驗,能熟練使用常見(jiàn)類(lèi)庫或框架,編寫(xiě)高質(zhì)量的前端代碼;
熟悉NodeJS,有NodeJS開(kāi)發(fā)經(jīng)驗,熟悉Expresskoa等框架;
熟練掌握React、Redux及相關(guān)框架和技術(shù),有單頁(yè)面應用開(kāi)發(fā)經(jīng)驗;
精通ES6,gulp,webpack等規范和技術(shù);
善于 Web 性能優(yōu)化與前端效果的實(shí)現;
良好的團隊合作精神和積極主動(dòng)的溝通意識,具有很強的學(xué)習能力和對新技術(shù)的追求精神,樂(lè )于分享;
有大型網(wǎng)站開(kāi)發(fā)經(jīng)驗者優(yōu)先。
我們的前端專(zhuān)業(yè)建設方向
基于ReactJS的主題可配置組件化平臺
基于Nodejs的UED中臺業(yè)務(wù)(瀏覽器端web頁(yè)面監控等)
基于Docker的nodejs云容器平臺
基于Webpack的前端工程化體系建設
基于eggjs的react同構框架
基于G2的業(yè)務(wù)數據可視化組件庫
大規模圖形識別/圖像處理/AR/VR//語(yǔ)音交互等研究性領(lǐng)域探索
目前北京,杭州,廣州,上海,深圳,成都都在招聘,如果你也想跟我一起共事,請將簡(jiǎn)歷郵件給我 langshu.ssl@alibaba-inc.com,團隊大量招人,也可以幫忙推薦給集團其他部門(mén)。
有機會(huì )和winter,勾股,玉伯,蘇千,樸靈、死馬、偏右,徐飛,阮一峰,天豬,裕波等大神一起工作哦。
悄悄地說(shuō),其實(shí)其他公司我也可以幫推薦。
年輕時(shí)死磕,年長(cháng)點(diǎn)讓小弟死磕,現在抓個(gè)專(zhuān)家一起吃飯,沒(méi)有什么是一頓飯解決不了的,不行就二頓
工程師的能力不是編碼和死磕,而是解決問(wèn)題
年輕死磕是為了長(cháng)本事,30歲以前都可以這樣做
帶團隊后,要懂得任務(wù)下放,讓更多人幫你,別帶人越多越累
30歲之后是打牌階段,技能積累足夠用,這時(shí)要注重社交,打組合拳才能玩的更好
強調30歲不是我創(chuàng )造的,大部分人都會(huì )認為30歲后事情,壓力會(huì )明顯大得多,比如家庭,孩子,房子,車(chē)子,票子,甚至是管理,權利,欲望等等吧。我感受最深的是身體不如從前和記憶力明顯下降。
狼叔說(shuō): “少抱怨,多思考,未來(lái)更美好”
大部分人體會(huì )不到堅持的樂(lè )趣,不會(huì )玩,所以抱怨多。其實(shí)玩出樂(lè )趣也是一種能力,尤其是像寫(xiě)代碼這種看似無(wú)聊的事兒。最開(kāi)始可能只想賺點(diǎn)錢(qián),后面變成熱愛(ài),這樣才美好。只要堅持每日精進(jìn)開(kāi)心就好了。
另外,時(shí)間也要好處處理,狼叔總會(huì )提菜根譚上的一句話(huà):【閑時(shí)要有吃緊的心思,忙里要有偷閑的樂(lè )趣】。
每個(gè)人的一生中都有很多坎,類(lèi)似于瓶頸,唯有苦難和堅持才能沖破,堅持會(huì )產(chǎn)生自信,苦難會(huì )創(chuàng )造機會(huì )。一個(gè)經(jīng)過(guò)苦難還有自信的人,一定會(huì )有更美好的未來(lái)。
如果大家還有問(wèn)題,可以去cnode社區發(fā)帖at我,也可以在Node全棧公眾號提問(wèn)。
答疑有點(diǎn)多,這里就不一一貼出來(lái),如果是新用戶(hù)和比較迷茫的Node朋友去Live里聽(tīng)吧。
感謝justjavac大神的 免費的計算機編程類(lèi)中文書(shū)籍 收錄并推薦
聯(lián)系客服