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

說明

2017-12-14 我發了一篇文章《沒用過Node.js,就別瞎逼逼》是由於有人在知乎上黑Node.js。那篇文章的反響仍是至關不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,居然坐車的還坐過站了。你們能夠很明顯的感到Node.js的普及度還不夠,還存不少誤解。甚至說不少小白用戶也得不到很好的學習。大神都功成身退,書也跟不上,大部分都是2013年左右的,Node.js版本都是基於v0.10左右的,如今已經v9了。想一想也是有點惋惜,使用如此普遍的Node.js被你們默認,卻沒人來科普。css

反思以後,我就想準備一個科普的Live,因而就有了《狼叔:如何正確學習 Node.js?》,相信可以對不少喜歡Node.js的朋友有所幫助。Live已完成目前1200多人,230人評價,平均4.8+,還算是一個比較成功的Live。現整理出來,但願對更多朋友有用。html

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

Live 簡介前端

如今,愈來愈多的科技公司和開發者開始使用 Node.js 開發各類應用。Node.js除了可以輔助大前端開發外,還能夠編寫Web應用,封裝Api,組裝RPC服務等,甚至是開發VSCode編輯器同樣的PC客戶端。和其它技術相比, Node.js 簡單易學,性能好、部署容易,可以輕鬆處理高併發場景下的大量服務器請求。Node.js 周邊的生態也很是強大,NPM(Node包管理)上有超過60萬個模塊,日下超過載量3億次。但編寫 Node.js 代碼對新人和其它語言背景的開發者來講,不是一件容易的事,在入門以前須要弄懂很多複雜的概念。vue

我身邊也有不少人問我:如何學習 Node.js ?做爲一名 Node.js 佈道者,我作過不少 Node.js 普及和推廣的工做,對它的基本概念和核心模塊都很熟悉; 此外,我還在撰寫一本名爲《更了不得的 Node.js 》的書,已經寫了 2 年,積累了很豐富的資料,本次 Live 也將爲你提供對 Node.js 更全面的解讀。java

本次 Live 主要包括如下內容,目錄node

Part 0 :Node.js簡介python

a)Node.js簡介
b)什麼是Node.js?
c)基本原理mysql

Part 1前言:學習 Node.js 的三個境界react

Part 2準備:如何學習Node.jsjquery

  • 2.1 Node 用途那麼多,我該從哪裏學起?
  • 2.2 Node Web 框架那麼多,我該怎麼選?
  • 2.3 關於 Node 的書幾乎都過期了,我該買哪本?

Part 3延伸:大前端變化那麼快,如何才能作到每日精進?

Part 4實踐:從招聘角度來看, Node.js 開發須要具有哪些技能?

Part 5答疑:回答你們的問題

本次Live主要是科普,適用新用戶和比較迷茫的Node朋友,但願你們多多理解和支持。

Part 0 :Node.js簡介

a)Node.js簡介
b)什麼是Node.js?
c)基本原理

a)Node.js簡介

Node.js 誕生於 2009 年,由 Joyent 的員工 Ryan Dahl 開發而成,以後 Joyent 公司一直扮演着 Node.js 孵化者的角色。因爲諸多緣由,Ryan 在2012年離開社區,隨後在2015年因爲 Node 貢獻者對 es6 新特性集成問題的分歧,致使分裂出iojs,並由 iojs 發佈1.0、2.0和3.0版本。因爲 iojs 的分裂最終促成了2015年Node基金會的成立,並順利發佈了4.0版本。Node.js基金會的創始成員包括 Google、Joyent、IBM、Paypal、微軟、Fidelity 和 Linux基金會,創始成員將共同掌管過去由 Joyent 一家企業掌控的 Node.js 開源項目。此後,Node.js基金會發展很是好,穩定的發佈五、六、七、8等版本,截止發稿最新版本已是8.6,長期支持版本是6.11。

Node.js 不是一門語言也不是框架,它只是基於 Google V8 引擎的 JavaScript 運行時環境,同時結合 Libuv 擴展了 JavaScript 功能,使之支持 io、fs 等只有語言纔有的特性,使得 JavaScript 可以同時具備 DOM 操做(瀏覽器)和 I/O、文件讀寫、操做數據庫(服務器端)等能力,是目前最簡單的全棧式語言。

早在2007年,Jeff Atwood 就提出了著名的 Atwood定律

任何可以用 JavaScript 實現的應用系統,最終都必將用 JavaScript 實現

目前 Node.js 在大部分領域都佔有一席之地,尤爲是 I/O 密集型的,好比 Web 開發,微服務,前端構建等。很多大型網站都是使用 Node.js 做爲後臺開發語言的,用的最多的就是使用Node.js作前端渲染和架構優化,好比 淘寶 雙11、去哪兒網 的 PC 端核心業務等。另外,有很多知名的前端庫也是使用 Node.js 開發的,好比,Webpack 是一個強大的打包器,React/Vue 是成熟的前端組件化框架。

Node.js一般被用來開發低延遲的網絡應用,也就是那些須要在服務器端環境和前端實時收集和交換數據的應用(API、即時聊天、微服務)。阿里巴巴、騰訊、Qunar、百度、PayPal、道瓊斯、沃爾瑪和 LinkedIn 都採用了 Node.js 框架搭建應用。

另外, Node.js 編寫的包管理器 npm 已成爲開源包管理了領域最好的生態,直接到2017年10月份,有模塊超過47萬,每週下載量超過32億次,每月有超過700萬開發者使用npm。

固然了,Node.js 也有一些缺點。Node.js 常常被人們吐槽的一點就是:回調太多難於控制(俗稱回調地獄)和 CPU 密集任務處理的不是很好。可是,目前異步流程技術已經取得了很是不錯的進步,從Callback、Promise 到 Async函數,能夠輕鬆的知足全部開發需求。至於 CPU 密集任務處理並不是不可解,方案有不少,好比經過系統底層語言 Rust 來擴展 Node.js,但這樣會比較麻煩。筆者堅信在合適的場景使用合適的東西,尤爲是在微服務架構下,一切都是服務,能夠作到語言無關。若是你們想使 JavaScript 作 CPU 密集任務,推薦 Node.js 的兄弟項目 fibjs,基於纖程(fiber,能夠簡單理解爲更輕量級的線程),效率很是高,兼容npm,同時沒有異步回調煩惱。

b)什麼是Node.js?

按照 Node.js官方網站主頁 的說法:

Node.js® is a JavaScript runtime built on Chrome's 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.

從這段介紹來看,解讀要點以下

  • Node.js 不是 JavaScript 應用,不是語言(JavaScript 是語言),不是像 Rails(Ruby)、 Laravel(PHP) 或 Django(Python) 同樣的框架,也不是像 Nginx 同樣的 Web 服務器。Node.js 是 JavaScript 運行時環境
  • 構建在 Chrome's V8 這個著名的 JavaScript 引擎之上,Chrome V8 引擎以 C/C++ 爲主,至關於使用JavaScript 寫法,轉成 C/C++ 調用,大大的下降了學習成本
  • 事件驅動(event-driven),非阻塞 I/O 模型(non-blocking I/O model),簡單點講就是每一個函數都是異步的,最後由 Libuv 這個 C/C++ 編寫的事件循環處理庫來處理這些 I/O 操做,隱藏了非阻塞 I/O 的具體細節,簡化併發編程模型,讓你能夠輕鬆的編寫高性能的Web應用,因此它是輕量(lightweight)且高效(efficient)的
  • 使用 npm 做爲包管理器,目前 npm 是開源庫裏包管理最大的生態,功能強大,截止到2017年12月,模塊數量超過 60 萬+

大多數人都認爲 Node.js 只能寫網站後臺或者前端工具,這實際上是不全面的,Node.js的目標是讓併發編程更簡單,主要應用在以網絡編程爲主的 I/O 密集型應用。它是開源的,跨平臺,而且高效(尤爲是I/O處理),包括IBM、Microsoft、Yahoo、SAP、PayPal、沃爾瑪及GoDaddy都是 Node.js 的用戶。

c)基本原理

下面是一張 Node.js 早期的架構圖,來自 Node.js 之父 Ryan Dahl 的演講稿,在今天依然不過期,它簡要的介紹了 Node.js 是基於 Chrome V8引擎構建的,由事件循環(Event Loop)分發 I/O 任務,最終工做線程(Work Thread)將任務丟到線程池(Thread Pool)裏去執行,而事件循環只要等待執行結果就能夠了。

14912763353044.png

核心概念

  • Chrome V8 是 Google 發佈的開源 JavaScript 引擎,採用 C/C++ 編寫,在 Google 的 Chrome 瀏覽器中被使用。Chrome V8 引擎能夠獨立運行,也能夠用來嵌入到 C/C++ 應用程序中執行。
  • Event Loop 事件循環(由 libuv 提供)
  • Thread Pool 線程池(由 libuv 提供)

