如何系統地學習Node.js?

自己簡單的整理了下,有什麼不足或需要補充的嗎?
我想先較為詳細的羅列一下, 然後做個計劃學習Node,對於具體學習大家有什麼建議嗎?

- 包管理 Package Management: NPM

- 框架 Framework: ExpressJS
- 模板 Template: Jade
- 中間件 Middleware: Connect

- WebSocket: Socket.io

- 資料庫 Database: Mongo DB (選了個自己喜歡的)
- Mongoose (as a MongoDB ORM)

- 調錯 Debugging: Node Inspector

- 測試 Test: Mocha + should.js

- 控制無止境的內嵌回調 (Control the Callback flow): Async


你應該去學習node的核心,也就是node本身,而不是糾結於大量彼此沒有緊密聯繫的工具和庫。即使你想,你也不可能有時間去熟悉這些工具和庫。即時你有時間也沒有多大意義,因為他們不能幫助你加深對node本身的理解,你不天天用就很快會忘記。它們之間彼此的割裂和你要的「系統」學習並不一致。我建議你從簡單但核心的東西開始,我自己的經驗,如果你理解了核心,尤其是核心的概念(未必是語法和實現),理解整個生態系統的其他工具,庫,應用就很成竹在胸了。

起步:熟悉REPL
REPL Node.js
如果你沒有Javascript基礎,應該在這個時候用好REPL熟悉語法

常用調用
Global Objects / util

核心概念
Timers /Buffer / Events / Stream / Modules / Errors

在此基礎上再去練習

File System / HTTP

express,mocha,npm是node生態系統里的工具和應用,nodejs的實現才是你要學的nodejs本身,如果你一頭扎進無邊無際的工具和應用,幾年以後你都可能並不知道什麼是nodejs。你有很多機會去涉獵各種外部庫,應用,但初學寶貴的興趣和新鮮頭腦應該留給核心。

這些是講Node核心的書

Node.js in Practice

Node.js the Right Way: Practical, Server-Side JavaScript That Scales

Node.js Design Patterns


Youtube上有不少講node核心的視頻 https://www.linkev.com/?a_aid=itlr


以前學習 Node 儘管也能感覺到自己在不斷進步,但是直到使用 Node 完成了一些有意思的項目之後才算系統掌握 Node。

使用 Node 來寫 Web 方面的東西還挺有意思的,會碰到一些問題,在解決這些問題的過程中掌握 Node 是比較好的方式,因為掌握了本質的東西,再去學習工具相對輕鬆很多。

比如說要實現 Express 的功能,下面這些東西都很有機會接觸到:

需要使用 Net(Node.js v8.2.0 Documentation)來處理基本的網路請求與響應

需要使用 TLS(Node.js v8.2.0 Documentation)來處理 HTTPS 協議

需要發送文本文件時要使用 File System(Node.js v8.2.0 Documentation)

需要發送圖片時要使用 Buffer(Node.js v8.2.0 Documentation)

需要壓縮內容時,要使用 Zlib(Node.js v8.2.0 Documentation)

需要進行測試時,要使用 Assert(Node.js v8.2.0 Documentation)

需要記錄 log 時,要使用 Console(Node.js v8.2.0 Documentation )和 Process(Node.js v8.2.0 Documentation)

需要生成 Session 並存儲在 Cookie 時,要使用 Crypto(Node.js v8.2.0 Documentation)

需要處理路徑問題要使用 Path(Node.js v8.2.0 Documentation)

需要處理非同步問題的時候還得自己寫一個 promisify(Node.js v8.2.0 Documentation),當然現在 Node 已經原生支持這個函數

需要將程序拆分到不同模塊時,要使用 Module(Node.js v8.2.0 Documentation)

在這個過程中,Stream(Node.js v8.2.0 Documentation)的概念貫穿始終

比如說要實現 Request,還能接觸其他不同的東西:

除了 Net(TLS),DNS(Node.js v8.2.0 Documentation)、Domain(Node.js v8.2.0 Documentation)、URL(Node.js v8.2.0 Documentation)和 Query String(Node.js v8.2.0 Documentation)搭配使用會更加方便,當然有些自己實現也不難。

比如說要實現前後端分離,可能就不想使用 Net(TLS),而是選擇 HTTP(Node.js v8.2.0 Documentation)和 HTTPS(Node.js v8.2.0 Documentation),畢竟前面的項目足夠掌握好 Net 了,這個時候再換成 HTTP 花費不了什麼時間。

其實這幾個不算難,而且有很多現成的庫可以使用,但是想系統掌握 Node,肯定要深入學習 Node 的核心知識。

學習庫的用法可能見效快,更加容易收穫滿足感,但是最終還是要回來學核心知識的,庫變化很快,但是核心變化是很緩慢的。而且上面列出的這些掌握之後,學習庫也不會慢到哪裡去,哪天想學習其他語言,也是能遷移不少的。


(嗯..簡單說明一下,下面只是當初寫一個node小項目用到的東西,自己隨手總結了一下,學完這些,大概能從前端到後端自己隨手寫一些node的小東西,但想要深入學習node,下面是遠遠不夠的,別的回答里有一些推薦的深入學習的,推薦看一看~)
-----------------------------------------------------------------------------------------------------
Node:
1.《nodejs入門》,才38頁,很好,書中項目做一下,學會基礎

2.《nodejs開發指南》。180多頁,很好,書中項目做一下,知道基礎,及基本的配合express,jquery,bootstrap,資料庫MongoDB

另附一些node實現書中例子的一些變化使用Express3.0實現&

3.開始看express創建初始項目的源代碼對比2中的書,發現express更新後新的特性:Migrating from 3.x to 4.x · strongloop/express Wiki · GitHub

看express官網api

英文:Express 4.x - API Reference

中文:Express - api參考

4.之後發現,一個系列課程,從零開始nodejs系列文章:從零開始nodejs系列文章

