最近去了新公司,又拾起了被我拋下許久的後端了,不過因為公司的需求,後端採用Nodejs,最近一直在學習Node.js,隨著逐漸深入的了解,發現真的Node.js能越來越變得熱門是有其存在的道理的。或許有人會說,Java作為後端語言一直隱隱有龍頭老大的姿勢,為何我們還要去學Node.js呢? Node.js究竟是什麼?它是新的語言還是新的框架,是新的工具抑或只是一個簡單的JavaScript檔?
相關推薦:《nodejs 教學》
#執行環境
我們眾所周知Java有一個稱作JRE的執行環境來使得java程式能夠順利運作。 JRE有一個稱為JVM的虛擬機器。 JVM有許多元件,如垃圾回收器(GC),即時(JIT)編譯器,解釋器,類別裝載器,執行緒管理器,異常處理器,用於在不同時間執行不同的任務。 JRE還有一系列的函式庫來幫助執行階段的Java程式。
我們為什麼要突然牽扯到JRE執行環境呢,其實正是為了與Node作比較,Node不是一種語言,也不是框架,更不是工具,它是運行JavaScript應用程序的運行時環境。 Node.js有一個稱為JavaScript Virtual Machine的虛擬機器。它為基於JavaScript的應用程式產生機器碼,以便在不同的平台上啟用它。這個虛擬機器就是Google的V8引擎,也有主要元件,如JIT和GC,分別用於執行任務,運行時編譯,和記憶體管理。
發展潛力
判斷Java和Node的發展潛力可能要從背後的生態社群和支援庫上切入,然而以Java為核心的傳統體係自然比不上Node這樣的新勢力,簡而言之, Java成熟龐大,Node迅捷而活躍。
Java其功能性和實用性自然不必多說,但是Java包含了大量的樣品代碼,擾亂了程序猿所想表達的意圖,就不如Java三大框架之一的spring,程式猿在使用spring的時候servlet,資料持久,以及構成系統的底層的東西,spring框架已經封裝好會幫助你處理這一切,我們只需要專注於寫業務層程式碼就足以。
但是在Spring中,子系統一個接一個,即使你犯最微小的錯誤,它都會用讓你崩潰的異常來懲罰你。可能緊接著你就會看到巨大的異常訊息。裡麵包含著一個你根本不知道的封裝好的方法,Spring做了許多工作來實作程式碼的功能。
這種程度的抽象顯然需要大量的邏輯,長長的異常資訊不一定是壞事,它指出了一個症狀:這需要多少記憶體和效能上的額外開銷? spring是怎麼執行的?框架需要解析方法名稱、猜測程式設計師的意圖、建構類似抽象語法樹的東西、產生SQL等等。
這些事情的額外開銷有多大?所以說使用Java來掩蓋複雜度並不會因此簡化,只會讓系統更複雜。 Java嚴格的型別檢查使得Java幫你避免許多類型的bug,因為不好的程式碼無法通過編譯。
Java的強型別的缺點就是太多樣化板程式碼。程式設計師要不斷進行類型轉換,程式設計師要花掉更多時間寫精確的程式碼,使用更多的樣板程式碼,以圖早期發現錯誤並改正。
而Node.js恰恰相反。執行緒會導致更複雜化的系統。所以Node.js採用輕量級,單執行緒的系統,利用了js的匿名函數進行非同步回調,你只需要簡單的使用匿名函數,也就是閉包。不需要搜尋正確的抽象接口,只需要寫下業務代碼,沒有任何冗餘。這就是使用Node.js的最大好處,不過非同步回呼自然也出現一個急需解決的問題:回呼陷阱。
在Node.js中,我們不斷嵌套回呼函數的同時,很容易就陷入回呼函數的陷阱中,每層巢狀都會讓程式碼更複雜,使得錯誤處理和結果處理更困難。一個相關的問題就是js語言不會幫助程式設計師適當地表達非同步執行。其實有些函式庫會使用Promise來簡化非同步操作,但是看起來我們把問題簡單化了,但是事實上程式碼層面更複雜化了,Promise用了許多樣板程式碼,掩蓋了程式設計師的真實意圖。
後來Node.js支援ES5與ES6,可以採用async/await函數重寫回呼函數。還是同樣的非同步結構,但使用了正常的循環結構來書寫。錯誤和結果處理的位置也很自然,程式碼更易於理解,更容易編寫,而且也可以輕鬆理解程式設計師的意圖。回調陷阱並不是用掩蓋複雜性的方式解決的。
相反,語言和範式的改變解決了回調陷阱的問題,同時也解決了過多樣板程式碼的問題。有了async函數,程式碼就更漂亮了。簡單化的解決方法,將Node.js的缺點轉換為了優點。但是JavaScript的類型很鬆散。而且在你書寫程式碼的時候不會進行報錯,許多類型不需要定義,通常也不需要用型別轉換。
因此程式碼更清晰易讀,但存在漏掉編碼錯誤的風險,只有在編譯的時候才會去檢查你語法以及邏輯是否有問題,所以在Node.js#中,為了更好的偵錯BUG,Node支援將程式分成不同的模組,因為有模組的存在,將錯誤發生的範圍縮小到某個範圍內,使得Node.js模組比較容易測試。
套件管理
Java最重要的問題之一就是沒有統一的套件管理系統,可能有人會和我說Maven.但是無論是用途、易用性還是功能上,Maven與Node.js的套件管理系統相比簡直是天壤之別。
npm 是Node.js 官方提供的套件管理工具,他已經變成了Node.js 套件的標準發布平台,用於Node.js 套件的發布、傳播、依賴控制。 npm 提供了命令列工具,讓你可以輕鬆下載、安裝、升級、刪除包,也可以讓你作為開發者發布並維護套件。
最好的地方是npm程式碼庫不只供Node.js使用,也可以讓前端工程師使用。所有的前端JavaScript函式庫都以npm套件的形式存在。許多前端工具如Webpack都是用Node.js寫的。
效能
Java#使用HotSpot這台超級虛擬機,它採用了多字節編譯策略。它會偵測經常執行的程式碼,一段程式碼執行次數越多,就會套用越多的最佳化。因此HotSpot效能相對來說更快。
Node底層選擇用c 和v8引擎來實現的,Node.js的事件驅動機制,這意味著要面對大規模的http請求,Node.js是憑藉事件驅動來完成的,效能部分是不用擔心的,而且很出色。而且,由於V8引擎的改進,Node.js的每次發布都會帶來巨大的效能提升。
雖然Node對高並發應用有著極高的效能,但是Node.js也有自己的缺點:
##Node不適合CPU密集型應用,因為CPU密集型應用如果有長時間的運算,不如大循環,將會導致CPU時間片不能釋放,使得後續的IO操作全部暫停。
Node只支援單核心CPU#,無法充分利用CPU資源。
Node是使用單進
程式設計入門! !
以上是Node.js和java後台伺服器的簡單比較的詳細內容。更多資訊請關注PHP中文網其他相關文章!