梳理一下

  • Chrome V8 是 JavaScript 引擎
  • Node.js 內置 Chrome V8 引擎,因此它使用的 JavaScript 語法
  • JavaScript 語言的一大特色就是單線程,也就是說,同一個時間只能作一件事
  • 單線程就意味着,全部任務須要排隊,前一個任務結束,纔會執行後一個任務。若是前一個任務耗時很長,後一個任務就不得不一直等着。
  • 若是排隊是由於計算量大,CPU 忙不過來,倒也算了,可是不少時候 CPU 是閒着的,由於 I/O 很慢,不得不等着結果出來,再往下執行
  • CPU 徹底能夠無論 I/O 設備,掛起處於等待中的任務,先運行排在後面的任務
  • 將等待中的 I/O 任務放到 Event Loop 裏
  • 由 Event Loop 將 I/O 任務放到線程池裏
  • 只要有資源,就盡力執行

咱們再換一個維度看一下

14992384974942.png

核心

  • Chrome V8 解釋並執行 JavaScript 代碼(這就是爲何瀏覽器能執行 JavaScript 緣由)
  • libuv 由事件循環和線程池組成,負責全部 I/O 任務的分發與執行

在解決併發問題上,異步是最好的解決方案,能夠拿排隊和叫號機來理解

  • 排隊:在排隊的時候,你除了等以外什麼都幹不了
  • 叫號機:你要作的是先取號碼,等輪到你的時候,系統會通知你,這中間,你能夠作任何你想作的事兒

Node.js 其實就是幫咱們構建相似的機制。咱們在寫代碼的時候,實際上就是取號的過程,由 Event Loop 來接受處理,而真正執行操做的是具體的線程池裏的 I/O 任務。之因此說 Node.js 是單線程,就是由於在接受任務的時候是單線程的,它無需進程/線程切換上下文的成本,很是高效,但它在執行具體任務的時候是多線程的。

Node.js 公開宣稱的目標是 「旨在提供一種簡單的構建可伸縮網絡程序的方法」,毫無疑問,它確實作到了。這種作法將併發編程模型簡化了,Event Loop和具體線程池等細節被 Node.js 封裝了,繼而將異步調用 Api 寫法暴露給開發者。真是福禍相依,一方面簡化了併發編程,另外一方面在寫法上埋下了禍根,這種作法的好處是能讓更多人垂手可得的寫出高性能的程序!

在Node.js Bindings層作的事兒就是將 Chrome V8 等暴露的 C/C++ 接口轉成JavaScript Api,而且結合這些 Api 編寫了 Node.js 標準庫,全部這些 Api 統稱爲 Node.js SDK,後面模塊章節會有更詳細的討論。

微軟在2016年宣佈在MIT許可協議下開放 Chakra 引擎,並以 ChakraCore 爲名在 Github 上開放了源代碼,ChakraCore 是一個完整的 JavaScript 虛擬機,它擁有着和 Chakra 幾乎相同的功能與特性。微軟向 Node.js 主分支提交代碼合併請求,讓 Node.js 用上 ChakraCore引擎,即 nodejs/node-chakracore 項目。實際上微軟是經過建立名爲 V8 shim 的庫的賦予了 ChakraCore 處理谷歌 Chrome V8 引擎指令的能力,其原理示意圖以下

15018598977763.jpg

目前,Node.js 同時支持這2種 JavaScript 引擎,兩者性能和特性上各有千秋,ChakraCore 在特性上感受更潮一些,曾經是第一個支持 Async函數 的引擎,但目前 Node.js 仍是以 Chrome V8 引擎爲主, ChakraCore 版本須要單獨安裝,你們瞭解一下就好。

Part 1前言:學習 Node.js 的三個境界

我總結的編程3種境界

  • 打日誌:console.log
  • 斷點調試:斷點調試:node debugger 或node inspector 或vscode
  • 測試驅動開發(tdd | bdd)

你們能夠自測一下,本身在哪一個水平?若是是第三個階段,那麼本場Live可能不太適合你。哈哈哈

Part 2準備:如何學習Node.js

Node不是語言,不是框架,只是基於V8運行時環境。結合libuv可以經過js語法得到更好的等價於c/c++的性能。

它很簡單,異步是解決併發的最佳實踐。本節主要講如何學習Node.js,是本次Live很是核心的內容,你們要注意聽。

基礎學習

1)js語法必須會

  1. js基本語法,都是c語系的,有其餘語言背景學習起來相對更簡單
  2. 常見用法,好比正則,好比數據結構,尤爲是數組的幾種用法。好比bind/call/apply等等
  3. 面向對象寫法。js是基於對象的,因此它的oo寫起來很是詭異。參見紅皮書JavaScript高級編程,不少框架都是本身實現oo基礎框架,好比ext-core等。

犀牛書,《JavaScript權威指南》,沒事就多翻翻,看少多少遍都不爲過。

2)我的學習和技術選型都要按部就班

  1. 先能寫,採用面向過程寫法,簡單理解就是定義一堆function,而後調用,很是簡單
  2. 而後再追求更好的寫法,能夠面向對象。對於規模化的編程來講,oo是有它的優點的,通常java、c#,ruby這些語言裏都有面向對象,因此後端更習慣,但對於語言經驗不那麼強的前端來講算高級技巧。
  3. 等oo玩膩了,能夠有更好的追求:函數式編程,不管編程思惟,仍是用法上都對已有的編程思惟是個挑戰。我很喜歡函數式,但不太會在團隊裏使用,畢竟oo階段還沒徹底掌握,風險會比較大。但若是團隊水平都很是高了,團隊穩定是能夠用的。

能夠看出個人思路,先能寫,而後再追求更好的寫法,好比面向對象。等團隊水平到必定程度了,而且穩定的時候,能夠考慮更加極致的函數式寫法。

團隊是這樣選型的,我的學習也這樣,最好是按部就班,步子邁大了很差。

3)各類高級的JavaScript友好語言

JavaScript友好語言指的是可以使用其餘語法實現,但最終編譯成js的語言。自從Node.js出現後,這種黑科技層出不窮。好比比較有名的coffee、typescript、babel(es)等。

CoffeeScript雖然也是JavaScript友好語言,但其語法借鑑ruby,崇尚極簡,對於類型和OO機制上仍是偏弱,並且這麼多年也沒發展起來,仍然是比較小衆的活着。將來比例會愈來愈少的。

顯然TypeScript會愈來愈好,TypeScript 的強大之處是要用過才知道的。

  • 1)規模化編程,像Java那種,靜態類型,面向對象,前端只有TypeScript能作到
  • 2)親爹是微軟安德斯·海爾斯伯格,不知道此人的請看borland傳奇去
  • 3)開源,將來很好
  • 4)組合拳:TypeScript + VSCode = 神器

當下前端發展速度極快,以指數級的曲線增加。之前可能1年都不必定有一項新技術,如今可能每月都有。大前端,Node全棧,架構演進等等都在快速變化。能夠說,前端越複雜,有越多的不肯定性,TypeScript的機會就越大。

4)再論面向對象

面向對象想用好也不容易的,並且js裏有各類實現,真是讓人眼花繚亂。

  • 基於原型的寫法,縱觀JavaScript高級編程,就是翻來覆去的講這個,這個很基礎,但很差是很好用。能夠不用,但不能夠不會。
  • 本身寫面向對象機制是最好的,但不是每一個人都有這個能力的。好在es6規範出了更好一點的面向對象,經過class、extends、super關鍵字來定義類,已經明顯好不少了,雖然還很弱,但起碼勉強能用起來了。從面向過程走過來的同窗,推薦這種寫法,簡單易用。但要注意面向對象要有面向對象的寫法,要理解抽象,繼承,封裝,多態4個基本特徵。若是想用好,你甚至還須要看一些設計模式相關的書。好在有《JavaScript設計模式》一書。Koa2裏已經在用這種寫法了。
  • js是腳本語言,解釋便可執行。因此它的最大缺點是沒有類型系統,這在規模化編程裏是很是危險的,一個函數,傳參就能玩死人。因而如今流行使用flow和typescript來作類型校驗。flow只是工具,比較輕量級。而typescript是es6超級,給es6補充了類型系統和更完善的面向對象機制,因此大部分人都會對ts有好感,頗有多是將來的趨勢。

對於es6高級特性,我是比較保守的,通常node長期支持版本lts支持的我都讓用,一些更新的特性我通常不讓使用。根本lts版本保持一致就好。

個人團隊如今是採用es6的面向對象寫法開發,後面會一點一點轉到typescript上的。熟練oo轉到ts是很是容易的。

安裝Node.js環境

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版本發佈很是快,並且多版本共存可能性較大,推薦使用nvm來安裝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),服務器在國外,下載速度較慢,推薦安裝nrm來切換源,國內的cnpm和taobao的源都很是快,固然,若是你想自建源也是支持的。

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

npm

nrm切換完源以後,你安裝npm模塊的速度會更快。

$ npm install --global yarn

npm基本命令