其中 文章: Node.js開發框架Express4.x:Node.js開發框架Express4.x ,詳細介紹了express4項目的基本內容,很好

文章:用Nodejs連接MySQL:用Nodejs連接MySQL,介紹mysql與node基本,及資料庫連接池,宕機,連接超時等node問題解決辦法,node-mysql官網也有相應英文解決辦法

5.node+json:node.js裡面怎麼創建和解析JSON格式的文件?

更全的是這一個How to parse JSON using Node.js? 但要注意如果require json,只載入一次,更新之後,再使用,可能還是老版本

json不好查看的問題:讀寫 JSON 文件 · Issue #73 · zhanhongtao/blog · GitHub

6.node郵件驗證:Nodejs發郵件組件Nodemailer

選擇適合的Node.js授權認證策略

7.很全的node module Modules · joyent/node Wiki · GitHub

8.文件操作,要麼官方文檔:File System Node.js v0.12.2 Manual Documentation,

或者node基礎-文件系統node.js 文件操作,有一個要注意的是 存儲文件時,比如writefile寫路徑 要使用path.join(__dirname, 「相對於當前文件路徑」); 如path.join(__dirname, "../upload/recordList/" + generateID("record") + ".json");,後端要採用這種dirname的形式,前端可以直接寫相對於當前文件路徑的形式


node+express
1.整體介紹框架Express框架 -- JavaScript 標準參考教程(alpha)
2.express取值:使用 NodeJS + Express 從 GET/POST Request 取值
3.session+cookie:node.js web開發:EXPRESS 4.x 以上使用session和cookie 的記錄
express 框架之session express-session官網 npmjs.com 的頁面
Node.js Express 從入門到菜鳥(二)——Cookie+Session+三層搭建
express 4.2.0 使用session和cookies
在Express 使用session 做登錄控制
去掉flash之後,可以只用session,在每次post一開始 置req.session.error為null,之後,驗證過程中,檢查錯誤再設置req.session.error,然後根據結果redirect之後,檢測是否error為null,來決定是否展示
node session保存的只是中間鍵值對,不管賦予res.locals.user等,都不是對象,需要在中間件中重新生成對象,才能調用方法,當然如果只是使用屬性值,則不需要
4.express基本的中間件官方網站:senchalabs/connect · GitHub

node+mysql

1.node所用的mysql官網:felixge/node-mysql · GitHub

2.Nodejs學習筆記(四)--- 與MySQL交互(felixge/node-mysql)

3.用Nodejs連接MySQL

4.三種常用資料庫(Oracle、MySQL、SQLServer)的分頁之MySQL分頁

5.sq語句注意順序,order by group by limit..一般放在where後面


express+ejs

1.EJS學習總結 - 雙月通天的個人空間

2.EJS 模板快速入門

3.nodejs express template (模版)的使用 (ejs + express)_node.js 筆記

4.ejs我的總結:

ejs 寫法:

普通傳入並使用變數:&<%= title %&>
普通for執行js代碼(for中間的代碼一定可以執行到):
&<% for(var i=0; i& &&&<%= headerNavbar[i].name %&>&& &<% } %&>
特殊if語句的js代碼(if中間的額代碼不一定可以執行到):
&<% if(active=="index"){%&>
class="active"
&<% }%&>&>

jquery

1.jQuery 教程

2.jQuery工具方法 -- JavaScript 標準參考教程(alpha)

3.在線文檔-jquery

4.jQuery設計思想!!


jquery ui

1.jQuery UI

2.中文API:http://www.css88.com/jquery-ui-api/

3.jQuery UI 實例

4.jqueryrain神站:tabs:80+ Best jQuery Tabs with Examples

js tree 庫:15+ jQuery Treeview Plugin jQuery Tree with Example

jsTree

Bootstrap:

1.基本CSS樣式 · Bootstrap v2

2.全局 CSS 樣式 · Bootstrap 中文文檔 v3

3.bootstrap row等偏移-20px

4.補充:學會Twitter Bootstrap不再難 :從2.x升級到3.0版本


html5

1.drag:庫:interact.js - JavaScript drag and drop, resizing and gestures with inertia and snappingDragdealer.js 教程:HTML 5 拖放HTML5 drag drop 拖拽與拖放簡介 ? 張鑫旭


git:

1.Git:代碼衝突常見解決方法

2.使用WebStorm和Git開發Node.js應用

3.git生成ssh key及本地解決多個ssh key的問題 寫的非常清楚

4.Generating SSH keys


js:

1.對象本身方法,可以用於對這類對象的工具類方法,當作對象manager方法

對象原型中方法,用於每個不同對象實例的方法

2.Javascript非同步編程的4種方法 callback盡量寫成return callback()

3.JS對象類型的確定

4.js取屬性,一般用object.pro ,如果需要動態確定屬性,可以使用 object["dynamic"+pro],動態取屬性,包括session,雖然為鍵值對,但這樣也可以


json:

1.jquery操作:jQuery中讀取json文件

後端更新前端:

1.怎麼使用 JavaScript 將網站後台的數據變化實時更新到前端? - 前端開發

2.Socket.io在線聊天室

3.邁出nodejs的第二步,用nodejs+socket.io搭建一個websocket聊天室

4.使用Node.js實現數據推送

5.Automattic/socket.io · GitHub

6.Nodejs實現websocket的4種方式


RESTFul:

1.Pixelhandler"s Blog

2.理解RESTful架構

雜:

1. passportJS配置用戶驗證:PassportJS 配置失敗:req.user 未定義

Passport | Configure

2.回調函數:回調函數,就是放在另外一個函數(如 parent)的參數列表中,作為參數傳遞給這個 parent,然後在 parent 函數體的某個位置執行。理解javascript中的回調函數(callback)_javascript技巧

3.不再用的req.flsah():express 版本更新後遇到的問題
flash()

