- 深入淺出Node.js
- 樸靈
- 3006字
- 2020-05-06 16:52:09
前言
2006年至今,我們時常可以看到JavaScript的新聞,剛開始只是JavaScript引擎性能的提升,到后來發(fā)現(xiàn)很多是來自HTML5和Node創(chuàng)造的奇跡。如果只看表面,很容易讓人感覺這又是一顆衛(wèi)星。這種現(xiàn)象讓人覺得不可信,所以出現(xiàn)了以下各種版本的誤解。
? Node肯定是幾個前端工程師在實(shí)驗(yàn)室里搗鼓出來的。
? 為了后端而后端,有意思嗎?
? 怎么又發(fā)明了一門新語言?
? JavaScript承擔(dān)的責(zé)任太重了。
? 直覺上,JavaScript不應(yīng)該運(yùn)行在后端。
? 前端工程師要逆襲了。
一方面,大家看到JavaScript在各個地方放出異彩,其他語言的開發(fā)者既羨慕它的成果,又擔(dān)心它對當(dāng)前所從事的語言造成沖擊;另一方面,人們還是有JavaScript只能做前端腳本的定勢思維。究其原因,還是因?yàn)槿藗內(nèi)狈v史觀層次上的認(rèn)知,所以會產(chǎn)生一些莫須有的惴惴不安。
1995年,JavaScript隨網(wǎng)景公司發(fā)布的Netscape Navigator 2.0發(fā)布,它最早命名為LiveScript,隨后更名為JavaScript。它出自如今的Mozilla公司的CTO——Brendan Eich之手,其產(chǎn)生來源于網(wǎng)景公司發(fā)布的Netscape Navigator瀏覽器需要一種腳本語言來協(xié)助瀏覽器做一些簡單的動態(tài)操作。當(dāng)時網(wǎng)景公司與Sun公司合作密切,不懂技術(shù)的管理層希望得到一個Java的腳本版語言,以期能像Java一樣風(fēng)靡。Brendan Eich原本進(jìn)入網(wǎng)景公司是希望做Scheme語言的開發(fā),但是卻接到了一個不喜歡的任務(wù),但迫于當(dāng)時形勢,不得不完成此事,于是JavaScript之父在10天的時間里倉促完成了JavaScript的設(shè)計,當(dāng)時的項(xiàng)目代號是Mocha,名字叫LiveScript。
這門語言除了看起來像Java外,本質(zhì)與Java語言相去甚遠(yuǎn),管理層期望的Java Script其實(shí)借鑒了C、Scheme、Self、Java的設(shè)計。盡管倉促,但是這門語言還是借鑒了其他語言的不少優(yōu)點(diǎn),如函數(shù)式、原型鏈繼承等。處于Java陰影下的這門語言獲得了它最終的名字:JavaScript。至今,仍然還有許多人分不清Java與JavaScript的關(guān)系,就像分不清雷鋒與雷峰塔一樣。
雖然JavaScript的產(chǎn)生與Netscape Navigator瀏覽器的需求有關(guān)系,但它并非只是設(shè)計出來用于瀏覽器前端的。早在1994年,網(wǎng)景公司就公布了其Netscape Enterprise Server中的一種服務(wù)器端腳本實(shí)現(xiàn),它的名字叫LiveWire,是最早的服務(wù)器端JavaScript,甚至早于瀏覽器中的JavaScript公布。對于這門圖靈完備的語言,網(wǎng)景早就開始嘗試將它用在后端。
隨后,微軟在第一次瀏覽器大戰(zhàn)時,于1996年發(fā)布的IE 3.0中也包含了它的腳本語言:JScript。基于商標(biāo)的原因,它叫JScript,但是與JavaScript兼容。在1997年年初,微軟在它的服務(wù)器IIS 3.0中也包含了JScript,這就是我們在ASP中能使用的腳本語言。鑒于微軟處處與網(wǎng)景針鋒相對,出于保護(hù)自己的目的,網(wǎng)景公司推進(jìn)了JavaScript的標(biāo)準(zhǔn)化進(jìn)程,于1996年11月將JavaScript遞交給ECMA國際標(biāo)準(zhǔn)組織,在1997年7月公布了第一個版本,是為ECMA-262號標(biāo)準(zhǔn),又稱ECMAScript。
可以看到,JavaScript一早就能運(yùn)行在前后端,但風(fēng)云變幻,在前后端各自的待遇卻不盡相同。伴隨著Java、PHP、.NET等服務(wù)器端技術(shù)的風(fēng)靡,與前端瀏覽器中的JavaScript越來越重要相比,服務(wù)器端JavaScript逐漸式微。只剩下Rhino、SpiderMonkey用于工具。
然而,這個世界是變化的。第一次瀏覽器大戰(zhàn)落幕后的JavaScript的世界有些平靜,但依然在萌生一些變化。Google對Ajax的應(yīng)用讓JavaScript變得越來越重要。Firefox的發(fā)布掀起了對IE的反攻,迎來了第二次瀏覽器大戰(zhàn),競爭令JavaScript的性能不斷提升,Chrome的加入令它高潮迭出。CommonJS規(guī)范的提出,不斷在完善JavaScript。ECMAScript標(biāo)準(zhǔn)的不斷推進(jìn),令語言更加精煉簡潔,不停地去蕪存菁。
瀏覽器端JavaScript在Web應(yīng)用中盛行,甚至讓人們忘掉了JavaScript可以在服務(wù)器端運(yùn)行這碼事。但是,服務(wù)器端JavaScript現(xiàn)在回來了,因?yàn)镹ode誕生了。Node的誕生離不開上述的歷史契機(jī),服務(wù)器端JavaScript在漫長的歷史中長期停滯留下空白,但Node重新將這個領(lǐng)域激活。Ryan Dahl基于對高性能Web服務(wù)器的探索,無意間促成了服務(wù)器端JavaScript領(lǐng)域的煥然一新。Node憑借V8的高性能和異步I/O模型將JavaScript重新推向了一個高潮。現(xiàn)在,Node不僅滿足JavaScript同時運(yùn)行在前后端,而且性能還十分高效。與傳統(tǒng)印象中的不同,它甚至可比于當(dāng)前的高效腳本語言。
奇妙的反應(yīng)還在繼續(xù),前后端要跨語言開發(fā)的現(xiàn)狀已經(jīng)開始改變,因?yàn)檎Z言堆棧的不同,開發(fā)者的分工也進(jìn)行了細(xì)分:前端工程師和后端工程師。專業(yè)技能因?yàn)榉止ざM(jìn),但也將技能變?yōu)閷@坪跚岸斯こ處煵荒苓M(jìn)行后端開發(fā),后端工程師搞不定前端開發(fā),猶如樹立的墻。但Node的出現(xiàn)令這種分工的界限又開始模糊了。同時一些后端工程師也關(guān)注到Node,他們甚至不關(guān)心前后端語言是否一致,而是赤裸裸地表示對Node高性能的垂涎,如實(shí)時、高并發(fā)等。
大量的前后端工程師加入了Node的開發(fā)陣營,GitHub上JavaScript是最活躍的開發(fā)語言,NPM社區(qū)第三方模塊恐怖的增長速度和下載量都昭示著這個過程不可逆,在這里吼一聲萬能的NPM,總能找到你需要的解決方案。很多不斷涌現(xiàn)的項(xiàng)目和創(chuàng)意都因?yàn)镹ode和前端開發(fā)能共用一種語言而獨(dú)特。換言之,Node的本意是提供一個高性能的面向網(wǎng)絡(luò)的執(zhí)行平臺,但無意間促成了JavaScript社區(qū)的繁榮,并進(jìn)而形成強(qiáng)大的生態(tài)系統(tǒng)。
本書目的
目前,還沒有一本書將Node自身結(jié)構(gòu)介紹出來,大多停留在Node介紹或者框架、庫的使用層面上,本書希望從不同的視角揭示Node自己內(nèi)在的特點(diǎn)和結(jié)構(gòu)。也許你已經(jīng)用過Node進(jìn)行相關(guān)的開發(fā),在使用了Node帶來的欣喜后,還能在閱讀本書時,發(fā)出一句“哦,原來Node是這樣的”,這就是本書的簡單寄望。
對于Node初學(xué)者,目前市面上也已經(jīng)有Node相關(guān)的入門書,它們可以快速地領(lǐng)你進(jìn)入Node開發(fā)之旅。在了解了這些基本過程后,想了解更多Node知識的好奇心,會領(lǐng)你來閱讀本書的。
閱讀建議
本書并非完全按照順序遞進(jìn)式介紹,如第2章是從代碼組織結(jié)構(gòu)看待Node,第3章是從運(yùn)行結(jié)構(gòu)看Node,第4章則是從編程結(jié)構(gòu)看Node,第5章則是Node中內(nèi)存結(jié)構(gòu)的揭示,第6章談及的是Node中的數(shù)據(jù)在I/O流中的結(jié)構(gòu)或狀態(tài),第7章是Node在網(wǎng)絡(luò)服務(wù)角度的介紹,第8章是Node在HTTP上的展現(xiàn),第9章討論了Node的單機(jī)集群結(jié)構(gòu),第10章是從單元測試和性能測試的角度去關(guān)注Node,第11章雖然已經(jīng)脫離了Node編碼的范疇,但是站在產(chǎn)品化的角度看待Node,也會頗有收獲。
下面是各章的詳細(xì)介紹。
第1章:這一章簡要介紹了Node,從中可以了解Node的發(fā)展歷程及其帶來的影響和價值。
第2章:這一章介紹了Node的模塊機(jī)制,從中可以了解到Node是如何實(shí)現(xiàn)CommonJS模塊和包規(guī)范的。在這一章中,我們詳細(xì)解釋了模塊在引用過程中的編譯、加載規(guī)則。另外,我們還能讀到更深度的關(guān)于Node自身源代碼的組織架構(gòu)。
第3章:這一章展示了在Node中我們將異步I/O作為主要設(shè)計理念的原因。另外,還會介紹到異步I/O的詳細(xì)實(shí)現(xiàn)過程。
第4章:這一章主要介紹異步編程,其中有常見的異步編程問題介紹,也有詳細(xì)的解決方案。在這一章中,我們可以接觸到Promise、事件、高階函數(shù)是如何進(jìn)行流程控制的。
第5章:這一章主要介紹了Node中的內(nèi)存控制,主要內(nèi)容有垃圾回收、內(nèi)存限制、查看內(nèi)存、內(nèi)存泄漏、大內(nèi)存應(yīng)用等細(xì)節(jié)。
第6章:這一章介紹了前端JavaScript里不能遇到的Buffer。由于Node中會涉及頻繁的網(wǎng)絡(luò)和磁盤I/O,處理字節(jié)流數(shù)據(jù)會是很常見的行為,這部分場景與純粹的前端開發(fā)完全不同。
第7章:這一章介紹了Node支持的TCP、UDP、HTTP編程,還附贈了WebSocket與TLS、HTTPS的介紹。
第8章:這一章介紹了構(gòu)建Web應(yīng)用的過程中用到的大多數(shù)技術(shù)細(xì)節(jié),如數(shù)據(jù)處理、路由、MVC、模板、RESTful等
第9章:這一章介紹了Node的多進(jìn)程技術(shù),以及如何借助多進(jìn)程的方式來提升應(yīng)用的可用性和性能。
第10章:這一章介紹了Node的單元測試和性能測試技巧。
第11章:“行百里者半九十”,完成產(chǎn)品開發(fā)的代碼編寫后,才完成了項(xiàng)目的第一步。這一章介紹了將Node產(chǎn)品化所需要注意到的細(xì)節(jié),如項(xiàng)目工程化、代碼部署、日志、性能、監(jiān)控報警、穩(wěn)定性、異構(gòu)共存等。
附錄A:詳細(xì)介紹了Node的安裝步驟。
附錄B:討論了Node的調(diào)試技巧。
附錄C:探討了團(tuán)隊實(shí)踐或多人協(xié)作過程中需要關(guān)注的編碼規(guī)范問題,它可以很好地規(guī)避一些低級的、明顯的錯誤。
附錄D:作為企業(yè)開發(fā)者,必須關(guān)注模塊倉庫的搭建管理。在這一章中,我們介紹了如何通過搭建私有NPM來解決企業(yè)隱私安全等方面的問題。
- Social Media Mining with R
- 無蘋果不生活 OS X Mountain Lion隨身寶典
- Ganglia系統(tǒng)監(jiān)控
- Implementing Azure DevOps Solutions
- Windows Phone應(yīng)用程序開發(fā)
- Instant Optimizing Embedded Systems using Busybox
- Android物聯(lián)網(wǎng)開發(fā)細(xì)致入門與最佳實(shí)踐
- 注冊表應(yīng)用完全DIY
- VMware Horizon View Essentials
- Linux應(yīng)用大全 基礎(chǔ)與管理
- Windows Server 2008組網(wǎng)技術(shù)與實(shí)訓(xùn)(第3版)
- Linux操作系統(tǒng)案例教程(第2版)
- Linux深度攻略
- Linux指令從初學(xué)到精通
- Building E-commerce Sites with Drupal Commerce Cookbook