名稱 描述 簡寫
npm install xxx 安裝xxx模塊,但不記錄到package.json裏 npm i xxx
npm install --save xxx 安裝xxx模塊,而且記錄到package.json裏,字段對應的dependency,是產品環境必須依賴的模塊 npm i -s xxx
npm install --save-de xxx 安裝xxx模塊,而且記錄到package.json裏,字段對應的dev-dependency,是開發環境必須依賴的模塊,好比測試類的(mocha、chai、sinon、zombie、supertest等)都在 npm i -D xxx
npm install --global xxx 全局安裝xxx模塊,但不記錄到package.json裏,若是模塊裏package.json有bin配置,會自動連接,做爲cli命令 npm i -g xxx

經常使用軟件

  • 1)oh my zsh是我最習慣的shell,終端下很是好用

配合iterm2分屏 + spectacle全屏,幾乎無敵

  • 2)brew是mac裝軟件很是好的方式,和apt-get、rpm等都很是相似

安裝4個必備軟件

  • brew install git 最流行的SCM源碼版本控制軟件
  • brew install wget 下載、扒站神器
  • brew install ack 搜索代碼神器
  • brew install autojump 終端下多目錄跳轉神器
  • 3)vim

我雖然不算vim黨,但也深愛着。janus是一個很是好用的vim集成開發環境。好比ctrl-p、nerdtree等插件都集成了,對我這種懶人足夠了。

IDE和編輯器

關於Node.js的IDE和編輯器有不少選擇,對好比下

名稱 是否收費 斷點調試 功能
Webstorm 收費 支持 是IDE,在代碼提示、重構等方面功能很是強大,支持的各類語言、框架、模板也很是多,支持斷點調試,好處是特別智能,缺點也是特別智能
Sublime/TextMate 收費 不支持 編輯器裏很是好用的,textmate主要針對mac用戶,sublime是跨平臺的,相信不少前端開發都熟悉
Vim/Emace 免費 不支持 命令行下的編輯器,很是強大,難度也稍大,但更爲酷炫,並且對於服務器部署開發來講是值得一學的
VSCode/Atom 免費 支持 Atom比較早,功能強大,缺點稍卡頓,VSCode是微軟出的,速度快,對於Node.js 調試,重構,代碼提示等方面支持都很是好

Visual Studio Code是一個運行於 Mac、Windows和 Linux 之上的,針對於編寫現代 Web 和雲應用的跨平臺源代碼編輯器。它功能強大,便於調試,加上它自己也是基於 Node.js 模塊 electron 構建的,尤爲要推薦你們使用。

Visual Studio Code(如下簡稱vsc)

  • vsc是一個比較潮比較新的編輯器(跨平臺Mac OS X、Windows和 Linux )
  • vsc功能和textmate、sublime、notepad++,ultraedit等比較,絕不遜色
  • vsc尤爲是在nodejs(調試)和typescript、go上支持尤爲好
  • vsc提供了自定義 Debugger Adapter 和 VSCode Debug Protocol 從而實現本身的調試器

值得一學,我推薦VSCode編輯器!

更多調試方法,參見https://github.com/i5ting/nod...

Node.js應用場景

《Node.js in action》一書裏說,Node.js 所針對的應用程序有一個專門的簡稱:DIRT。它表示數據密集型實時(data-intensive real-time)程序。由於 Node.js 自身在 I/O 上很是輕量,它善於將數據從一個管道混排或代理到另外一個管道上,這能在處理大量請求時持有不少開放的鏈接,而且只佔用一小部份內存。它的設計目標是保證響應能力,跟瀏覽器同樣。

這話不假,但在今天來看,DIRT 仍是範圍小了。其實 DIRT 本質上說的 I/O 處理的都算,但隨着大前端的發展,Node.js 已經再也不只是 I/O 處理相關,而是更加的「Node」!

Node.js 使用場景主要分爲4大類

屏幕快照 2017-05-17 07.25.05.png

  • 1)跨平臺:覆蓋你能想到的面向用戶的全部平臺,傳統的PC Web端,以及PC客戶端 nw.js/electron 、移動端 cordova、HTML五、react-nativeweex,硬件 ruff.io
  • 2)Web應用開發:網站、Api、RPC服務等
  • 3)前端:三大框架 React Vue Angular 輔助開發,以及工程化演進過程(使用Gulp /Webpack 構建 Web 開發工具)
  • 4)工具:npm上各類工具模塊,包括各類前端預編譯、構建工具 Grunt / Gulp、腳手架,命令行工具,各類奇技淫巧等

下面列出具體的 Node.js 的使用場景,以模塊維度劃分

分類 描述 相關模塊
網站 相似於 cnodejs.org 這樣傳統的網站 Express / Koa
Api 同時提供給移動端,PC,H5 等前端使用的 HTTP Api 接口 Restify / HApi
Api代理 爲前端提供的,主要對後端Api接口進行再處理,以便更多的適應前端開發 Express / Koa
IM即時聊天 實時應用,不少是基於 WebSocket協議的 Socket.io / sockjs
反向代理 提供相似於 nginx 反向代理功能,但對前端更友好 anyproxy / node-http-proxy / hiproxy
前端構建工具 輔助前端開發,尤爲是各類預編譯,構建相關的工具,可以極大的提升前端開發效率 Grunt / Gulp / Bower / Webpack / Fis3 / YKit
命令行工具 使用命令行是很是酷的方式,前端開發自定義了不少相關工具,不管是shell命令,node腳本,仍是各類腳手架等,幾乎每一個公司小組都會本身的命令行工具集 Cordova / Shell.js
操做系統 有實現,但估計不太會有人用 NodeOS
跨平臺打包工具 使用 Web 開發技術開發PC客戶端是目前最流行的方式,會有更多前端開發工具是採用這種方式的 PC端的electron、nw.js,好比釘釘PC客戶端、微信小程序IDE、微信客戶端,移動的Cordova,即老的Phonegap,還有更加有名的一站式開發框架Ionicframework
P2P 區塊鏈開發、BT客戶端 webtorrent / ipfs
編輯器 AtomVSCode 都是基於 electron 模塊的 electron
物聯網與硬件 ruff.io和不少硬件都支持node sdk ruff

Node.js 應用場景很是豐富,好比 Node.js 能夠開發操做系統,但通常我都不講的,就算說了也沒多大意義,難道你們真的會用嗎?通常,我習慣將 Node.js 應用場景氛圍7個部分。

1)初衷,server端,不想成了前端開發的基礎設施
2)命令行輔助工具,甚至能夠是運維
3)移動端:cordova,pc端:nw.js和electron
4)組件化,構建,代理
5)架構,先後端分離、api proxy
6)性能優化、反爬蟲與爬蟲
7) 全棧最便捷之路

編號 場景 說明
1 反向代理 Node.js能夠做爲nginx這樣的反向代理,雖然線上咱們不多這樣作,但它確確實實能夠這樣作。好比node-http-proxy和anyproxy等,其實使用Node.js作這種請求轉發是很是簡單的,在後面的http章節裏,有單獨的講解。
2 爬蟲 有大量的爬蟲模塊,好比node-crawler等,寫起來比python要簡單一些,尤爲搭配jsdom(node版本的jQuery)類庫的,對前端來講尤爲友好
3 命令行工具 全部輔助開發,運維,提升效率等等能夠用cli作的,使用node來開發都很是合適,是編寫命令行工具最簡單的方式,java8之後也參考了node的命令行實現
4 微服務與RPC node裏有各類rpc支持,好比node編寫的dnode,seneca,也有跨語言支持的grpc,足夠應用了
5 微信公衆號開發 相關sdk,框架很是多,是快速開發的利器
6 前端流行SSR && PWA SSR是服務器端渲染,PWA是漸進式Web應用,都是今年最火的技術。若是你們用過,必定對Node.js不陌生。好比React、Vuejs都是Node.js實現的ssr。至於pwa的service-worker也是Node.js實現的。那麼爲啥不用其餘語言實現呢?不是其餘語言不能實現,而是使用Node.js簡單、方便、學習成本低,輕鬆得到高性能,若是用其餘語言,我至少還得裝環境

能夠說目前你們可以看到的、用到的軟件都有 Node.js 身影,當下最流行的軟件寫法也大都是基於 Node.js 的,好比 PC 客戶端 luin/medis 採用 electron 打包,寫法採用 React + Redux。我本身一直的實踐的【Node全棧】,也正是基於這種趨勢而造成的。在將來,Node.js 的應用場景會更加的普遍,更多參見 sindresorhus/awesome-nodejs

Node核心:異步流程控制

Node.js是爲異步而生的,它本身把複雜的事兒作了(高併發,低延時),交給用戶的只是有點難用的Callback寫法。也正是坦誠的將異步回調暴露出來,纔有更好的流程控制方面的演進。也正是這些演進,讓Node.js從DIRT(數據敏感實時應用)擴展到更多的應用場景,今天的Node.js已經不僅是能寫後端的JavaScript,已經涵蓋了全部涉及到開發的各個方面,而Node全棧更是熱門種的熱門。