4.app.locals和res.locals 圖靈社區 : 閱讀 : express配置項more

5.Crypto加密解密:Node.js加密演算法庫Crypto

6.在 CSS 中如何使用百分比設置頁面 Div 高度? - 前端開發

7.HTML:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全詳解(轉載)

8.文件上傳的漸進式增強

拖動上傳 js庫:Dropzone.js

9.js diagram 需求圖:JointJS - the HTML 5 JavaScript diagramming library.

http://gojs.net/latest/index.html

10js 網頁分析:Google Analytics Official Website

11.js network網狀圖 ,時間線,2d,3d 庫:vis.js - A dynamic, browser based visualization library.

12.js fileManager:10 jQuery Based File Manager Plugins

在線富文本編輯器:RESPONSIVE filemanager 9.9.2(php tinyMCE)

推薦:Redactor Plugins輕量且美觀

13.小型:file explore:Kloudless/file-explorer · GitHub:可以實現從多處上傳,選擇文件

Cute File Browser with jQuery and PHP 美觀輕量但是需要jquery ajax php

14. js tree 庫:15+ jQuery Treeview Plugin jQuery Tree with Example

jsTree

15.messageBox 通知框 js庫:Bootbox.js—alert, confirm and flexible modal dialogs for the Bootstrap framework

16.【css】清除浮動(clearfix 和 clear)的用法

六種實現元素水平居中

17.button css庫:Buttons - 一個高度可定製的按鈕(button) CSS 樣式庫。

18.Html 解決長串英文字母顯示不能自動換行

19.非input元素使用focus等方法:讓元素獲得焦點

20.text file等在表單中同時上傳時,記得表單設enctype="multipart/form-data",否則可能拿不到數據,還有一個,ajax傳輸data,記得設置data-type為json,尤其jstree使用ajax傳輸節點

21.多文件,多圖片上傳預覽,進度等,可以用webuploader,busboy等

22.busboy nodejs+busboy實現文件上傳https://www.npmjs.com/package/busboy

23.前端字體:字體選擇_有字型檔

24.$("#btn").on("click",function(e){ e.preventDefaults(); or return false; })均能在表單提交之前阻止提交

24.404 not found 網頁設計真沒見識過,原來404錯誤頁面可以這樣設計

25.閱讀以 JavaScript 編寫的本地文件FileReader - Web API 介面 讀寫客戶端本地文件

26.chrome下 頁面退出時發送ajax寫法:

$(window).on("beforeunload", function ()
{
//this will work only for Chrome
$.ajax({
type:"GET",
url:"/ajaxRequest/myClassesOfteacherclose",
async:false
});
});

27.前端中下面兩個的$("a").text()是不一樣的,會計算空格

&關注&
&
關注
&

性能優化:

1.!!!毫秒必爭,前端網頁性能最佳實踐

2.HTML 5 應用程序緩存

3.Lazy Load Plugin for jQuery


持續更新~~


本課程由社區博主:Scott 編寫

本文通過提供給大家學習的方法,以及我個人錄製的一系列視頻,幫助你更快更好的學習 Nodejs,了解前後端的 HTTP 知識,以及配置和使用阿里雲 ECS 來部署你的 Nodejs 項目,成為那個具有爭議的全棧開發工程師。

要不要學習 Nodejs

如果你是前端開發工程師,你本地電腦上不可避免的要安裝 Nodejs,作為工具也好,作為伺服器也好,要幫助你做掉很多又臟又累的事情,比如 less/scss 的編譯,ES6/7 到 ES5 的轉換,Javascript 代碼的壓縮合併,切頁面調試樣式的熱更新,無論是通過社區迅速更新換代的 Grunt/Gulp/Webpack,還是通過自己集成或者定製到本地的其他模塊,Nodejs 的這個運行環境都是你得力的助手。

如果你是後端開發工程師,比如之前是開發 PHP,Java,最近轉行做 Nodejs 或者想要增加一個語言技能才來學習 Nodejs,你也不可避免的要去了解 ES5/6/7 或者說 Javascipt 的整個語法概念,去瀏覽 Nodejs 的各個 API,然後基於 Nodejs 之上的一些流行框架,比如 Express/Koa,甚至是阿里開源的 Egg,用你既有的後端開發經驗,對於 Web 服務層交互的知識,再套上這些框架的 API,來玩票性質的搭建一些子項目運行一些產品業務。

如果你是運營或者產品經理,但是你已具備一些基本的開發技能,比如 HTML/CSS/Javascript,甚至是對 Linux 主機的系統使用,域名解析也有一些經驗,你可能也更願意在不去學習另外一種全新的語言下,來藉助 Nodejs 搭建你的 Web 服務,幫你的小點子小創意快速上線測試,獲取一些用戶的反饋或者價值驗證,事實上我認識的不少產品經理對 Express/React/Vue 這些很喜歡,能高效的幫他們實現一些產品原型的測試。

以上舉例,是為了說明影響你漲薪也就是職業發展的其中一個因素,就是某項技能的深度,或者是某些技能的廣度,這些技能包含但不限於前端後端或者產品,不要給自己設限,從事某個工種不代表你只可以鑽研這個工種,就拿前端舉例,既然本地有了 Nodejs 的運行環境,那麼適度的往下擴展技能樹是順水推舟的事情,而對 Nodejs 很感興趣的無論任何職業的人來說,什麼時候學習它都不晚,因為整個互聯網經過幾十年的發展目前的現狀就是, Javascript 成為了 Web 層最容易入門使用且最被工業標準和廠商推廣的語言,掌握了這個語言,就掌握了 Nodejs 的 1/3,剩下的 2/3 分別是 HTTP 知識和 Nodejs 本身的運行機制和系統能力。

