請停止Node.js在企業應用中爭鬥

banq發表於2014-03-26


這是來自Dave Banister的博文Blog,將反對NodeJS在企業中應用的陳舊觀點逐一批駁,這篇文章主要是針對微軟陣營的程式設計師。摘要如下,原文請點按標題:

1995年大約有40萬人在網際網路上,但到2011年有近45億。電腦已經變得如此之快,我的手機比我的第一個網站伺服器有更強的處理能力。網際網路連線提高了這麼多,購買任何媒體的複製(如電影光碟)似乎比較愚蠢。 Web服務現在已經是一個商業化網站必要的功能。彈性計算使得擴充套件縮放變得如此精妙。

隨著這些變化,網路的發展已經轉移。每次技術換擋,基礎客戶端技術必須適應,而我們現在正處於這樣一個換檔節點,這迫使大多數應用程式的功能轉移到瀏覽器中,這不是可能不可能的問題,如果你想跟上競爭,應該認為這是必要的。

在JavaScript過去的二十年中,JS框架、工具和模式不斷在進化和發展。JavaScript從一個只有必要時才使用的可以被褻瀆的語言已經演變到Web開發中的一個完全充滿活力的一等公民。

隨著Node.js近年來的興起,在伺服器端使用JavaScript似乎是一個很大的阻力,甚至更多的阻力來自Node.js自身。在我看來,這種阻力是基於不同程度的誤解,很多都是一些古老的觀點。在這篇文章中,我打算展示所有的反對在企業中使用Node.js的主要論點。

我不是一個JavaScript開發。我是一名軟體開發人員。 JavaScript不是我所選擇的語言,我在合適的地方會使用它,就像所有其他的語言一樣。我完全熟悉主流的SQL,當我編寫C/ C + +程式碼的時候。net走入了我的世界,我甚至使用一些內聯彙編,使用新的CPU指令只是為了好玩。我已經涉足ObjectC和Java原生移動應用程式,我想我可能是享受喜歡編寫正規表示式唯一的人。重要的是要明白,我不是一些JavaScript傳道者那樣掛羊頭賣狗肉。我只是基於近20年的開發經驗看到Node.JS在構建Web應用程式上的價值。

誤解:為什麼我們要使用其他伺服器?
首先, Node.js不是一個伺服器。這是一個阻止在在企業中應用的根本誤解。我用Node.js的每一天中,我很少將它作為一個伺服器使用。沒有JavaScript的提示prompt是無法執行NodeJS的,該提示prompt可以基於另一個shell的系統上。

將Node.js作為外殼shell,shell指令碼其實提供了Node.js究竟是什麼的更好的解釋。我覺得Node.js的指令碼更象bash或PowerShell指令碼。如果使用這些指令碼啟動起來一個Web伺服器,那麼這個指令碼就是一個Web伺服器。

我們將NodeJS看成指令碼而不是伺服器有不少優點。是什麼讓Node.js成為比其他的shell更好的替代?是NPM。NPM包管理器可以讓我在拉包,幾乎無所不能。這些模組包括資料訪問庫,編譯器,伺服器,以及其他一切。

其次, Node.js並不僅限於HTTP / S 它有TCP和UDP支援。人們已經建立了如DNS和SMTP伺服器等一些瘋狂的事情。這很重要,因為我不再去關心任何人在使用IIS實施DNS伺服器。只有這種級別的靈活性才能創造這麼多的選擇,這是當前其他企業伺服器的選擇無法比擬的。

第三, 帶有IS外掛Node.js是一個平臺。開箱即用, Node.js包含HTTP監聽者 ,但它不包含一個真正的伺服器。這讓開發人員編寫自己的伺服器,或者使用NPM來拉一把。在Node.js上一切工作方式相同。 Node.js所提供的簡約API提供了構建幾乎任何東西的工具。在巨大的包庫中提供了幾乎所有的東西的實現。

誤解:JS真的不像一個真正語言
avaScript已經長大了。在ECMA 6規範包括類,介面,和所有通常流行的物件導向語言相關的好東西。這些功能雖然是未來,但在此期間,TypeScript 已經提供了這些功能在編譯時的檢查。即使沒有這些功能, JavaScript開發人員都使用原型繼承。 JavaScript支援單元測試,依賴注入,錯誤處理,以及所有的其他企業真正關心的功能。

....

誤解:JS不能進行編譯檢查

JavaScript並沒有一個編譯器,所有不會進行錯誤檢查,但是靜態程式碼分析和單元測試是驗證你的程式碼更好的手段((banq注:IDE等提供了靜態程式碼分析,如Sublime)。
)

靜態程式碼分析應該彌補JavaScript基於語法編譯時的錯誤;單元測試彌補JavaScript基於程式碼中的錯誤測試。如果你認為編譯器輸出仍然是重要的,TypeScript的編譯器應該給你這些需求。

誤解:NodeJS是單執行緒
Node.js使用C編寫的libuv為I/O管理自己的執行緒,包括網路 檔案系統等,libuv 必要時會為I/O建立一個執行緒池,V*事件迴圈是另外一個單獨的執行緒,專門處於佇列中事件,這些事件資料對映到JS的可執行函式,這就是Node.JS的非同步I/O原理。

這個對於每個處理程式的單個V8事件迴圈,意味著Node.JS提供一個叢集的API,允許主Node.js程式生成子程式,這個叢集API也能用於跨程式通訊,每個程式都接受它自己的 V8事件迴圈,也就是擁有自己的javaScript執行緒,這就是傳統多執行緒能夠在Node.JS中實現原理。

Node.js有可擴充套件模組可以實現本地原生程式碼。原生程式碼可以生成執行緒。已經有模組提供產生的後臺和工作執行緒。

現在一個現代Web應用程式中,大多數的正常請求的時間都花在等待一個資料庫呼叫、REST API請求或檔案操作的完成。非同步I / O採用透過發出一個外部呼叫的不同方法,當呼叫完成,它就會被扔進事件迴圈。主執行緒就不會處於永遠等待。傳統的多執行緒技術有額外消耗,比如記憶體或上下文切換等。非同步I / O的方式是如此引人注目,非同步和等待的關鍵字將被引入到C# NET 4.5,非同步控制器將引入在ASP.NET MVC 4中。

這裡是Uber從傳統的LAMP堆疊切換到Node.JS的Uber報告,能看跨多核擴充套件叢集,也能夠透過基於雲的彈性計算擴充套件。

完,其他一些不重要的誤解可參考原文。

相關文章