直面問題纔能有更好的解決方式,Node.js的異步是整個學習Node.js過程當中重中之重。

  • 1) 異步流程控制學習重點
  • 2)Api寫法:Error-first Callback 和 EventEmitter
  • 3)中流砥柱:Promise
  • 4)終極解決方案:Async/Await

1) 異步流程控制學習重點

我整理了一張圖,更直觀一些。從09年到如今,8年多的時間裏,整個Node.js社區作了大量嘗試,其中曲折足足夠寫一本書的了。你們先簡單瞭解一下。

Screen Shot 2017-04-05 at 08.43.08.png

  • 紅色表明Promise,是使用最多的,不管async仍是generator均可用
  • 藍色是Generator,過分貨
  • 綠色是Async函數,趨勢

結論:Promise是必須會的,那你爲何不順勢而爲呢?

推薦:使用Async函數 + Promise組合,以下圖所示。

其實,通常使用是不須要掌握上圖中的全部技術的。對於初學者來講,先夠用,再去深究細節。因此,精簡一下,只瞭解3個就足夠足夠用了。

Screen Shot 2017-04-05 at 08.43.34.png

結論

  1. Node.js SDK裏callback寫法必須會的。
  2. Node.js學習重點: Async函數與Promise

    1. 中流砥柱:Promise
    2. 終極解決方案:Async/Await

因此下面咱們會分個小部分進行講解。

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

a)Error-first Callback
定義錯誤優先的回調寫法只須要注意2條規則便可:

  • 回調函數的第一個參數返回的error對象,若是error發生了,它會做爲第一個err參數返回,若是沒有,通常作法是返回null。
  • 回調函數的第二個參數返回的是任何成功響應的結果數據。若是結果正常,沒有error發生,err會被設置爲null,並在第二個參數就出返回成功結果數據。

下面讓咱們看一下調用函數示例,Node.js 文檔裏最常採用下面這樣的回調方式:

function(err, res) {
  // process the error and result
}

這裏的 callback 指的是帶有2個參數的函數:"err"和 "res"。語義上講,非空的「err」至關於程序異常;而空的「err」至關於能夠正常返回結果「res」,無任何異常。

b)EventEmitter

事件模塊是 Node.js 內置的對觀察者模式「發佈/訂閱」(publish/subscribe)的實現,經過EventEmitter屬性,提供了一個構造函數。該構造函數的實例具備 on 方法,能夠用來監聽指定事件,並觸發回調函數。任意對象均可以發佈指定事件,被 EventEmitter 實例的 on 方法監聽到。

在node 6以後,能夠直接使用require('events')

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是很是相似的。並且前端本身也有EventEmitter。

c)如何更好的查Node.js文檔

API是應用程序接口Application Programming Interface的簡稱。從Node.js異步原理,咱們能夠知道,核心在於 Node.js SDK 中API調用,而後交由EventLoop(Libuv)去執行,因此咱們必定要熟悉Node.js的API操做。

Node.js的API都是異步的,同步的函數是奢求,要查API文檔,在高併發場景下慎用。

筆者推薦使用 DashZeal 查看離線文檔,常常查看離線文檔,對Api理解會深刻不少,比IDE輔助要好,能夠有效避免離開IDE就不會寫代碼的窘境。

api.png

3)中流砥柱:Promise

回調地獄

Node.js 由於採用了錯誤優先的回調風格寫法,致使sdk裏導出都是回調函數。若是組合調用的話,就會特別痛苦,常常會出現回調裏嵌套回調的問題,你們都很是厭煩這種寫法,稱之爲Callback Hell,即回調地獄。一個經典的例子來自著名的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都採用錯誤優先的回調方式,這部分場景都是你們直接調用接口,無太多變化。而Promise是對回調地獄的思考,或者說是改良方案。目前使用很是廣泛,能夠說是在async函數普及以前惟一一個通用性規範,甚至 Node.js 社區都在考慮 Promise 化,可見其影響之大。

Promise最先也是在commonjs社區提出來的,當時提出了不少規範。比較接受的是promise/A規範。後來人們在這個基礎上,提出了promise/A+規範,也就是實際上如今的業內推行的規範。ES6 也是採用的這種規範。

Promise意味着[許願|承諾]一個尚未完成的操做,但在將來會完成的。與Promise最主要的交互方法是經過將函數傳入它的then方法從而獲取得Promise最終的值或Promise最終最拒絕(reject)的緣由。要點有三個:

  • 遞歸,每一個異步操做返回的都是promise對象
  • 狀態機:三種狀態轉換,只在promise對象內部能夠控制,外部不能改變狀態
  • 全局異常處理

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"));
  }
});

每一個Promise定義都是同樣的,在構造函數裏傳入一個匿名函數,參數是resolve和reject,分別表明成功和失敗時候的處理。

2)調用

promise.then(function(text){
    console.log(text)// Stuff worked!
    return Promise.reject(new Error('我是故意的'))
}).catch(function(err){
    console.log(err)
})

它的主要交互方式是經過then函數,若是Promise成功執行resolve了,那麼它就會將resolve的值傳給最近的then函數,做爲它的then函數的參數。若是出錯reject,那就交給catch來捕獲異常就行了。

Promise 的最大優點是標準化,各種異步工具庫都按照統一規範實現,即便是async函數也能夠無縫集成。因此用 Promise 封裝 API 通用性強,用起來簡單,學習成本低。在async函數普及以前,絕大部分應用都是採用Promise來作異步流程控制的,因此掌握Promise是Node.js學習過程當中必需要掌握的重中之重。

Bluebird是 Node.js 世界裏性能最好的Promise/a+規範的實現模塊,Api很是齊全,功能強大,是原生Promise外的不二選擇。

好處以下:

  • 避免Node.js內置Promise實現 問題,使用與全部版本兼容
  • 避免Node.js 4曾經出現的內存泄露問題
  • 內置更多擴展,timeout、 promisifyAll等,對Promise/A+規範提供了強有力的補充

限於時間關係,這裏就不一一列舉了,仍是那句話,在學習Node.js過程當中,對於Promise瞭解多深刻都不過度。

推薦學習資料

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

Async/Await是異步操做的終極解決方案,Koa 2在node 7.6發佈以後,立馬發佈了正式版本,而且推薦使用async函數來編寫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件事兒

  • 經過await Student.getAllAsync();來獲取全部的students信息。
  • 經過await ctx.render渲染頁面
  • 因爲是同步代碼,使用try/catch作的異常處理

是否是很是簡單,如今Eggjs裏也都是這樣同步的代碼。

4.1 正常寫法

const pkgConf = require('pkg-conf');

async function main(){
    const config = await pkgConf('unicorn');

    console.log(config.rainbow);
    //=> true
}

main();

變態寫法

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();

要點

  • 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函數要點以下:

  • Async函數語義上很是好
  • Async不須要執行器,它自己具有執行能力,不像Generator須要co模塊
  • Async函數的異常處理採用try/catch和Promise的錯誤處理,很是強大
  • Await接Promise,Promise自身就足夠應對全部流程了,包括async函數沒有純並行處理機制,也能夠採用Promise裏的all和race來補齊
  • Await釋放Promise的組合能力,外加co和Promise的then,幾乎沒有不支持的場景

綜上所述

  • Async函數是趨勢,若是Chrome 52. v8 5.1已經支持Async函數(https://github.com/nodejs/CTC...,Node.js支持還會遠麼?
  • Async和Generator函數裏都支持promise,因此promise是必須會的。
  • Generator和yield異常強大,不過不會成爲主流,因此學會基本用法和promise就行了,不必全部的都必須會。
  • co做爲Generator執行器是不錯的,它更好的是當作Promise 包裝器,經過Generator支持yieldable,最後返回Promise,是否是有點無恥?

小結

這部分共講了4個小點,都是極其直接的必須掌握的知識點。

  • 1) 異步流程控制學習重點
  • 2)Api寫法:Error-first Callback 和 EventEmitter
  • 3)中流砥柱:Promise
  • 4)終極解決方案:Async/Await

這裏再提一下關於Node.js源碼閱讀問題,不少人api都還沒完熟練就去閱讀源碼,這是很是不同意的,不帶着問題去讀源碼是比較容易迷失在大量代碼中的。效果並很差。

先用明白,而後再去閱讀Node.js源碼,而後探尋libuv併發機制。不少人買了樸大的《深刻淺出Node.js》一書,看了以後仍是不太會用,不是書寫的很差,而是步驟不對。

  • Node in action和了不得的Node.js是入門的絕好書籍,很是簡單,各個部分都講了,但不深刻,看了以後,基本就能用起來了
  • 當你用了一段以後,你會對Node.js的運行機制好奇,爲啥呢?這時候去讀樸大的《深刻淺出Node.js》一書就可以解惑。緣由很簡單,九淺一深一書是偏向底層實現原理的書,從操做系統,併發原理,node源碼層層解讀。若是是新手讀,不免會比較鬱悶。
  • 實踐類的能夠看看雷宗民(老雷)和趙坤(nswbmw)寫的書