我在 2016 年被杭州芋頭哥邀請去大搜車做了個小分享,當時現場氛圍特別好,整個杭州甚至蘇州的許多做 Nodejs 的同學,其中超過 2/3 都是前端工程師,都跑來一起嗨皮,我之後又模擬錄製了一遍,對於 Nodejs 不熟悉的同學依然有參考意義,大家可以聽一下:

  • 創業公司的 Nodejs 工程師

Nodejs 與 Javascript 先學哪個

Java 和 Javascript 是雷鋒和雷峰塔的關係,而 Nodejs 和 javascript 可以簡單的看做是雷鋒塔和雷峰塔上的磚這樣的關係,雖然這樣比喻不夠準確。

掌握 Javascript 和掌握 Nodejs 並不衝突也並沒有絕對的先後順序,因為往往我們開始使用 Nodejs,是從 Web 的層面,而這個層面,我們有很多簡易入手的框架使用,比如 Express,即便不了解它的原理,以模仿性質的方式我們都可以通過閱讀文檔來編寫一個簡單的網站程序,然後基於這種迅速可見可得的體驗進一步激發我們學習的興趣,花更多的時間去從多維度反覆敲打自己對於 Nodejs 的知識結構,這樣一天兩天慢慢就理解它的知識點了,通過實際的手寫代碼,運行伺服器,看預覽效果,再去查文檔,寫更複雜的代碼,有些關鍵字不懂再去查查,這樣其實就是一個不斷反覆不斷倒帶學習的過程,說是學習,其實並沒有刻意的去啃 Javascript 或者 Nodejs 的語法和 API,而是自然的從工具使用走向理論構建的過程。

上面這段是面向非常初級的 Nodejs 學習者,如果已經有了其他語言的編程能力,那麼入門 Javascript 也不會有太大障礙,可以先去了解 Javascript 這門語言的特點,再去嘗試使用 Nodejs,在我看來,只要你對於 Javascript 和 Nodejs 是陌生的,那麼學習這兩個就是交替並行來回穿梭的過程,在去熟悉 Nodejs 的過程中,也就逐步的了解到了 Javascript 的語法規則,在研究 Javascript 的過程中,也就更容易領會 Nodejs 暴露出來的框架封裝出來的方法函數變數他們的使用姿勢和運行特點。

先看書看文檔還是先找項目練手

對於學習習慣不同記憶能力不同的人來說,看文檔和做項目哪個更優先,應該不會有標準答案,而且這兩個在中期以後往往是交叉的,我個人的學習習慣一般是,先做項目,如果項目太難,我就把項目中難的功能都去掉,梳理出一個最簡版本,以寫代碼為為主,以看文檔作為補充,比如白天或者核心時間寫代碼,午間或者公交車上這些零碎時間翻文檔,可以有目的的看,也可以隨便挑幾個感興趣的看,這樣做的缺點是,在項目一開始啟動的時候,會因為不熟悉文檔,走一些彎路而且比較耗腦力,它的優點是,一開始就寫代碼有作品雛形出來,容易激發我征服它的鬥志,更有慾望把它做出來,所以這樣開始的方式,往往我都不會中途放棄,而看文檔的方式,我會覺得枯燥,或者不知所云,可能看看就困了放棄了,這種不太適合我,但是它的優點也很明顯,如果充分的看了文檔,基於原作者或者原始團隊的角度理解技術點,更容易一開始就走在正確的道路上,無論是名詞還是原理或者 API,心中會很有方寸,做項目的時候也容易推測出來出問題的環節去哪裡找答案。

對於新人來說,先把項目做起來會比較實用,走彎路和踩的坑必然會多一些,但是這樣更容易產生興趣把硬骨頭啃下來,也會提高解決問題的即時反應能力,所謂臨陣不懼,運籌有度。

哪裡找練手項目

練手項目從觀看類型上分兩種,一種是純文字形式的,比如連載的博客,一種是視頻,或者是直播或者是錄播的視頻,連載的博客好處是都形成了文字,並且有代碼示例,看的時候可以用腦力集中消化某一個技術點,容易看懂,這同時也是它的一個缺點,因為博客中不同的技術點都用大腦消化後,就會產生一種已經理解了它的直覺,這種直覺會促使你快速的通讀全完直到最後,所有的編程環節卻沒有動手實施,導致過了三五天後再來回想這些文字和當初所理解的概念,腦海中就會印象模糊甚至一片空白,用行話說就是沒有把消化後的知識持久化。

直播的視頻對個人的時間要求比較嚴格,同時直播中不能暫停甚至不能提問,會導致自己被動的 Push 往前走,容易遺留下一些關鍵的問題點沒有及時消化,不過現在有的直播平台會自動存儲有備份,所以也可以重播。

我個人傾向於看錄播的視頻,可以暫停,可以快進,可以重播,跟著屏幕敲代碼大概是目前最好的一種跟隨實戰的方式了,錄播的視頻這方面有很多的學習平台,我自己平時是泡在慕課網,雖然我也是講師,但是我也經常聽別的講師講的課程,收穫還是挺大的。

如果你對 Nodejs 已經有一定的掌握了,那麼其實可以跳開一些簡單的博客啊視頻啊,直接上 Github 上搜一些別人開源的 Github 項目,Clone 到本地,跑起來,再去讀他們的源碼,這是最直接也最有效的學習方式了,但是這個對於初學者往往比較難,因為閱讀源代碼的前提是要有一定的編程量,上來就一通讀不僅會增加理解項目的難度,更會因此失去閱讀代碼的興趣。

我下面會羅列一些,我自己錄製過的一些項目,或者其他的我覺得可以按照這個路線繼續深入學習的項目資源。

Express 實現一個電影網站

在我入行的那個年代,一般編程的第一個練手項目,往往是一個增刪改查的博客系統,或者是一個聊天室,這方面資源很多,但是我個人覺得起點略低而且提不起興趣,於是就錄製了一個開發電影網站的免費視頻課程,課程地址如下:

  • Node+MongoDB 建站攻略(一期)
  • Node+MongoDB 建站攻略(二期)

