欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
【全文】狼叔:如何正確的學(xué)習Node.js

說(shuō)明

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),希望對更多朋友有用。

【全文】狼叔:如何正確的學(xué)習Node.js

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朋友,希望大家多多理解和支持。

Part 0 :Node.js簡(jiǎn)介

a)Node.js簡(jiǎn)介
b)什么是Node.js?
c)基本原理

a)Node.js簡(jiǎn)介

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)有異步回調煩惱。

b)什么是Node.js?

按照 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ù)。

c)基本原理

下面是一張 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 版本需要單獨安裝,大家了解一下就好。

Part 1前言:學(xué)習 Node.js 的三個(gè)境界

我總結的編程3種境界

  • 打日志:console.log

  • 斷點(diǎn)調試:斷點(diǎn)調試:node debugger 或node inspector 或vscode

  • 測試驅動(dòng)開(kāi)發(fā)(tdd | bdd)

大家可以自測一下,自己在哪個(gè)水平?如果是第三個(gè)階段,那么本場(chǎng)Live可能不太適合你。哈哈哈

Part 2準備:如何學(xué)習Node.js

Node不是語(yǔ)言,不是框架,只是基于V8運行時(shí)環(huán)境。結合libuv能夠通過(guò)js語(yǔ)法獲得更好的等價(jià)于c/c++的性能。

它很簡(jiǎn)單,異步是解決并發(fā)的最佳實(shí)踐。本節主要講如何學(xué)習Node.js,是本次Live非常核心的內容,大家要注意聽(tīng)。

基礎學(xué)習

1)js語(yǔ)法必須會(huì )

  1. js基本語(yǔ)法,都是c語(yǔ)系的,有其他語(yǔ)言背景學(xué)習起來(lái)相對更簡(jiǎn)單

  2. 常見(jiàn)用法,比如正則,比如數據結構,尤其是數組的幾種用法。比如bind/call/apply等等

  3. 面向對象寫(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)

  1. 先能寫(xiě),采用面向過(guò)程寫(xiě)法,簡(jiǎn)單理解就是定義一堆function,然后調用,非常簡(jiǎn)單

  2. 然后再追求更好的寫(xiě)法,可以面向對象。對于規?;木幊虂?lái)說(shuō),oo是有它的優(yōu)勢的,一般java、c#,ruby這些語(yǔ)言里都有面向對象,所以后端更習慣,但對于語(yǔ)言經(jīng)驗不那么強的前端來(lái)說(shuō)算高級技巧。

  3. 等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是非常容易的。

安裝Node.js環(huán)境

3m安裝法

  • nvm(node version manager)【需要使用npm安裝,替代品是yrm(支持yarn),nvs對window支持很好】

  • nrm(node registry manager)【需要使用npm安裝,替代品是yrm(支持yarn)】

  • npm(node packages manager)【內置,替代品是n或nvs(對win也支持)】

nvm

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 8

nrm

https://registry.npmjs.com 是node官方的源(registry),服務(wù)器在國外,下載速度較慢,推薦安裝nrm來(lái)切換源,國內的cnpm和taobao的源都非???,當然,如果你想自建源也是支持的。

$ npm install --global nrm --registry=https://registry.npm.taobao.org
$ nrm use cnpm

npm

nrm切換完源之后,你安裝npm模塊的速度會(huì )更快。

$ npm install --global yarn

npm基本命令

名稱(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等插件都集成了,對我這種懶人足夠了。

IDE和編輯器

關(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應用場(chǎng)景

《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
編輯器AtomVSCode 都是基于 electron 模塊的electron
物聯(lián)網(wǎng)與硬件ruff.io和很多硬件都支持node sdkruff

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ù)與RPCnode里有各種rpc支持,比如node編寫(xiě)的dnode,seneca,也有跨語(yǔ)言支持的grpc,足夠應用了
5微信公眾號開(kāi)發(fā)相關(guān)sdk,框架非常多,是快速開(kāi)發(fā)的利器
6前端流行SSR && PWASSR是服務(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核心:異步流程控制

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

1) 異步流程控制學(xué)習重點(diǎn)

我整理了一張圖,更直觀(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è)就足夠足夠用了。

結論

  1. Node.js SDK里callback寫(xiě)法必須會(huì )的。

  2. Node.js學(xué)習重點(diǎn): Async函數與Promise

    1. 中流砥柱:Promise

    2. 終極解決方案:Async/Await

所以下面我們會(huì )分個(gè)小部分進(jìn)行講解。

2)Api寫(xiě)法:Error-first Callback 和 EventEmitter

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)景下慎用。

筆者推薦使用 DashZeal 查看離線(xiàn)文檔,經(jīng)常查看離線(xiàn)文檔,對Api理解會(huì )深入很多,比IDE輔助要好,可以有效避免離開(kāi)IDE就不會(huì )寫(xiě)代碼的窘境。

3)中流砥柱:Promise

回調地獄

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é)習資料

4)終極解決方案:Async/Await

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+。

Web編程要點(diǎn)

一般,后端開(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í)前后端思路都是一樣的。

迷茫時(shí)學(xué)習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?,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/...