我通常給你們的推薦是把Node in action讀上5遍10遍,入門幹活足夠了。剩下的就是反覆實踐,多寫代碼和npm模塊就好。

目前全部的書籍幾乎都有點過期了,大部分都是Node.js v0.10左右的版本的,我得新書是基於Node.js 8版本的,預計2018年3月或4月出版。別催我,真無法更快了。

目錄

博文視點的美女編輯在苦逼的整理中,預計出版在3月以後(不要催我,我也無法說),20章,800頁+,訂價預計在130+。

Web編程要點

通常,後端開發指的是 Web 應用開發中和視圖渲染無關的部分,主要是和數據庫交互爲主的重業務型邏輯處理。但如今架構升級後,Node.js 承擔了先後端分離重任以後,有了更多玩法。從帶視圖的傳統Web應用面向Api接口應用,到經過 RPC 調用封裝對數據庫的操做,到提供前端 Api 代理和網關,服務組裝等,統稱爲後端開發,再也不是以往只有和數據庫打交道的部分纔算後端。這樣,就可讓前端工程師對開發過程可控,更好的進行調優和性能優化。

對 Node.js 來講,一直沒有在後端取得其合理的佔有率,緣由是多方面的,暫列幾條。

  • 1)利益分配,已有實現大可能是Java或者其餘語言,基本是無法撼動的,重寫的成本是巨大的,另外,若是用Node寫了,那麼那些寫Java的人怎麼辦?搶人飯碗,這是要拼命的。
  • 2)Node相對年輕,你們對Node的理解不夠,回調和異步流程控制略麻煩,不少架構師都不肯意花時間去學習。儘管在Web應用部分處理起來很是簡單高效,但在遇到問題時並不容易排查定位,對開發者水平要求略高。
  • 3)開發者技能單一,不少是從前端轉過來的,對數據庫,架構方面知識欠缺,對系統設計也知之很少,這是很危險的,有種麻桿打狼兩頭懼怕的感受。
  • 4)Node在科普、培訓、佈道等方面作的並很差,國外使用的很是多,國內卻不多人知道,不如某些語言作得好。

儘管如此,Node.js 仍是盡人皆知,捲入各類是非風口,也算是在大前端浪潮中大紅大紫。緣由它的定位很是明確,補足以 JavaScript 爲核心的全棧體系中服務器部分。開發也是人,可以同時掌握並精通多門語言的人畢竟很少,並且程序員的美德是「懶」,能使用 JavaScript 一門語言完成全部事兒,爲何要學更多呢?

對於 Web 應用大體分2種,帶視圖的傳統Web應用面向Api接口應用,咱們先看一下 Node.js Web 應用開發框架的演進時間線大體以下:

  • 2010年 TJ Holowaychuk 寫的 Express
  • 2011年 Derby.js 開始開發,8月5日,WalmartLabs 的一位成員 Eran Hammer 提交了 Hapi 的第一次git記錄。Hapi 本來是 Postmile 的一部分,而且最開始是基於 Express 構建的。後來它發展成本身本身的框架,
  • 2012年1月21日,專一於 Rest api 的 Restify 發佈1.0版本,同構的 Meteor 開始投入開發,最像Rails 的 Sails 也開始了開發
  • 2013年 TJ Holowaychuk 開始玩 es6 generator,編寫 co 這個 Generator 執行器,並開始了Koa 項目。2013 年下半年李成銀開始 ThinkJS,參考 ThinkPHP
  • 2014年4月9日,Express 發佈4.0,進入4.x時代持續到今天,MEAN.js 開始隨着 MEAN 架構的提出開始開發,意圖大一統,另外 Total.js 開始起步,最像PHP裏 Laravel 或 Python 裏的 Django 或 ASP.NET MVC的框架,表明着 Node.js 的成熟,開始從其餘語言裏的成熟框架借鑑
  • 2015年8月22日,下一代 Web 框架 Koa 發佈1.0,能夠在Node.js v0.12下面,經過co 和 generator實現同步邏輯,那時候 co 仍是基於 thunkfy 的,在2015年10月30日,ThinkJS發佈了首個基於 Es2015+ 特性開發的 v2.0 版本
  • 2016 年 09 月,螞蟻金服的 Eggjs,在 JSConf China 2016 上亮相併宣佈開源
  • 2017年2月,下一代Web框架 Koa 發佈v2.0正式版

咱們能夠根據框架的特性進行分類

框架名稱 特性 點評
Express 簡單、實用,路由中間件等五臟俱全 最著名的Web框架
Derby.js && Meteor 同構 先後端都放到一塊兒,模糊了開發便捷,看上去更簡單,實際上上對開發來講要求更高
Sails、Total 面向其餘語言,Ruby、PHP等 借鑑業界優秀實現,也是 Node.js 成熟的一個標誌
MEAN.js 面向架構 相似於腳手架,又指望同構,結果只是蹭了熱點
Hapi和Restfy 面向Api && 微服務 移動互聯網時代Api的做用被放大,故而獨立分類。尤爲是對於微服務開發更是利器
ThinkJS 面向新特性 借鑑ThinkPHP,並慢慢走出本身的一條路,對於Async函數等新特性支持,無出其右,新版v3.0是基於Koa v2.0的做爲內核的
Koa 專一於異步流程改進 下一代Web框架
Egg 基於Koa,在開發上有極大便利 企業級Web開發框架

對於框架選型

  • 業務場景、特色,沒必要爲了什麼而什麼,避免本末倒置
  • 自身團隊能力、喜愛,有時候技術選型決定團隊氛圍的,須要平衡激進與穩定
  • 出現問題的時候,有人可以作到源碼級定製。Node.js 已經有8年曆史,但模塊完善程度參差不齊,若是不慎踩到一個坑裏,須要團隊在無外力的狀況可以搞定,不然會影響進度
Tips:我的學習求新,企業架構求穩,無非喜愛與場景而已

Node.js 原本就爲了作後端而設計的,這裏咱們再看看利益問題。Node.js 向後端延伸,必然會觸動後端開發的利益。那麼 Proxy 層的事兒,先後端矛盾的交界處,後端不想變,前端又求變,那麼久而久之,Api接口會變得愈來愈噁心。後端是願意把Api的事兒叫前端的,對後端來講,只要你不動個人數據庫和服務就能夠。

可是 Node.js 能不能作這部分呢?答案是能的,這個是和 Java、PHP 相似的,通常是和數據庫鏈接到一塊兒,處理帶有業務邏輯的。目前國內大部分都是以 Java、PHP 等爲主,因此要想吃到這部分並不容易。

  • 小公司,創業公司,新孵化的項目更傾向於 Node.js ,簡單,快速,高效
  • 微服務架構下的某些服務,使用 Node.js 開發,是比較合理的

國內這部分一直沒有作的很好,因此 Node.js 在大公司尚未很好的被應用,安全問題、生態問題、歷史遺留問題等,還有不少人對 Node.js 的誤解。

  • 單線程很脆弱,這是事實,但單線程不等於不能多核併發,並且你還有集羣呢
  • 運維,其實很簡單,比其餘語言之簡單,日誌採集、監控也很是簡單
  • 模塊穩定性,對於 MongoDBMySQLRedis 等仍是至關不錯,但其餘的數據庫支持可能沒那麼好。
  • 安全問題是個僞命題,全部框架面臨的都是同樣的。

這些對於提供Api服務來講已經足夠了,本書後面有大量篇幅講如何使用 Koa 框架來構建Api服務。

Web編程核心

  • 異步流程控制(前面講過了)
  • 基本框架 Koa或Express,新手推薦Express,畢竟資料多,上手更容易。若是有必定經驗,推薦Koa,其實這些都是爲了瞭解Web編程原理,尤爲是中間件機制理解。
  • 數據庫 mongodb或mysql都行,mongoose和Sequelize、bookshelf,TypeOrm等都很是不錯。對於事物,不是Node.js的鍋,是你選的數據庫的問題。另一些偏門,想node連sqlserver等估計還不成熟,我是不會這樣用的。
  • 模板引擎, ejs,jade,nunjucks。理解原理最好。尤爲是extend,include等高級用法,理解佈局,複用的好處。其實先後端思路都是同樣的。

迷茫時學習Node.js最好的方法

Node.js 編寫的包管理器 npm 已成爲開源包管理了領域最好的生態,直接到2017年10月份,有模塊超過47萬,每週下載量超過32億次,每月有超過700萬開發者使用npm。如今早已經超過60萬個模塊了。

這裏就不一一舉例了,給出一個迷茫時學習Node.js最好的方法吧!

某天,我在3w咖啡整理書稿,而後小弟梁過來了,聊聊他的現狀,一副很很差的樣子,在天津我曾帶過他大半年,總不能無論,我給他的建議是:「天天看10個npm模塊」