這兩個課程,是採用 Nodejs+MongoDB 外加一些必要的中間件,比如 Mongoose 建模,body 解析,Jade 模板等等,有前端的頁面也有後端的頁面,有註冊登錄也有密碼的加鹽設計,後端這裡也有管理員的角色,請求豆瓣數據寫入資料庫包括評論的數據結構和評論流程的實現,算是一個五臟俱全的小小麻雀。

課程中用到的 Express 框架,需要理解 req 和 res 兩個跟業務密切相關的知識點,一個是數據流進,一個是數據流出,然後就是 Express 的中間件機制基本是基於回調或者是基於事件的,這些都是在跟著把代碼全部實現後就能理解的東西,一開始不用太糾結細節,先關注流程就行,同時因為數據存儲用到了 MongoDB,項目中也使用了 Mongoose 來配置和鏈接資料庫,來設計每一個數據模型的 Schema,可以理解為表的概念,另外由於課程錄製的比較早,大家要特別留意版本,在 2 期課程中有一個補錄的升級課程,可以在一期的學習中,跳過去看升級再回過頭看。

或者如果不喜歡 Scott 早期課程的聲音或者講解的方式,也可以直接看下面的這個課程,裡面有許多小例子,跟著敲代碼不累。

Nodejs 的基礎概念和 API 講解

這個是純面向新手的課程,地址如下:

  • 進擊Node.js基礎(一)
  • 進擊Node.js基礎(二)

在這兩個課程中,我嘗試了新的錄製風格,但同時也導致了錄製的時候,描述過於逗比不夠嚴謹,還好很多看過的童鞋們還都表示很有收穫,看來激起學習興趣的確是所有市面的博客也好,視頻也好都要去提升的一個點。

用 Nodejs 開發微信公眾號

在微信公眾號推出的那個風口,滿大街都在找能開發微信公眾號的工程師,而且由於公眾號本身與微信打通的鏈路和易傳播性,H5 工程師成了各個類媒體公司和創業公司的標配,但是微信公眾號由於它的特殊性,需要前後端協作完成,並且需要通過微信的官方伺服器進行消息的分發和中轉接收,給很多公司是前端後端同學帶去困擾,增加了協作的成本,於是具備 Nodejs 開發能力的前端工程師在市面上備受歡迎,因為 Java/PHP 這種傳統後端可以賦予公眾號純數據的介面調用許可權,而多變的業務邏輯則可以由前端自己通過 Nodejs 來自由控制,同時微信公眾號裡面的消息和跳轉的頁面自己都能完全控制,於是 Nodejs 微信開發工程師往往通過一兩個人的配合,就能極高效率的完成公司在微信端的的業務實現,涉及到複雜數據或者大體積數據存儲的部分,仍然可以交還給 Java/PHP 工程師來負責,從公司層面,產品做的更輕更快而且人員成本上也更省錢,從個人層面,對於產品研發的流程也更有控制權,同時個人也更有競爭力更值錢。

在現在,公眾號依然是很多傳統公司走向互聯網化所優先考慮的方向,加上小程序的推出和一系列附加能力的擴展,這兩個可以很好的協作來拉新和轉化,現在具備 Nodejs 在微信的使用層面,依然是有很大的成本優勢。

於是響應慕課網的需求,推出了這個收費的視頻課程:

  • Node.js 七天搞定微信公眾號

在這個課程裡面,把上面的電影網站,進行了大刀闊斧的升級改造,基於原來的登錄註冊後台上傳這些功能外

  • 把原來的 Express 框架也切換到 Koa 框架
  • 利用 yield 來做非同步操作的執行
  • 從零開始封裝微信中間件
  • 深入到最底層的請求邏輯
  • 微信第三方介面調用過程
  • ES2015 新特性使用(Promise, Generator)
  • 充分理解 http 請求和實現二跳換 token 請求
  • ...

讓這個微信公眾號,本身可以響應用戶的消息,比如上傳圖片/視頻,文字自動回復,電影的檢索和數組消息推送,還可以在公眾號裡面跳到電影網站的手機版本,裡面可以調用語音 SDK 進行搜尋,可以基於微信的 openid 進行用戶註冊和評論等等,這時候原來那個電影網站的小麻雀就變成了一隻犀利的老鷹,能對微信用戶提供更豐富的功能和體驗,而這一切的背後,僅僅是 Nodejs+MongoDB 外加 Koa 框架的支撐。

React Native App 開發

React 問世以來,特別是 React Native 問世以來,整個前端世界再一次陷入了變革狂潮,用聲音或者行動宣示要搞事要運動,因循守舊的工程師被動主動的被淘汰,因時制宜的工程師和大量的前端新人,踩在老人的屍體上大步前行,無論承認與否,互聯網世界一天天變得更豐富多彩,技術的圈子亦然,變革的速度快慢不重要,基於變革而能及時上車的勇氣很重要,無論是 Microsoft,Facebook,Google,Instagram,還是 Alibaba, 騰訊,地球上的一線大公司的一線牛人,在過往的幾年中,開源了巨量的框架,尤其在 Nodejs 和 React Native 方面,也都有了許多實踐和改造,給許多的中小公司帶去更多的信心,有了更多的選擇。

開發 App 就是這樣,世界不再是過去的非 Object-C(Swift) 即 Java,也不再是犧牲性能追求效率的 Cordova 和 PhoneGap,而是有了介於二者直接的 React Native,更多的養不起兩個不同語種工程師的小公司和創業公司,開始眷顧能適應兩個平台,且能滿足自己業務和展現需求的 React Native,而開發一個 App 並不簡單,除了肉眼可見的前台,還有作為純 API 介面的後台,前後之間依然有種種的門檻,這時候 Nodejs 的輕便就又派上用場,具備 Nodejs 開發能力的 React Native 工程師,到今天為止依然是香餑餑。

