産品特色
編輯推薦
適讀人群 :適閤未接觸過Node的讀者以及在校的學生閱讀,也適閤作為高等院校和培訓學校相關專業的師生教學參考 從零開始學習開發完整可用的項目,掌握語言細節並獲得實際經驗
以實際應用為背景,闡述Node.js在實際項目中的定位和潛在的陷阱
適閤沒有Node.js經驗的讀者,旨在快速上手到獨立開發小型應用
內容簡介
Node.js是一門開源的、為Web而生的語言,具有高並發、異步等特點,並且擁有一個十分活躍的開發者社區。與Ruby、Python等語言相比,Node.js更年輕、更易於沒有經驗的人上手使用,因此很快在世界各地的開發者中收獲瞭一大批擁躉。在國內,Node.js在許多企業中獲得瞭廣泛應用,並取得瞭一係列的應用成果。然而,隨著技術的不斷更新、ECMAScript2015等新標準紛紛確定,現有的中文書籍就變得有些過時。本書立足於新的技術潮流,介紹瞭一係列全新的語言特性和標準,以便讓讀者在學習基礎知識的同時緊跟新技術的發展。
《新時期的Node.js入門 Web前端技術叢書》分為8章6個附錄,講解瞭Node.js的各種基礎特性,使讀者快速入門,同時結閤語言*新的發展趨勢,讓讀者能夠緊跟技術潮流。本書圍繞Node.js在Web站點開發和爬蟲係統中的應用展開,《新時期的Node.js入門 Web前端技術叢書》可用於Node.js入門,適閤未接觸過Node的讀者以及在校的學生閱讀,也適閤作為高等院校和培訓學校相關專業的師生教學參考。
作者簡介
李鍇,畢業於廈門大學軟件學院,目前就職於花旗集團,從事Web前端開發工作。
目錄
第1章 基礎知識
1.1 Node是什麼
1.1.1 Node與JavaScript
1.1.2 runtime和VM
1.2 Node的內部機製
1.2.1 何為迴調
1.2.2 同步/異步和阻塞/非阻塞
1.2.3 單綫程和多綫程
1.2.4 並行和並發
1.3 事件循環(Event loop)
1.3.1 事件與循環
1.3.2 Node中的事件循環
1.3.3 process.nextTick
1.4 總結
1.5 參考資源
第2章 常用模塊
2.1 Module
2.1.1 JavaScript的模塊規範
2.1.2 require及其運行機製
2.1.3 require的隱患
2.1.4 模塊化與作用域
2.2 Buffer
2.2.1 Buffer的構建與轉換
2.2.2 Buffer的拼接
2.3 File System
2.4 HTTP服務
2.4.1 創建HTTP 服務器
2.4.2 處理HTTP請求
2.4.3 Response對象
2.4.4 上傳數據
2.4.5 HTTP客戶端服務
2.4.6 創建代理服務器
2.5 TCP服務
2.5.1 TCP和Socket
2.5.2 創建TCP服務器
2.6 更安全的傳輸方式——SSL
2.6.1 什麼是SSL
2.6.2 SSL原理
2.6.3 對稱加密與非對稱加密
2.6.4 關於CA
2.6.5 創建HTTPS服務
2.7 WebSocket
2.7.1 保持通話
2.7.2 為什麼要有WebSocket
2.7.3 WebSocket與Node
2.8 Stream
2.8.1 Stream 的種類
2.8.2 ReadLine
2.8.3 自定義Stream
2.9 Events
2.9.1 事件和監聽器
2.9.2 處理error事件
2.9.3 繼承Events模塊
2.10 多進程服務
2.10.1 child_process模塊
2.10.2 spawn
2.10.3 fork
2.10.4 exec和execFile
2.10.5 各方法之間的比較
……
第3章 用ES6來書寫Node
第4章 書寫異步代碼
第5章 使用Koa2構建Web站點
第6章 爬蟲係統的開發
第7章 測試與調試
第8章 Node中的錯誤處理
附錄A 進程、綫程、協程
附錄B Lua語言簡介
附錄C 從零開發一個Node Web框架
附錄D MongoDB和Redis簡介
附錄E 使用Docker來實現虛擬化
附錄F npm與包管理
前言/序言
前 言
國內Node的開發者很多都讀過樸靈寫的《深入淺齣Node.js》(以下簡稱《深入淺齣》)一書,筆者也不例外,筆者在2014年初第一次接觸Node,最初讀的幾本書就包含瞭這本《深入淺齣》,該書齣版於2013年12月,距今已經差不多有4年的時間瞭。
對於一門高速發展的語言來說,4年算得上很長的時間瞭。4年前Node的版本號還在0.10.x,而時至今日,已經迎來v8.0.0的最新版本瞭。
Node項目始於2009年,2013年恰好處在當今(2017年)和2009年的中間節點,一門語言在誕生之初的發展總是最快的,到瞭現在,Node逐漸地變得穩定下來。
但即使這樣,這4年中也發生瞭不少大事件:Node從分裂又走嚮瞭統一,ES2015標準的推齣等。
那麼4年後的今天,Node有瞭哪些改變呢?
一方麵,基本的概念幾乎沒有改變,底層的libuv和事件循環還是原來的樣子,主要模塊的API也沒什麼大的變化。
另一方麵,變動最多的大概是語法瞭,ECMAScript沉寂數年之後,終於推齣瞭重量級的新版本ES2015,並且計劃每年發布一個新版本。
換個角度來說,如果現在有一份使用Node最新版本寫的代碼,拿給還在使用0.10的開發者看,最大可能是對裏麵各種奇怪的關鍵字和語法感到疑惑。這本身就說明瞭Node發生瞭如此大的變動。
在筆者看來,Node的發展進入瞭平颱期,這意味著在一段時間內,Node將維持現有的模樣,或許會增加或修改一些語法,底層的V8也可能做一些大幅度的改進,但代碼的基本結構不會有大的變動。
Node的發展大緻分為幾個階段:
? 第一個階段:從誕生到分裂,大緻5年的時間。
? 第二個階段:從與io.js閤並到ES2015標準正式落地,隻有不到半年的時間。
? 第三個階段:從v6.0.0全麵支持ES2015至今,Node較大的更新都是圍繞著新的ECMA201x標準展開的。
所有的新與舊都是相對的,雖然在目前來看,本書記述的內容還算是比較新的,無論是ES201x的使用,還是Koa2框架的介紹,都屬於同類書中較少涉及的領域,但要是再過幾年的時間,本書的內容也會變得過時。
本書定位
關於本書的定位,筆者著實費瞭很大的腦筋,齣版社老師建議我寫一本入門書,當我知道的時候其實內心是很猶豫的:一方麵,Node的入門書籍市麵上已經很多瞭,隨便翻開一本,不論是裏麵的內容還是章節編排都大同小異;另一方麵,入門書反而是最難寫齣水平的,因為作者們大多已經有瞭相關領域的編程經驗,那樣就很難站在入門者的角度來進行寫作。
經過考慮之後,我決定寫一本《新時期的Node.js入門》,一方麵能夠讓本書立足於最新的技術潮流,另一方麵對於ES201X又或者是Koa2來說,它們誕生的時間不長,筆者也不敢說自己對這些新的技術和標準已經有瞭豐富的編程經驗(之前使用最多的還是ES5語法和Express),正好也能站在一個入門者的角度來審視這些新技術。
本書的定位是一本新時期的Node入門書,關於“新”在哪裏?一方麵是內容的“新”,新的標準已經齣現,怎麼能夠停滯不前!ES2015帶來瞭不少新的語言特性,它讓之前需要花不少工夫纔能解決的問題變得輕而易舉。另一方麵,本書不想重復介紹同類書籍已經反復介紹的內容,例如Express框架的使用,在市麵上翻開任意一本Node的入門書籍,都會不厭其煩地嚮讀者教授Express的各種用法,作為代替,本書推薦瞭Koa這一框架作為入門介紹,它更貼近新標準。
除瞭“如何使用”之外,本書還會兼顧Node底層的原理,讀者大可在第一遍時跳過這些內容,當對Node有瞭一個大概的掌握後,會自然而然地想去瞭解其背後的原理。
關於本書內容
本書不是一本ES2015或者更新標準的說明書,也不想讓內容停留在介紹各種模塊的API羅列上。
第1章講解Node的運行機製,主要是底層的一些實現和通用的原理,可能需要一些操作係統的知識。
第2章介紹瞭通用的模塊和使用方法,是真正的入門章節。
第3章專注於新的ECMAScript標準以及Node對其的支持。
第4章主要介紹如何更好地組織和書寫異步代碼,采用循序漸進的方式介紹瞭各種解決方案的優劣之處。
第5章使用Koa2框架來開發一個Web應用,涉及Web開發的各方麵,例如路由處理、Session、頁麵渲染、數據存儲等。
第6章介紹瞭如何使用Node來開發一個爬蟲係統。
第7章介紹常用的測試方法以及調試Node應用的技巧。
第8章介紹瞭Node中錯誤處理的相關知識。
附錄A介紹進程、綫程和協程的概念,屬於拓展的背景知識。
附錄B Lua語言簡介,Lua幾乎可以認為是某些概念的最佳實現,例如協程。
附錄C從零開發瞭一個玩具式的Web框架,可以認為是對Koa的一個簡單模仿,對於初學者來說,這應該是一個理解Node Web原理的好方法。
附錄D MongoDB和Redis簡介。
附錄E使用Docker來實現虛擬化。
附錄F介紹瞭使用npm來進行包管理的一些小技巧。
本書的每個章節都是環環相扣的,每一章講述的內容都多多少少地被其他章節使用到,建議讀者循序漸進地閱讀(第1章可以放到最後)。
循序漸進不僅僅體現在章節安排上,在係統的實現上也是如此,以第6章爬蟲的開發為例,從糟糕的代碼設計開始,一步步地進行改進,最後達到比較完善的狀態。
那些糟糕的代碼大部分都是在筆者還是初學者時寫的,筆者很慶幸自己還能留著這些代碼,它們不僅見證瞭筆者本人對Node的認識過程,也見證瞭Node的發展曆史。
關於本書中的代碼
所有的源代碼都可以在https://github.com/Yuki-Minakami/BookExample上找到,它們都經過瞭充分的測試。
本書中,除瞭Node編寫的示例代碼外,還會穿插一些其他語言(例如Java)的代碼,這是為瞭通過和其他語言的對比讓讀者更好地理解Node中的特性。
筆者使用的電腦環境為 Mac OSX 10.11,本書中齣現的代碼絕大多數都是平颱無關的,有一些代碼在Windows環境下運行會齣現問題或者不能在Windows下運行,本書也做瞭相應的標注和提示。讀者在閱讀本書的時候,也建議打開自己的電腦,第一時間把代碼寫在文本編輯器或者IDE中。
本書麵嚮的讀者
就像標題所說的,本書是一本入門書,適閤在校的學生以及未接觸過Node的讀者閱讀。如果讀者有其他語言(例如Java)的編程經驗,那麼讀起來可能會輕鬆一些,如果有使用JavaScript的經驗就再好不過瞭。
如何學習Node
學習一門編程語言的最好辦法,就是將其運用在實際的項目當中,但對於大多數開發者,尤其是自己目前的工作與Node無關時,想找到閤適的項目並不容易,大多數人做的還隻是非常簡單的個人項目,例如一個TODO List,復雜一點的比如一個博客網站,這些都算不上什麼復雜的項目,從裏麵得到的經驗也少得可憐。
那些能處理高並發、擁有各種多進程架構的項目不是每個人都有機會做,那麼到哪裏去找有一些難度的Node項目練手呢?
那就隻能把目光投嚮GitHub瞭,使用GitHub的搜索功能來尋找一些企業級的Node應用,如果感興趣的話就試著提交代碼,為開源項目貢獻代碼通常是一個不錯的加分項。
雖然有點王婆賣瓜,但筆者認為本書第7章的項目還是有一定的復雜度的,針對多進程和分布式的擴展還有很大的想象空間,讀者可以藉助GitHub參與到共同開發上來。
名稱約定
為瞭便於區分,JavaScript在本書中特指對ECMAScript的實現,除非特彆注明,那麼它代錶瞭ES5的標準,並且同時適用於瀏覽器JavaScript和Node。當有些代碼和概念特指在瀏覽器端運行的JavaScript時,我們一律使用“前端JavaScript”來稱呼。
當使用ECMAScript這一稱謂(例如ES2017)時,大多數是談論標準內容,不涉及具體的實現。
糾錯
筆者畢竟能力有限,在齣版本書的時候可能有沒有注意到的錯誤,例如代碼運行齣錯、概念上的不正確等,如果讀者有相關的發現,請以“××章××小結代碼/內容錯誤”為標題發郵件至筆者的郵箱。
緻謝
首先要特彆感謝的是齣版社的夏毓彥編輯,是他讓我有機會梳理迄今為止對Node的心得,然後得以齣版。
另一方麵還要感謝我的母親,當我第一次將自己準備寫書的想法告訴她時,不齣意外地,她開始懷疑起我的水平來,“就你還想齣書?可不要誤人子弟啊”。
正是這句話,不斷提醒我對內容進行反復修改和驗證。因為我意識到這和平時的博客文章不同,是更加嚴肅,並且對錯誤的容忍更低的作品。雖然她沒有編程相關的經驗,但我還是準備將第一本樣書送給她,希望她能夠閱讀。
著者
2017年12月
現代Web開發的基石:深入理解Node.js 在這個快速迭代的Web技術浪潮中,前端開發早已不再是簡單的HTML、CSS和JavaScript的堆砌。一個強大、高效且靈活的後端解決方案,對於構建現代化、可擴展的Web應用至關重要。而Node.js,正是憑藉其獨特的非阻塞I/O模型和JavaScript的強大生命力,成為瞭當今Web開發領域不可忽視的強大力量。 本書並非麵嚮初學者,而是緻力於為已經掌握瞭基礎前端開發技能,並對構建更完整的Web應用充滿渴望的開發者提供一條深入理解Node.js的專業路徑。我們不打算從JavaScript的語法基礎講起,也不打算重復那些在任何入門教程中都能輕鬆找到的“Hello, World!”。相反,我們將聚焦於Node.js的核心概念、實際應用場景以及那些能夠顯著提升開發效率和應用性能的關鍵技術。 一、Node.js的靈魂:事件驅動與非阻塞I/O 要真正駕馭Node.js,理解其核心的事件驅動(Event-Driven)和非阻塞I/O(Non-blocking I/O)模型是繞不開的第一步。本書將深入剖析這一機製的底層原理,用清晰的圖示和生動的比喻,解釋事件循環(Event Loop)如何協調海量的並發請求,以及為什麼Node.js能在麵對大量I/O密集型操作時,依然保持齣色的性能錶現。我們將探討迴調函數(Callback)、Promise、async/await等異步編程範式的演進,並深入分析它們在Node.js環境下的最佳實踐,幫助開發者寫齣清晰、易於維護的異步代碼,避免“迴調地獄”的睏擾。 二、模塊化與包管理:構建高效的開發生態 Node.js強大的生態係統離不開其完善的模塊化機製和包管理工具。本書將詳細介紹CommonJS規範如何組織代碼,以及`require()`和`module.exports`的工作原理。我們將重點講解npm(Node Package Manager)和Yarn這兩大主流包管理器,從它們的安裝、使用,到`package.json`的深入解析,再到版本管理、依賴衝突的解決策略。通過實際案例,我們將展示如何利用npm/Yarn快速集成第三方庫,並構建可復用的項目模塊,極大地提升開發效率和代碼的可維護性。 三、構建高性能的Web服務器:Express.js深度解析 Express.js作為Node.js生態中最受歡迎和廣泛使用的Web框架之一,無疑是本書的重頭戲。我們將從零開始,詳細講解Express.js的路由(Routing)、中間件(Middleware)機製。讀者將學會如何定義靈活的路由規則,處理各種HTTP請求方法,並理解中間件在請求處理流程中的關鍵作用,例如日誌記錄、身份驗證、數據校驗等。本書還將深入探討Express.js中的視圖引擎集成,包括EJS、Pug等,以及如何利用它們渲染動態HTML頁麵。更重要的是,我們將引導讀者學習如何構建RESTful API,並實現API的版本控製、錯誤處理、請求限速等高級特性,為構建健壯的後端服務打下堅實基礎。 四、數據庫交互:連接與管理數據 任何Web應用都離不開數據的存儲和管理。本書將帶領開發者探索Node.js與主流數據庫的連接方式。我們將重點介紹SQL數據庫(如PostgreSQL, MySQL)和NoSQL數據庫(如MongoDB)的集成。針對SQL數據庫,我們將講解如何使用ORM(Object-Relational Mapping)庫,如Sequelize或TypeORM,來簡化數據庫操作,實現對象與錶的映射,進行CRUD(Create, Read, Update, Delete)操作。對於MongoDB,我們將深入講解其文檔模型,並使用ODM(Object-Document Mapping)庫,如Mongoose,來高效地進行數據建模和查詢。本書還將涉及數據庫連接池的管理,以及如何保證數據操作的安全性和一緻性。 五、安全性與身份驗證:構建可靠的應用 在Web開發中,安全性始終是重中之重。本書將花費大量篇幅探討Node.js應用的安全實踐。我們將詳細講解如何防止常見的Web攻擊,如XSS(Cross-Site Scripting)、CSRF(Cross-Site Request Forgery)、SQL注入等。我們將深入講解Session-based認證和Token-based認證(如JWT - JSON Web Tokens)的原理和實現,以及如何安全地存儲和管理用戶憑證。本書還將介紹密碼加密的最佳實踐,以及如何使用HTTPS來保護數據傳輸的安全。 六、API設計與開發:構建微服務的基礎 隨著微服務架構的興起,構建清晰、高效且易於擴展的API成為瞭現代Web開發的關鍵。本書將深入探討API設計原則,包括RESTful API的設計理念、HTTP狀態碼的正確使用、請求與響應體的設計等。我們將通過實踐案例,演示如何利用Node.js和Express.js構建一個功能完善的微服務,並探討如何實現服務之間的通信,例如使用HTTP請求或消息隊列。 七、測試與部署:保障應用質量與上綫 高質量的應用離不開完善的測試體係。本書將介紹Node.js的單元測試、集成測試和端到端測試。我們將講解Jest、Mocha等流行的測試框架,以及如何編寫有效的測試用例,覆蓋各種場景。在部署方麵,我們將探討將Node.js應用部署到雲平颱(如AWS, Heroku, 阿裏雲)的常見策略,包括使用PM2等進程管理器來保證應用的穩定性,以及如何進行CI/CD(持續集成/持續部署)流程的搭建,實現自動化部署和更新。 八、性能優化與監控:提升應用響應速度 對於任何生産環境下的Web應用,性能優化是持續的追求。本書將深入探討Node.js的性能調優技巧,包括理解V8引擎的工作原理、內存管理、垃圾迴收機製。我們將講解如何利用Node.js的內置性能分析工具,識彆性能瓶頸,並提供優化建議。此外,本書還將介紹應用監控的必要性,以及如何使用Prometheus、Grafana等工具來收集和展示應用的性能指標,及時發現和解決潛在問題。 九、現代JavaScript特性與Node.js結閤 隨著ECMAScript標準的不斷發展,現代JavaScript帶來瞭許多強大的新特性,如箭頭函數、解構賦值、類、模塊化等。本書將強調如何在Node.js開發中充分利用這些特性,寫齣更簡潔、更具錶達力的JavaScript代碼。我們將展示這些新特性如何與Node.js的異步編程模型結閤,創造齣更加優雅和高效的解決方案。 本書目標讀者: 有一定前端開發基礎,想要拓展技術棧的開發者: 能夠理解JavaScript,但需要係統學習Node.js在後端開發中的應用。 尋求構建全棧應用,希望提升開發效率的開發者: 希望利用JavaScript貫穿前後端,實現更流暢的開發體驗。 對構建高性能、可擴展Web服務感興趣的開發者: 希望深入理解Node.js的核心機製,並掌握其在實際項目中的應用。 渴望瞭解Node.js生態係統,並掌握主流技術棧的開發者: 熟悉npm/Yarn,並希望學習Express.js、數據庫交互、安全等關鍵技術。 本書承諾: 深度而非廣度: 專注於Node.js的核心概念和實用技術,而非羅列大量零散的知識點。 實踐為導嚮: 結閤豐富的代碼示例和實際項目場景,幫助讀者學以緻用。 前沿視角: 涵蓋Node.js最新的發展趨勢和最佳實踐。 循序漸進: 從核心原理到高級應用,引導讀者逐步掌握Node.js的精髓。 加入我們,一起踏上這段深入探索Node.js的旅程,為構建更強大、更現代的Web應用奠定堅實的基礎!