對於學習Node.js迷茫的人來講,這是最好的方式,當你不知道如何作的時候,就要向前(錢)看,你要知道積累哪些技能對之後有好處。對於學習Node.js必經之路,必定是要掌握不少模塊用法,並從中汲取技巧、思路、設計思想的。與其不知道學什麼,爲何不天天積累幾個技巧呢?

推薦一個repo即 https://github.com/parro-it/a... 小型庫集合,一天看十個不是夢!

更多討論 https://zhuanlan.zhihu.com/p/...

非科班出身如何Node.js

有朋友提問

狼叔,關注你和cnode好久了,最近有點迷茫,想請你指點下。
個人狀況是這樣的,非科班出身,從事前端工做4年,公司使用的技術棧是vue二、vue-router、vuex、webpack,目前的能力處理工做仍是比較輕鬆,可是也很明確本身有不少不足,只是對於如何提高比較迷茫。
不足:
一、非科班出身,計算機基礎薄弱
二、對當前使用的技術瞭解不夠深刻,不少東西只停留在會用的層面
三、對服務端了解較少,想學node,殊不知道如何系統的學習

解答困惑:

一、計算機基礎薄弱該如何完善本身的知識體系?

答:追逐長尾,所見所聞不懂的都去學就好啦。我是這樣過來的,頭幾年天天14個小時+,很累,不過效果還能夠。os,算法,數據結構,設計模式,編譯原理,基本也就這些重點。作到天天都有進步就好,別貪多求快。數學和英文固然也是越狠越好的!

二、如何在技術上作更深刻的探索?

答:技術人只關注技術,想法創意一般比較少。最簡單的辦法就是抓本身的癢,比我大學時和朋友們翻譯過grails文檔,因此對翻譯有情節。爲了翻譯,我用node寫了無數工具嘗試,反覆對比各類翻譯工具,理解它們背後的設計。包括markdown裏嵌html標籤標識中英文,而後gulp編譯成獨立文檔。甚至一度想上線賣服務。這種折騰真的很爽,甚至耽誤了很多翻譯。有時要警戒長尾,不要忘了本身的初衷

三、如何系統的學習node?

答:階段

1/要會用,能完成工做任務
2/寫點提升效率的工具
3/參與開源項目,甚至是node源碼

應對方法

1/《node in action》看五遍,而後就去寫吧,別管代碼質量如何,能寫敢寫
2/多用些模塊,理解它們,若是有機會就本身寫一下,萬一有不少人用你,我小弟寫過一個地區選擇加載的json數據,star數很多呢
3/給別人貢獻代碼,要去學別人的習慣,網上有git標準工做流和提pr方法,你要作的是精研該模塊代碼,關注issue,其餘就是等機會。另外樸靈的深刻淺出多讀幾遍,試着讀node源碼,你的理解會更好。推薦看看我寫的《經過開源項目去學習》https://github.com/i5ting/Stu...
4/跳出node範圍,從新審視node的應用場景,對將來你的技術選項和決策大有裨益

  • 2.1 Node 用途那麼多,我該從哪裏學起?

答:若是有機會就直接上Web應用,若是沒有機會就從前端構建,工具等方面開始作,慢慢引入更潮更酷的前端技術,天然就把Node引入進來了。不要急。

  • 2.2 Node Web 框架那麼多,我該怎麼選?

答:初學者推薦Express,若是有必定經驗,推薦Koa。固然真正項目裏仍是推薦Eggjs和Thinkjs這樣的框架。

  • 2.3 關於 Node 的書幾乎都過期了,我該買哪本?

答:
1)Node in action和了不得的Node.js是入門的絕好書籍,很是簡單,各個部分都講了,但不深刻,看了以後,基本就能用起來了
2)當你用了一段以後,你會對Node.js的運行機制好奇,爲啥呢?這時候去讀樸大的《深刻淺出Node.js》一書就可以解惑。緣由很簡單,九淺一深一書是偏向底層實現原理的書,從操做系統,併發原理,node源碼層層解讀。若是是新手讀,不免會比較鬱悶。
3)實踐類的能夠看看雷宗民(老雷)和趙坤(nswbmw)寫的書

若是你不着急,也能夠等個人那本《更了不得的Node.js》,時間待定。

Part 3延伸:大前端變化那麼快,如何才能作到每日精進?

有朋友問如今Android開發和web前端開發哪一個前景更好?個人回答是明顯是前端更好,看一下移動端發展過程

native < hybrid < rn/weex < h5

目前rn和weex的開發逐漸變得主流,組件化寫法已經由前端主導了。之前ios和android程序員佔比很高,但如今就留1到2個寫插件,真是差異很大。

Web開發對移動端的衝擊很是大。固然如今Web技術也開發PC client了,好比vscode是經過electron打包的,效果仍是至關不錯的。

前端能夠說是最近幾年開發裏最火的部分,緣由不少,最主要是開發方式的變動,以今時今日的眼光來看,稱之爲現代Web開發是不爲過的。

先給出現代Web開發的概覽圖

15117552681353.jpg

每次演講我會都問你們是否是前端,回答「是」的人很是多,我會開玩笑的恭喜你們:「如今的前端就是錢端」,確實,如今前端發展異常的快,並且沒有趨向於類比java裏ssh框架的那種穩定,因此將來很長一段時間,還會增加,持續混亂,這對前端來講是把雙刃劍,一方面有很強的壓迫感,不學習就跟不上時代,另外一方它也是機遇,可以帶給更多機會,包括money。

你們都疑惑的一個問題是如何在這樣鉅變的時代可以經過學習來應變,我能夠很負責的告訴你們,沒有捷徑,但經過掌握 Node.js 可以讓你下降這個學習曲線而已,畢竟Node.js是大前端的基礎設施。你們能夠看一下,前端的開發過程,模塊化,構建,輔助工具,調優,架構調整,能夠說Node.js是無處不在的。

其實,輔助大前端開發只是Node.js的一個很是無意插柳的衍生功能,經過掌握Node.js可以讓你能作的更多、得到的更多,甚至能夠說有更多自我實現的快樂,這也是我那本書書名字裏「更了不得的」要去闡述的內容。

綜上種種,就是我一直提倡以 JavaScript 語言爲中心的 Node全棧 概念的原因,JavaScript 覆蓋全部前端,Node.js 擅長作 I/O 密集型的後端,外加輔助開發的各類基礎設施,無疑是工做、學習和成爲快速掌握全棧技術最好的途徑。你會的越多,你能作的就更多,你的人生也將會有不同的精彩篇章。

全棧核心

  • 後端不會的 UI(界面相關)
  • 前端不會的 DB(業務相關)

只要打通這2個要點,其餘就比較容易了。最怕的是哪樣都接觸點,而後就號稱本身是全棧,建議你們不要這樣作,這就比如在簡歷裏寫精通同樣,基本上都會被問到尷尬。全棧是一種信仰,不是拿來吹牛逼的,而能夠解決更多問題,讓本身的知識體系不留空白,享受自我實現的極致快樂。

個人全棧之路

想問一下狼叔最近的業務一直都是簡單的用express搭一個後端服務,沒有其餘更加深刻node的業務了,這種時候應該如何本身給本身創應用場景呢

沒有目標就向錢看,有目標就向前看
  • 從 java 開始,蹭課,揹着機箱到深圳,3個月胖20斤
  • 堅持翻譯英文文檔,看 《Thinking in Java》
  • 畢業後開始 bi,整理 bi 文檔
  • 學長明林清,傳授 jQuery,願意學,別人就更願意分析
  • 接手《內蒙廣電數據分析與科學決策系統》,打通前、後端
  • 廣東聯通,本身造輪子,寫 jQuery 插件,DRY
  • 作雲計算,學習 AIX,寫有《凌雲志》
  • 分手、離職,去作 iOS,從 cordova 開始搞 H5,研究各類移動端框架,本身寫框架,轉原生
  • 面試也是學習的利器,輕鬆進新浪
  • 總結了大量 iOS 經驗,想寫書,結果寫了一堆寫書的工具
既然沒法逃避,就熱愛它,最後變成興趣
  • 去網秦作技術總監,作首席,管架構,帶人,寫開源項目
  • 創業,當 CTO,結婚,作公衆號運營,寫書,最苦的時候沒錢吃飯,又不能找媳婦要,只能在 StuQ 上講點課
  • 加入去哪兒網,任職前端架構師
  • 加入阿里巴巴,前端技術專家
人生不僅有代碼,但它能讓我快樂,終生受益

也曾懵懂,也曾迷茫,但我這人比較傻,一直信奉:「一次只作1件事兒,盡力作到極致」,短期看這是比較傻的,但一旦你堅持下去,你就會發現技術實際上是門手藝,厚積薄發。