還是順應潮流,結合慕課網推出了這個課程,同時慕課網的官方設計師負責給 App 出插圖潤色,不過這個課程是收費的:

  • React Native貫穿全棧開發App

在這個課程中,先撇開 React Native 這個純 App 端展現的部分,整個後端是用 Nodejs 開發的,框架依然是 Koa,涉及到了用戶 token 生成獲取,簡訊驗證碼,無後台的 Mock 數據,以及基於 MongoDB 的 Restful API 服務,對於音頻視頻資源的轉碼和合併都是在後端完成,裡面涉及到大量的非同步操作,對於一個初級和中級工程師,有非常好的實戰借鑒意義。

上面發了都是我的個人作品,下面提供下其他的我認為學習 Nodejs 需要投入時間研究的知識或者方向;

培養英文讀寫提問的能力

有句話怎麼說,編程三分靠資歷,7 分靠 Google,大部分你在業務場景中遇到的技術問題,在網上都有現成的答案,問題是你不知道用什麼關鍵詞去搜出來,這個還是比較考察英文的表述能力,這些最前沿的技術,都是老外們實踐出來的,我們的腦迴路也應該在編程之外,多適應一下英文的思考方式,多逼自己閱讀英文技術文檔,隨著時間慢慢就能習慣,只要解鎖了英文的這把枷鎖,就打開了新世界的大門,無論是從檢索和閱讀角度,還是從提問參與的角度。

關注 Github 倉庫 Wiki 和產品榜單

我們上 Github 的時候,往往會很關注熱門的框架庫,那麼這些框架庫里往往蘊含著更有參考價值的寶藏,那就是 Wiki,比如 Express,在它的 Wiki 裡面,除了有 Express 的升級指南,中間件列表之外,還有一個 Frameworks built with Express,什麼意思呢,就是很多團隊或者個人對 Express 不夠滿意,或者自己的場景更特殊,Express 不能滿足,他們都基於 Express 這個框架基礎或者思想來構建了一個新的框架,這些新的框架,都的基於他們的需求或者他們認為合理的方向來實現的,這些框架的源代碼包括文檔,大家在學習 Nodejs 的時候,可以好好研究一下,能學習到更多他人在設計框架時候考慮的方向,實現的方式,比如這些:

  • Feathers -- 一個迷你的數據驅動的框架
  • Monorail.js -- 一個極輕量級的 MVC 框架
  • Locomotive -- 受 Ruby on Rails 啟發而開發的強大的 MVC 框架
  • CompoundJS -- 同樣是受 Ruby on Rails 啟發的高水平 MVC 框架
  • Calipso -- 基於 Express/Mongoose 的內容管理系統
  • Derby -- 一個實時的協作應用框架
  • Bones -- 基於 Express/Backbone 實現的 CS 應用框架
  • Matador -- Twitter 工程師開發的 MVC 框架
  • Lemmy -- 一個不可描述(爆粗口)的神秘框架
  • Mojito -- Yahoo 開發的 MVC 框架

綜合比較一下,就能找出更適合自己用的框架,等到對框架足夠熟悉的時候,就可以去閱讀他們的 issues 甚至是源代碼,看的多了想的多了,就越來越上道了。

全棧的最後一公里

全棧這個詞很敏感,有人不認同有人無所謂,對我而言,它就像是一個 H5 工程師一樣,只是表述了一種印象或者概念,具體嚴謹與否不重要,因為跟人溝通,心領神會即可不必強究細節。

那麼在學習 Nodejs 的過程中,有一道門檻是無論如何也逃不過去的,那就是 伺服器的選購配置,域名的解析指向,Nodejs 項目的部署等這些偏運維方向,這些讓很多新人甚至是已經工作的工程師困擾,自己去琢磨太花費時間,不去琢磨,始終沒有能力憑自己雙手,讓一個產品上線或者讓自己的一個想法實現到互聯網上,不論是成為獨立站長,還是只是讓朋友同學訪問,於是我把這些總結了一下,以以上幾個項目為例,大概分為如下幾個步驟:

  • 部署方案規劃
  • 待部署項目分析
  • 選購及備案域名
  • 廠商對比與選配阿里雲伺服器
  • 初步 SSH 無密碼登錄連接和配置
  • 搭建 Nodejs/MongoDB/Nginx 環境
  • 配置 IPTables/Fail2Ban 防火牆及主動防禦
  • 域名 DNS 轉移及 A 記錄/CNAME 解析配置
  • MongoDB 角色配置與安全規則設置
  • 線上 MongoDB 單表單庫導入導出與跨機遷移備份上傳
  • PM2 發布環境配置
  • 伺服器與 Git 倉庫讀寫配置
  • PM2 一鍵部署線上 Nodejs 項目
  • 電影網站/ReactNative App 後台/微信公眾號/微信小程序後台等項目實戰部署
  • SSL 證書申請及 Nginx 證書集成提供 HTTPS 協議
  • 上線方案復盤總結

後記:

我從業 7 年,前 4 年在阿里巴巴做前端開發工程師,開發全網的通用創意模板,近 3 年在創業公司擔任技術負責人,也就是聽上去高大上的 CTO,我職業的前 6 年月工資不到 1 萬 5,最近一年才調薪過 2 萬,我選擇了一條荊棘的跨專業自學入行之路,之後又創業,彎路多多踩坑無數,希望從我的親身經歷中,大家可以對自己有更準確的定位和投資,掌握更好的技術/職業上升的方法,我走過的彎路不再是束縛你的套路。

更多技術好文,請關註: 我是程序員 - 知乎專欄

—————————————————————————————————————