非科班出身如何Node.js

有朋友提問(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í)間待定。

Part 3延伸:大前端變化那么快,如何才能做到每日精進(jìn)?

有朋友問(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)端轉

看一下移動(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 也都湊合用,自從 GitGitHub 出現時(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)

Part 4實(shí)踐:從招聘角度來(lái)看, Node.js 開(kāi)發(fā)需要具備哪些技能?

招人標準

先說(shuō)下我的招人標準,做技術(shù)總監時(shí)上指下派只要看好技術(shù)能力和態(tài)度即可,做CTO時(shí)要考慮團隊文化,人品和能否在公司長(cháng)留,所以不同的人面試要看的點(diǎn)是不一樣的,我曾面過(guò)很多Node.js程序員,也見(jiàn)過(guò)很多面試題,匯總一下,大致有以下9個(gè)點(diǎn):

  1. 基本的Node.js幾個(gè)特性,比如事件驅動(dòng)、非阻塞I/O、Stream等

  2. 異步流程控制相關(guān),Promise是必問(wèn)的

  3. 掌握1種以上Web框架,比如Express、Koa、Thinkjs、Restfy、Hapi等,會(huì )問(wèn)遇到過(guò)哪些問(wèn)題、以及前端優(yōu)化等常識

  4. 數據庫相關(guān),尤其是SQL、緩存、Mongodb等

  5. 對于常見(jiàn)Node.js模塊、工具的使用,觀(guān)察一個(gè)人是否愛(ài)學(xué)習、折騰

  6. 是否熟悉linux,是否獨立部署過(guò)服務(wù)器,有+分

  7. js語(yǔ)法和es6、es7,延伸CoffeeScript、TypeScript等,看看你是否關(guān)注新技術(shù),有+分

  8. 對前端是否了解,有+分

  9. 是否參與過(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ōu)酷-高級前端開(kāi)發(fā)

職位描述

  1. 支撐企業(yè)級應用后臺開(kāi)發(fā),使用 React 等前端框架搭建后臺頁(yè)面,實(shí)現交互需求及后端服務(wù)對接;

  2. 以模塊化的思想設計開(kāi)發(fā)通用前端組件,并能夠針對OTT,移動(dòng)端進(jìn)行針對性?xún)?yōu)化;

  3. 在理解前端開(kāi)發(fā)流程的基礎上,結合前端實(shí)際建立或優(yōu)化提升工作效率的工具;

  4. 在理解產(chǎn)品業(yè)務(wù)的基礎上,提升產(chǎn)品的用戶(hù)體驗,技術(shù)驅動(dòng)業(yè)務(wù)的發(fā)展;

  5. 關(guān)注前端前沿技術(shù)研究,通過(guò)新技術(shù)服務(wù)團隊和業(yè)務(wù);

  6. 使用 Weex 技術(shù)開(kāi)發(fā)產(chǎn)品需求。"

職位要求

  1. 精通前端技術(shù),包括HTML/CSS/JavaScript/Node.JS等;

  2. 掌握Bootstrap,jQuery,AngularJS,React等框架,并有項目實(shí)踐;

  3. 熟悉前端模塊化、編譯和構建工具,如grunt,gulp,webpack等;

  4. 至少熟悉一門(mén)非前端的語(yǔ)言(如Java/PHP/C/C++/Python/Ruby),有項目實(shí)踐更佳;

  5. 具備跨終端的前端開(kāi)發(fā)能力,在Web(PC+Mobile)/Node.js/Native App三個(gè)方向上至少精通一個(gè)方向,具備多個(gè)的更佳,鼓勵在Native和Web技術(shù)融合上的探索;

  6. 具有較強的學(xué)習能力,對前端技術(shù)有持續的熱情,個(gè)性樂(lè )觀(guān)開(kāi)朗,邏輯性強,善于和產(chǎn)品,UED,后端等方向同學(xué)合作。

PixelLab

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)域探索

聯(lián)系方式

目前北京,杭州,廣州,上海,深圳,成都都在招聘,如果你也想跟我一起共事,請將簡(jiǎn)歷郵件給我 langshu.ssl@alibaba-inc.com,團隊大量招人,也可以幫忙推薦給集團其他部門(mén)。

有機會(huì )和winter,勾股,玉伯,蘇千,樸靈、死馬、偏右,徐飛,阮一峰,天豬,裕波等大神一起工作哦。

悄悄地說(shuō),其實(shí)其他公司我也可以幫推薦。

結束語(yǔ)

年輕時(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)。

Part 5答疑:回答大家的問(wèn)題

答疑有點(diǎn)多,這里就不一一貼出來(lái),如果是新用戶(hù)和比較迷茫的Node朋友去Live里聽(tīng)吧。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
async/await 是如何讓代碼更加簡(jiǎn)潔的?
web前端框架Javascript之JavaScript 異步編程史
深入理解Node.js異步編程模型:提升可讀性和可維護性的技術(shù)解決方案
全棧工程師之路
前端開(kāi)發(fā)框架之Electron的認識
還在手擼 Nginx 配置?試試這款可視化配置工具吧,真心強大!
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久