我沒辦法說本身最擅長什麼,但在什麼場景下用什麼技術是我擅長的。或者說,應變是我最大的本事。不少框架,新技術我都沒見過,用過,但花一點點過一下,就能拿已有的知識快速的理解它,這實際上是長期學習的好處。

如今愈來愈忙,寫代碼的時間愈來愈少,技術又愈加展越快,我能作好的就是每日精進,仗着這點已有的知識儲備跟年輕人比賽。我不以爲累,相反我很享受這種感受,沒有被時代淘汰,是一件多麼幸福的事兒。

從後端轉

作後端的人

  • 對數據庫是比較熟悉,不管 mongodb,仍是 mysql、postgres
  • 對前端理解比較弱,會基本的 html,css,模板引擎等比較熟悉
4階段按部就班,build 與工具齊飛

前端開發4階段,個人感受是按照順序,按部就班就好。

從前端轉

從前端日後端轉,api 接口很是容易學會,像 express、koa 這類框架大部分人一週就能學會,最難的是對 db、er 模型的理解,說直白點,仍是業務需求落地的理解

咱們來想一想通常的前端有什麼技能?

  • html
  • css(兼容瀏覽器)
  • js 會點(可能更多的是會點 jquery)
  • ps 切圖
  • firebug 和 chrome debuger 會的人都不太多
  • 用過幾個框架,大部分人是僅僅會用
  • 英語通常
  • svn/git 會一點

那麼他們若是想在前端領域作的更深有哪些難點呢?

  • 基礎:oo,dp,命令,shell,構建等
  • 編程思想上的理解(mvc、ioc,規約等)
  • 區分概念
  • 外圍驗收,如 H5 和 hybird 等
  • 追趕趨勢,如何學習新東西

以上皆是痛點,因此比較好的辦法應該是這樣的。

  • 玩轉 npm、gulp 這樣的前端工具類(此時仍是前端)
  • 使用 node 作先後端分離(此時仍是前端)
  • express、koa 這類框架
  • jade、ejs 等模板引擎
  • nginx
  • 玩轉【後端】異步流程處理(promise/es6的(generator|yield)/es7(async|await))
  • 玩轉【後端】mongodb、mysql 對應的 Node 模塊

從咱們的經驗看,這樣是比較靠譜的。先作最簡單先後端分離,裏面沒有任何和db相關,前端能夠很是容易的學會,基本2周就已經很是熟練了。通常半年後,讓他們接觸【異步流程處理】和【數據庫】相關內容,學習後端代碼,就能夠全棧了。

從移動端轉

看一下移動端發展過程

native < hybrid < rn/weex < h5

目前rn和weex的開發逐漸變得主流,組件化寫法已經由前端主導了。之前ios和android程序員佔比很高,但如今就留1到2個寫插件,真是差異很大。狼叔一直執拗的覺得將來是h5的。

如今的 Native 開發是姥姥不疼舅舅不愛,很是尷尬,很明顯連培訓出的人就業不要工資混經驗就很明顯了。另外領導們也都在惦記,能不能用 H5 寫?這還算是保守的,若是直接激進的就直接上 RN 了,那麼 Native開發的程序員就變了

一個寫插件的程序員...招誰惹誰了。。。。

要麼忍,要麼轉,沒辦法,認命吧,溫水裏舒服了幾年,也該學點東西了

  • hybrid 或組件化開發,你總要會同樣
  • 不管哪一種,你都離前端很近,由於 H5 或組件化都是從前端走出來的
  • 組件化在前端領域先行,不管借鑑仍是學習都不可避免
  • 若是沒時間就直接上組件化,若是有時間就好好學學前端完總體系,最終也仍是要學組件化

原生開發就是 iOS 用 OC/Swift,Android 用 java 或 scala 等,就算偶爾嵌入 webview,能玩js的機會也很是好少

因此移動端轉全棧的方法,最好是從 cordova(之前叫 phonegap)開始作 hybrid 開發。

  • 只要關注 www 目錄裏的 H5 便可,比較簡單
  • 若是 H5 不足以完成的狀況下,能夠編寫 cordova 插件,即經過插件讓 js 調用原生 sdk 裏功能
  • cordova 的 cli 能夠經過 npm 安裝,學習 npm 的好方法
  • 學習 gulp 構建工具

只要入了 H5 的坑,其實就很是好辦了。

  • 而後 h五、zeptojs、iscroll、fastclick 等
  • 而後微信經常使用的,如 weui、vux(vue+weui)、jmui(react+weui)
  • 而後能夠玩點框架,好比 jquery mobile,sencha touch
  • 而後能夠玩點高級貨,ionicframework(基於 angularjs、cordova)
  • 而後前端4階段,依次打怪升級
  • 而後 node

這個基本上是我走的路,從2010年寫iOS、作phonegap(當時是0.9.3)、一路走到如今的總結吧!

之前技術發展還不是那麼明顯,寫 Java 的時候 Apache 的開源用的比較多,那時開源的代碼託管sourceforgegoogle code 也都湊合用,自從 GitGitHub 出現時候,代碼社交興起,極大的促進了開源的活躍,使得大量明星項目脫引而出。這是好事,若是沒有開源,中國的軟件水平真是要落後好多年。那麼問題也來了,如何可以在技術快速發展的今天,我的成長也能更好呢?

學習的3種層次,跟人學最快,其次是跟書(或者博客)學,最差的是自悟。可是牛人不能遇到,遇到了也未必有精力教你,書本或者博客,別人有,但不必定寫出來,就算是寫了,可能只是點到爲止。至於自悟,若是沒有深厚的積累的,仍是有至關大難度的。

對於開發來講代碼是一切基礎,在掌握了必定計算機基礎後,其差異就在於代碼質量和眼界。編程沒有捷徑,可以作到每日精進就是極好的。如今開源代碼很是多,要可以從中獲取本身所需的知識,也是一種本領!若是可以堅持着每日精進,根本不須要向其餘人學習的。

15011322589471.jpg

你們能夠在 Github 隨便打開一個前端項目,裏面有一半以上都是 Node.js 相關信息,各類包管理、測試、ci、輔助模塊,若是你們對這些基礎信息掌握的很是好,那麼學習一個新的框架,你要比別人快好多,最重要的是學了一次,處處使用。

不少人問我怎麼才能成爲一個 Node.js 大神?個人回答是「在cnode論壇上堅持寫文章和開源項目2年,足矣,輕鬆進阿里騰訊,不用你找他們,他們自會找你的」。

從今天起,開始重視開源項目,重視 node,作到每日精進

Part 4實踐:從招聘角度來看, Node.js 開發須要具有哪些技能?

招人標準

先說下個人招人標準,作技術總監時上指下派只要看好技術能力和態度便可,作CTO時要考慮團隊文化,人品和可否在公司長留,因此不一樣的人面試要看的點是不同的,我曾面過不少Node.js程序員,也見過不少面試題,彙總一下,大體有如下9個點:

  1. 基本的Node.js幾個特性,好比事件驅動、非阻塞I/O、Stream等
  2. 異步流程控制相關,Promise是必問的
  3. 掌握1種以上Web框架,好比Express、Koa、Thinkjs、Restfy、Hapi等,會問遇到過哪些問題、以及前端優化等常識
  4. 數據庫相關,尤爲是SQL、緩存、Mongodb等
  5. 對於常見Node.js模塊、工具的使用,觀察一我的是否愛學習、折騰
  6. 是否熟悉linux,是否獨立部署過服務器,有+分
  7. js語法和es六、es7,延伸CoffeeScript、TypeScript等,看看你是否關注新技術,有+分
  8. 對前端是否瞭解,有+分
  9. 是否參與過或寫過開源項目,技術博客、有+分

補充一句:只看技能沒人品的人,千萬別招,白臉狼

主動執行,輔助團隊
掌握一門後端語言;熟悉用戶體驗相關知識;瞭解軟件工程。
精通瀏覽器工做原理,熟悉HTTP協議,熟悉設計模式。
掌握改善無障礙訪問的方法;掌握數據採集分析能力;熟悉可維護性問題。
經過開發、使用、推廣效率工具讓本身與團隊的效率獲得提升;
提煉可複用組件,爲類庫貢獻高質量代碼.
積極完善知識庫;
跨團隊分享技術和專業相關知識。
輔導新人技能成長;
協助主管作招聘和團隊管理工做。

你們是選大公司仍是小公司?

我再知乎上回復的《在跳槽後的第三個月,收到世界500強的offer,我該怎麼辦?》

1)互聯網公司優先,流量大,人才多,機會也多,流程規範一些

2)今天的世界500強不比從前了,普華永道應該是四大之一,不知道信息化怎麼樣,你只要和你如今的公司對比就行了。

3)問問本身想要什麼,錢,經歷,仍是時間

若是你很年輕,如今很安逸,我建議你換。若是不是很想動,那就學會全部能接觸到的知識再換。