系統學習Node.js,得先了解為什麼需要Node,在Node 誕生之前,在服務端運行JavasScript 是件不可思議的事情,並且對其他的腳本語言來說,要實現非阻塞I/O 通常需要依賴特殊的類庫。但Node 的出現改變了這一切。假設你正在開發一個廣告伺服器,每分鐘需要發布幾百萬條的廣告。Node 的非阻塞I/O將是一個高效的解決方案,因為伺服器能夠最大限度地利用到所有的I/O 資源,而這一切不需要你寫特殊的底層代碼。並且,假如你已經有一支會寫JavaScript 的開發團隊,那麼他們應該可以直接參与到Node 的項目中。我們為什麼使用Node-博客-雲棲社區-阿里雲


如果沒有javascript基礎建議先看「Eloquent Javascript」,篇幅不太長,可讀性又比犀牛書好很多。

然後是nodejs的書,個人感覺剛開始接觸的話看書不是很好的選擇。之前曾經看過leanpub的nodejs入門和一點smashing node,感覺這些書上來就從架設http伺服器開始是有點跑偏了。nodejs剛發布時展示的就是一個http伺服器,包括現在nodejs官網首頁例子也是這樣。但如果你之前沒有用其他語言做過伺服器,理解例子里那些架構的內在邏輯和如何進行自己的變通不是一件容易的事。更何況很多人根本不需要架設伺服器。

後來我上了 http://nodeschool.io,跟著推薦教程完成了node基礎和streaming的所有練習,才覺得豁然開朗了。nodejs原本就是關於io的語言,fs/stream/buffer 這些才是基礎,而不是http。

後來學了gulp,就可以拿來做各種各樣的項目構建工作了。gulp中可以很方便的使用各種npm包,研究這些包的源碼,了解了大量nodejs原理和實戰方式。這之後再看深入淺出nodejs之類的書,系統的補完知識結構。

本人仍然是業餘水平的程序員,javascript菜鳥。只是從個人經驗出發,這樣的方式可能算不上系統,但希望能幫助和我一樣完全的新手入門吧。


你需要先掌握JavaScript語言本身。

掌握JavaScript並不是會用jQuery做兩特效,而是JavaScript語法、各種坑、原型繼承、函數、this作用域、map/reduce、regex等,緊跟ES6標準,適當追蹤ES7的腳步。

掌握JS精髓是知道哪些代碼好,哪些是炫技的垃圾代碼。

其次,掌握瀏覽器DOM概念、基本操作、HTTP協議、AJAX、表單等;

接下來,才是學習jQuery,因為它只是幫你更好地使用JS;

再往後,學習Node.js,就要學伺服器端開發能力:

基本開發環境:Node+npm
基本模塊:fs/stream/http/crypto

然後,學習Web開發基本概念:
MVC模式,鏈式處理,模版引擎

什麼?你還在學express?JS的發展一年相當於十年,koa3都要發了,現在必須得上koa2
非同步處理要跟上節奏:callback(負分)→ async庫(及格)→ generator → Promise → async/await才是終極方案

有人吐槽koa中間件少,暈,隨便一個express中間件10分鐘改造成async函數好不好?

接下來要學如何操作資料庫:
SQL基礎,MySQL操作,ORM框架
Mongo之類的忽悠人可以,線上還是老實用MySQL

再往後,還有:

寫單元測試:Mocha;
寫WebSocket;
寫MVVM:Andrular要不要上2?
用Webpack打包;
學React/React Native
……

真是從前端、後端再到移動端,除了操作系統和驅動你不會寫,其他基本都會了。

實話實話,你在網上隨便搜的JS文章/教程,質量都呵呵。

那麼,去哪找這麼完整而又高質量的JavaScript全棧教程呢???










JavaScript全棧教程!

猛擊 → JavaScript教程 ←


我覺得如果要學習nodejs,除了上文說到的javascript本身以外
首先要對http協議比較了解,學習處理請求與響應,各種header頭,session cookie gzip等,也要對後端的增刪改查操作熟悉,還要了解並發,性能之類
也要懂的開發中 mvc開發,restful介面設計之類的概念
還要習慣一些操作中非同步的寫法,比如讀取文件,讀取資料庫等
還要了解一些概念,比如buffer,stream等
你發的那些都是些工具,用的時候查查api就行了。


牆裂牆裂牆裂推薦一個課程:玲瓏學院_玲瓏課程,講師妹紙的聲音很好聽 ?(///▽///)?,咳咳,更重要的是講的比較清晰,我已經入坑了,現在好像已經更到了CMS…

還有一本書:《深入淺出Node.js》
出自國內阿里大神朴靈的大作, 國內最好的 Nodejs 書籍,沒有之一。同時也是第一本深度講解 Node 的圖書,想要深入了解Nodejs 的同學不能錯過啊~


需要系統學習的是Javascript本身,其它你羅列的,都是工具和庫而已,把Javascript搞熟了,這些掌握起來都好說。

我個人覺得把主要的精力投注在JS本身上是回報率最高的做法。


恰好自己最近也在寫一本Node.js的教程,順便貼出來獻醜了,鏈接地址:yunnysunny/nodebook

本書的結構如下:

  • 如果你之前有socket和多線程的編程經驗,可以看第1章,沒有上述經驗的編程者也可以閱讀此章,只不過在閱讀過程中可能會遇到概念一時半會兒理解不了。
  • 如果之前沒有接觸過 javascript 這門語言,可以從第2章開始閱讀,第2章講述了一些 javascript 的基礎語法。
  • 如果之前接觸過 javascript ,但是沒有接觸過 Node.js ,可以從第3章開始閱讀,第3章講述了一些 Node.js 的基礎 API。
  • 如果之前接觸過 Node.js ,但是沒有用過資料庫操作,可以閱讀第5章,第5章講述了 Node 中操作 redis 、mongodb 的 API 如何使用;如果沒有使用 express ,可以閱讀第6章和第7章,這兩章講述了如何利用 express 這個 HTTP 編程框架。
  • 最後介紹一下一些獨立章節,第4章講述了 npm 命令的使用教程;第8章講述了如何使用單元測試框架mocha;第9章講述了一些線上環境的最佳實踐,包括配置文件、進程管理、 docker 等內容;第10章講述如何編寫 c++ 擴展。

最後希望這本教程在大家學習 Node 的過程有所幫助。早日成為一個合格的Node開發者。


其實問問題的這個同學提出來的這些工具是和node 不可分割的。 node是個生態體系, 學習node 就不能離開這個生態體系。 從這個前提來講, 這些工具其實就是node 的擴展。
我個人覺得從大面上先把握這些工具, 從開源網站上一些已有的高品質的項目直接出發去整體學習node app 的一個完整的流程, 效果要好於立刻從JS紮下去學習。 因為學習一樣東西, 從頭開始搭建一個完整的項目對初學者是很困難的, 很容易導致挫折和放棄。 而從一個已經搭建好的成功的項目, 庖丁解牛,改一改, 看一看會怎麼樣, 這樣會一直保持興趣, 會有很好的成就感。 而且一個好的項目裡面有很多很好的practice. 耳濡目染, 自己再開始寫的時候起點也高。
但是在一定的時候紮下去學習一下JS還是必要的, 我覺得3-4個禮拜足矣。 不是說3-4個禮拜就可以成為高手,是花這個時間去學習之後, 就要開始在實踐中更深入的學習。


計劃和實踐同時進行的吧。而且就前期來說,建議過實踐,不怕錯。實踐中學習是效率最高的一種方式。

編程這東西,不必要列份表單然後全部看一遍才開始動手。

最建議的是,幫自己訂一個簡單的目標工程,然後完成它。在完成的過程中,發現自己知識的某方面不足,再針對性的補一補。

所以我覺得在題目中的技能列表之外,題主還需要幫自己列一份循序漸進的練手項目列表。


有比官方文檔還系統的嗎?


PS: 假如一開始啃不下去,可以先看《了不起的nodejs》入門,然後再去閱讀官方文檔。


整這些沒用的。
學node就是學後端那一整套東西。
所以,無論你想什麼辦法,用node寫個文件上傳介面就差不多了。

會涉及到幾個核心的模塊:http,fs,stream。

會涉及到幾個後端開發比較常見概念:

請求頭解析

響應頭設置(這裡一定會接觸到http規範)

請求體解析(非常重要)

臨時存儲,數據流等


我覺得樓主總結的不錯了。
個人更喜歡自己寫框架玩,一邊看現有框架的源碼,一邊按照自己的想法擴展,慢慢就熟練了。


一個字,實踐!拿項目實踐!
用工具調試,比如node-inspector +chrome!


寧可用PHP的思維,也別拿前端思維來思考Node.js,這是另一個JavaScript 世界,別被前端思維坑了!


入門我手頭有一本:Node學習指南 (豆瓣),還湊合
進階必須啃下兩本書:深入淺出Node.js (豆瓣),JavaScript非同步編程 (豆瓣)
了解官方 API 文檔,知道有哪些 API 可以用
剩下的就是找個感興趣的項目,不會的 Google 就行了~


個人感覺樓主不是科班出身,當然沒有瞧不起的意思,我也是半路出家。我的建議是再學node之前,先夯實基礎,比如網路信息的書籍過一遍,然後實際一點HTTP,Restful,Ajax原理,然後有機會學後端架構,比如學.net MVC webAPI什麼的。現在在公司用.net技術棧,也照貓畫虎寫過Full stack story。感覺node 很像controller,還有一部分model. 只要樓主大致看過真正後端怎麼寫,nodejs就不會難,現在很多教程都是前端寫的,畢竟有可能寫的不好。在具體就是沒必要學http://socket.io 完全可以express解決


嗯,題主應該說的是後端開發,不是 Node.js,鑒定完畢。

貼個 Node.js 的學習路線:

1.《JavaScript 權威指南》

2.《Node 學習指南》

3. 《深入淺出 Node.js》(可以開始寫模塊了,是不是有點小激動)

4. 定個小目標,先寫它 100 個模塊,最好有 100000+ 的下載量(平均下來一個就 1000+ 的下載量而已,為了滿足自己的虛榮心也可以寫個爬蟲每天挨個下一次哈哈哈)

5. 相信現在的你已經是個 Node.js 高手了,可以在社區虐虐小朋友了,那成就感簡直不言而喻

6. 慢慢地你發現 API 已經沒什麼意思了,總想搞點新花樣,可以開始玩玩 V8、libuv、openssl 了

7. 玩了一段時間之後發現 %#$ 自己的 C++ 是 JavaScript 老師教的,又去買了本《C++程序設計語言(特別版)》回來惡啃

8. 覺得好像自己又行了,再玩玩 V8 還真 %#$ 的玩出火了,膨脹了一下下

9. 開始搞事情了。天天去 node 的倉庫修 bug,修著修著修進了 Node.js Foundation,再度膨脹

10. 跟著項目組玩久了好像不怎麼刺激了,畢竟項目組也是跟著 Ecma TC39 的屁股走,什麼 Argon、Boron、Nightly Built 都不過癮了,開始寫個 X某人特別版,用戶反響奇好,沒準就變成 Node.js 8.X 了,瞬間功成名就

然後沒有然後了,快逃~~~


我不是技術,我就想來問問node有這麼小眾和難學么?

我們公司是火球買手,在杭州,技術架構都是用的node,發現要招node的技術人員太難了。

現在工資開到30-50k了,三個多月一個人都沒招到。。。

已經打算換語言了,node實在是人才緊缺。


推薦閱讀:

如何看待 TJ 宣布退出 Node.js 開發,轉向 Go?
如何評價 Riot.js?

TAG:前端開發 | JavaScript | Node.js | 前端工程師 |