我是降薪來的阿里,緣由有三,一是有事可爲,老闆重用你給你機會,二是集團內部是open的,恰恰我知識面足夠能夠看出它們的好處,算是另外一種補償吧,三是對我的品牌是一個升級,狼叔的職業生涯到此已經足夠了,進可攻退可守,也算另外一種自由吧!

錢可能是個優點而已,還有氛圍,文化,信仰

  • 牛人多
  • 業務須要
  • 成熟後有更多精力
  • 內部競爭,優勝劣汰
  • 財務相對自由,能夠追求信仰了

前幾天還和 @蘇千 聊,我和 @死月絲卡蕾特 相繼入職阿里,還有cnode社區著名程序員也即將入職阿里,當時你們開玩笑說:

「前端的終極歸宿是阿里,不是在阿里,就是在去阿里的路上」

另外要說的一點是pc和h5站在使用Node.js作api中間層,其最佳實踐已成型,量也是極大的。之前前端玩得仍是比較弱,若是可以緩存+控制頁面數據,得到一個性能極大的提高也是極好的。2018年,爭取拿這個作主題演講上qcon或archsummit大會。

天天忙得很開心,這就是我如今狀態。其實,個人折騰仍是在於想作些事情。若是你也想跟我一塊兒作事,請將簡歷郵件給我 langshu.ssl@alibaba-inc.com,團隊大量招人,也能夠幫忙推薦給集團其餘部門。

大公司的作事方式

  • 按照規矩作事,不要碰紅線
  • 工時通常壓的都不會太緊,都是能夠商量的,但態度必定要好
  • 閒的時候本身學點東西,上班要學習相關,下班學不相干的。別犯傻。
  • 多創造點額外價值,讓你的領導更喜歡你
  • 理解能力要強,不要讓你的領導說二遍。

小公司

  • 簡單粗暴,快速出東西,領導最關心的是進度
  • 執行力要強,遇佛殺佛,有鬼殺鬼
  • 代碼質量其實沒太多人管,但本身要注意養成好習慣
  • 沒有機會本身創造機會。創造機會以前是贏得信任。

狼叔常常說的一句:「少抱怨,多思考,將來更美好」,大部分人都喜歡積極的人,遇到問題不怕不躲不避,要相信本身可以解決,最可能是時間問題。

還有一句是:「沒目標向錢看,有目標向前看」。歷史上不少這樣的例子,在2010年左右iOS開發剛起步,會拖拽弄個界面的就五位數工資,比作JAVA的幾年的都要多。這世界就是這樣不公平。可是你也不能不思進取,這樣也是極其危險。在2016年左右,其實iOS開發就遇到了市場飽和的問題,不少培訓出來的人都找不到工做,各家公司都在考慮換react-native或weex或者h5。

因此,當你有機會進入一個頗有前途的方向,你要努力學好,並準備好下一個階段的應變。相反,若是當成找一個養老的地方,遲早會遇到尷尬的。好比如今不少iOS程序員被迫去學react/vue等,境遇也不太好的,更有甚者直接被開除。

優酷-高級前端開發

職位描述

  1. 支撐企業級應用後臺開發,使用 React 等前端框架搭建後臺頁面,實現交互需求及後端服務對接;
  2. 以模塊化的思想設計開發通用前端組件,並可以針對OTT,移動端進行鍼對性優化;
  3. 在理解前端開發流程的基礎上,結合前端實際創建或優化提高工做效率的工具;
  4. 在理解產品業務的基礎上,提高產品的用戶體驗,技術驅動業務的發展;
  5. 關注前端前沿技術研究,經過新技術服務團隊和業務;
  6. 使用 Weex 技術開發產品需求。"

職位要求

  1. 精通前端技術,包括HTML/CSS/JavaScript/Node.JS等;
  2. 掌握Bootstrap,jQuery,AngularJS,React等框架,並有項目實踐;
  3. 熟悉前端模塊化、編譯和構建工具,如grunt,gulp,webpack等;
  4. 至少熟悉一門非前端的語言(如Java/PHP/C/C++/Python/Ruby),有項目實踐更佳;
  5. 具有跨終端的前端開發能力,在Web(PC+Mobile)/Node.js/Native App三個方向上至少精通一個方向,具有多個的更佳,鼓勵在Native和Web技術融合上的探索;
  6. 具備較強的學習能力,對前端技術有持續的熱情,個性樂觀開朗,邏輯性強,善於和產品,UED,後端等方向同窗合做。

PixelLab

PixelLab是與淘寶GM Lab聯合成立的專一於視頻算法方向的研發部門,主要涉及視頻的空間感知、軌跡跟蹤、圖像分割、遮擋檢測以及照片級渲染等相關技術。用於實現視頻內的內容植入與後期特效的研發,屬於視頻MR的場景,主要應用於廣告植入平臺的研發,方向靠譜老闆人好,歡迎推薦。主要須要的崗位包括了圖像算法、3D視覺算法,渲染算法,WebGL以及並行計算等幾大方向,由於算法類招聘實在難,因此將JD的連接帖出來但願同事們有適合的人能夠內推一下。

崗位要求:
1) 本科及以上學歷,5年以上工做開發經驗;
2) 紮實的計算幾何基礎,熟悉常見數學工具;
3) 熟練WebGL, Canvas渲染開發,熟練Shader編寫, 熟悉Three.js, OSG.js者優先;
4) 熟練運用JavaScript語言與HTML五、CSS3等技術;
5) 熟悉主流移動瀏覽器的技術特色,有移動端H5, WebGL項目經驗者優先;
6) 有移動端WebGL開發經驗者優先;
6) 學習能力強、應變能力強,優秀的溝通能力和協調能力,執行能力強,具有較強的團隊合做精神。

螞蟻金服

崗位要求:

  • 大學本科學歷,2年以上開發經驗,能熟練使用常見類庫或框架,編寫高質量的前端代碼;
  • 熟悉NodeJS,有NodeJS開發經驗,熟悉Expresskoa等框架;
  • 熟練掌握React、Redux及相關框架和技術,有單頁面應用開發經驗;
  • 精通ES6,gulp,webpack等規範和技術;
  • 善於 Web 性能優化與前端效果的實現;
  • 良好的團隊合做精神和積極主動的溝通意識,具備很強的學習能力和對新技術的追求精神,樂於分享;
  • 有大型網站開發經驗者優先。

咱們的前端專業建設方向

  • 基於ReactJS的主題可配置組件化平臺
  • 基於Nodejs的UED中臺業務(瀏覽器端web頁面監控等)
  • 基於Docker的nodejs雲容器平臺
  • 基於Webpack的前端工程化體系建設
  • 基於eggjs的react同構框架
  • 基於G2的業務數據可視化組件庫
  • 大規模圖形識別/圖像處理/AR/VR//語音交互等研究性領域探索

聯繫方式

目前北京,杭州,廣州,上海,深圳,成都都在招聘,若是你也想跟我一塊兒共事,請將簡歷郵件給我 langshu.ssl@alibaba-inc.com,團隊大量招人,也能夠幫忙推薦給集團其餘部門。

有機會和winter,勾股,玉伯,蘇千,樸靈、死馬、偏右,徐飛,阮一峯,天豬,裕波等大神一塊兒工做哦。

悄悄地說,其實其餘公司我也能夠幫推薦。

結束語

年輕時死磕,年長點讓小弟死磕,如今抓個專家一塊兒吃飯,沒有什麼是一頓飯解決不了的,不行就二頓

工程師的能力不是編碼和死磕,而是解決問題

  • 年輕死磕是爲了長本事,30歲之前均可以這樣作
  • 帶團隊後,要懂得任務下放,讓更多人幫你,別帶人越多越累
  • 30歲以後是打牌階段,技能積累足夠用,這時要注重社交,打組合拳才能玩的更好

強調30歲不是我創造的,大部分人都會認爲30歲後事情,壓力會明顯大得多,好比家庭,孩子,房子,車子,票子,甚至是管理,權利,慾望等等吧。我感覺最深的是身體不如從前和記憶力明顯降低。

狼叔說: 「少抱怨,多思考,將來更美好」

大部分人體會不到堅持的樂趣,不會玩,因此抱怨多。其實玩出樂趣也是一種能力,尤爲是像寫代碼這種看似無聊的事兒。最開始可能只想賺點錢,後面變成熱愛,這樣才美好。只要堅持每日精進開心就行了。

另外,時間也要好到處理,狼叔總會提菜根譚上的一句話:【閒時要有吃緊的心思,忙裏要有偷閒的樂趣】。

每一個人的一輩子中都有不少坎,相似於瓶頸,惟有苦難和堅持才能衝破,堅持會產生自信,苦難會創造機會。一個通過苦難還有自信的人,必定會有更美好的將來。

若是你們還有問題,能夠去cnode社區發帖at我,也能夠在Node全棧公衆號提問。

Part 5答疑:回答你們的問題

答疑有點多,這裏就不一一貼出來,若是是新用戶和比較迷茫的Node朋友去Live裏聽吧。

相關文章
相關標籤/搜索